Merge "Add suggestManualTimeZoneSuggestion to the client" am: 63d5f12489

am: 2447fe6f69

Change-Id: I2ecb6991ee2fce6b4d79164f4fd7dd568042db4f
This commit is contained in:
Neil Fuller
2019-12-05 06:09:31 -08:00
committed by android-build-merger
5 changed files with 55 additions and 6 deletions

View File

@@ -17,6 +17,7 @@
package android.app.timezonedetector;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemService;
import android.content.Context;
import android.os.RemoteException;
@@ -26,10 +27,11 @@ import android.util.Log;
/**
* The interface through which system components can send signals to the TimeZoneDetectorService.
*
* @hide
*/
@SystemService(Context.TIME_ZONE_DETECTOR_SERVICE)
public final class TimeZoneDetector {
public class TimeZoneDetector {
private static final String TAG = "timezonedetector.TimeZoneDetector";
private static final boolean DEBUG = false;
@@ -41,10 +43,11 @@ public final class TimeZoneDetector {
}
/**
* Suggests the current time zone to the detector. The detector may ignore the signal if better
* signals are available such as those that come from more reliable sources or were
* determined more recently.
* Suggests the current time zone, determined using telephony signals, to the detector. The
* detector may ignore the signal based on system settings, whether better information is
* available, and so on.
*/
@RequiresPermission(android.Manifest.permission.SET_TIME_ZONE)
public void suggestPhoneTimeZone(@NonNull PhoneTimeZoneSuggestion timeZoneSuggestion) {
if (DEBUG) {
Log.d(TAG, "suggestPhoneTimeZone called: " + timeZoneSuggestion);
@@ -56,4 +59,28 @@ public final class TimeZoneDetector {
}
}
/**
* Suggests the current time zone, determined for the user's manually information, to the
* detector. The detector may ignore the signal based on system settings.
*/
@RequiresPermission(android.Manifest.permission.SET_TIME_ZONE)
public void suggestManualTimeZone(@NonNull ManualTimeZoneSuggestion timeZoneSuggestion) {
if (DEBUG) {
Log.d(TAG, "suggestManualTimeZone called: " + timeZoneSuggestion);
}
try {
mITimeZoneDetectorService.suggestManualTimeZone(timeZoneSuggestion);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
* A shared utility method to create a {@link ManualTimeZoneSuggestion}.
*/
public static ManualTimeZoneSuggestion createManualTimeZoneSuggestion(String tzId, String why) {
ManualTimeZoneSuggestion suggestion = new ManualTimeZoneSuggestion(tzId);
suggestion.addDebugInfo(why);
return suggestion;
}
}

View File

@@ -135,6 +135,8 @@ import android.app.admin.SystemUpdatePolicy;
import android.app.backup.IBackupManager;
import android.app.timedetector.ManualTimeSuggestion;
import android.app.timedetector.TimeDetector;
import android.app.timezonedetector.ManualTimeZoneSuggestion;
import android.app.timezonedetector.TimeZoneDetector;
import android.app.trust.TrustManager;
import android.app.usage.UsageStatsManagerInternal;
import android.content.ActivityNotFoundException;
@@ -1956,6 +1958,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return mContext.getSystemService(TimeDetector.class);
}
TimeZoneDetector getTimeZoneDetector() {
return mContext.getSystemService(TimeZoneDetector.class);
}
ConnectivityManager getConnectivityManager() {
return mContext.getSystemService(ConnectivityManager.class);
}
@@ -10880,8 +10886,11 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
if (mInjector.settingsGlobalGetInt(Global.AUTO_TIME_ZONE, 0) == 1) {
return false;
}
ManualTimeZoneSuggestion manualTimeZoneSuggestion =
TimeZoneDetector.createManualTimeZoneSuggestion(
timeZone, "DevicePolicyManagerService: setTimeZone");
mInjector.binderWithCleanCallingIdentity(() ->
mInjector.getAlarmManager().setTimeZone(timeZone));
mInjector.getTimeZoneDetector().suggestManualTimeZone(manualTimeZoneSuggestion));
return true;
}

View File

@@ -23,6 +23,7 @@ import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.backup.IBackupManager;
import android.app.timedetector.TimeDetector;
import android.app.timezonedetector.TimeZoneDetector;
import android.app.usage.UsageStatsManagerInternal;
import android.content.Context;
import android.content.Intent;
@@ -222,6 +223,11 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi
return services.timeDetector;
}
@Override
TimeZoneDetector getTimeZoneDetector() {
return services.timeZoneDetector;
}
@Override
LockPatternUtils newLockPatternUtils() {
return services.lockPatternUtils;

View File

@@ -64,6 +64,8 @@ import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.app.admin.PasswordMetrics;
import android.app.timedetector.ManualTimeSuggestion;
import android.app.timezonedetector.ManualTimeZoneSuggestion;
import android.app.timezonedetector.TimeZoneDetector;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Intent;
@@ -3506,7 +3508,9 @@ public class DevicePolicyManagerTest extends DpmTestBase {
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
setupDeviceOwner();
dpm.setTimeZone(admin1, "Asia/Shanghai");
verify(getServices().alarmManager).setTimeZone("Asia/Shanghai");
ManualTimeZoneSuggestion suggestion =
TimeZoneDetector.createManualTimeZoneSuggestion("Asia/Shanghai", "Test debug info");
verify(getServices().timeZoneDetector).suggestManualTimeZone(suggestion);
}
public void testSetTimeZoneFailWithPO() throws Exception {

View File

@@ -32,6 +32,7 @@ import android.app.IActivityTaskManager;
import android.app.NotificationManager;
import android.app.backup.IBackupManager;
import android.app.timedetector.TimeDetector;
import android.app.timezonedetector.TimeZoneDetector;
import android.app.usage.UsageStatsManagerInternal;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
@@ -109,6 +110,7 @@ public class MockSystemServices {
public final AccountManager accountManager;
public final AlarmManager alarmManager;
public final TimeDetector timeDetector;
public final TimeZoneDetector timeZoneDetector;
public final KeyChain.KeyChainConnection keyChainConnection;
/** Note this is a partial mock, not a real mock. */
public final PackageManager packageManager;
@@ -149,6 +151,7 @@ public class MockSystemServices {
accountManager = mock(AccountManager.class);
alarmManager = mock(AlarmManager.class);
timeDetector = mock(TimeDetector.class);
timeZoneDetector = mock(TimeZoneDetector.class);
keyChainConnection = mock(KeyChain.KeyChainConnection.class, RETURNS_DEEP_STUBS);
// Package manager is huge, so we use a partial mock instead.