From ad6eb2b2d50c0ac1297bde82ffd2054b029a0d86 Mon Sep 17 00:00:00 2001 From: Neil Fuller Date: Tue, 28 Jan 2020 10:55:15 +0000 Subject: [PATCH] Extract TimeDetector/TimeZoneDetector interfaces Extract TimeDetector/TimeZoneDetectors interfaces due to API council feedback. Bug: 148402378 Test: treehugger Change-Id: I22b12c8c5cc1cca9e3a788ef76c38b77198a3bce --- api/module-lib-current.txt | 4 +- .../android/app/SystemServiceRegistry.java | 6 +- .../app/timedetector/TimeDetector.java | 80 +++++-------------- .../app/timedetector/TimeDetectorImpl.java | 77 ++++++++++++++++++ .../timezonedetector/TimeZoneDetector.java | 57 +++---------- .../TimeZoneDetectorImpl.java | 65 +++++++++++++++ 6 files changed, 179 insertions(+), 110 deletions(-) create mode 100644 core/java/android/app/timedetector/TimeDetectorImpl.java create mode 100644 core/java/android/app/timezonedetector/TimeZoneDetectorImpl.java diff --git a/api/module-lib-current.txt b/api/module-lib-current.txt index c657e00496708..c9cee5f994472 100644 --- a/api/module-lib-current.txt +++ b/api/module-lib-current.txt @@ -19,7 +19,7 @@ package android.app.timedetector { method @NonNull public android.app.timedetector.PhoneTimeSuggestion.Builder setUtcTime(@Nullable android.os.TimestampedValue); } - public class TimeDetector { + public interface TimeDetector { method @RequiresPermission("android.permission.SUGGEST_PHONE_TIME_AND_ZONE") public void suggestPhoneTime(@NonNull android.app.timedetector.PhoneTimeSuggestion); } @@ -59,7 +59,7 @@ package android.app.timezonedetector { method @NonNull public android.app.timezonedetector.PhoneTimeZoneSuggestion.Builder setZoneId(@Nullable String); } - public class TimeZoneDetector { + public interface TimeZoneDetector { method @RequiresPermission("android.permission.SUGGEST_PHONE_TIME_AND_ZONE") public void suggestPhoneTimeZone(@NonNull android.app.timezonedetector.PhoneTimeZoneSuggestion); } diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 81f6d28db9fe8..2e144461c4447 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -30,8 +30,10 @@ import android.app.role.RoleControllerManager; import android.app.role.RoleManager; import android.app.slice.SliceManager; import android.app.timedetector.TimeDetector; +import android.app.timedetector.TimeDetectorImpl; import android.app.timezone.RulesManager; import android.app.timezonedetector.TimeZoneDetector; +import android.app.timezonedetector.TimeZoneDetectorImpl; import android.app.trust.TrustManager; import android.app.usage.IStorageStatsManager; import android.app.usage.IUsageStatsManager; @@ -1277,7 +1279,7 @@ final class SystemServiceRegistry { @Override public TimeDetector createService(ContextImpl ctx) throws ServiceNotFoundException { - return new TimeDetector(); + return new TimeDetectorImpl(); }}); registerService(Context.TIME_ZONE_DETECTOR_SERVICE, TimeZoneDetector.class, @@ -1285,7 +1287,7 @@ final class SystemServiceRegistry { @Override public TimeZoneDetector createService(ContextImpl ctx) throws ServiceNotFoundException { - return new TimeZoneDetector(); + return new TimeZoneDetectorImpl(); }}); registerService(Context.TELEPHONY_IMS_SERVICE, android.telephony.ims.ImsManager.class, diff --git a/core/java/android/app/timedetector/TimeDetector.java b/core/java/android/app/timedetector/TimeDetector.java index 7c29f017c02ba..2412fb3994edc 100644 --- a/core/java/android/app/timedetector/TimeDetector.java +++ b/core/java/android/app/timedetector/TimeDetector.java @@ -21,73 +21,24 @@ import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.os.ServiceManager.ServiceNotFoundException; import android.os.SystemClock; import android.os.TimestampedValue; -import android.util.Log; /** * The interface through which system components can send signals to the TimeDetectorService. * - *

This class is marked non-final for mockito. * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) @SystemService(Context.TIME_DETECTOR_SERVICE) -public class TimeDetector { - private static final String TAG = "timedetector.TimeDetector"; - private static final boolean DEBUG = false; - - private final ITimeDetectorService mITimeDetectorService; - - /** @hide */ - public TimeDetector() throws ServiceNotFoundException { - mITimeDetectorService = ITimeDetectorService.Stub.asInterface( - ServiceManager.getServiceOrThrow(Context.TIME_DETECTOR_SERVICE)); - } - - /** - * Suggests the current phone-signal derived time 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. - */ - @RequiresPermission(android.Manifest.permission.SUGGEST_PHONE_TIME_AND_ZONE) - public void suggestPhoneTime(@NonNull PhoneTimeSuggestion timeSuggestion) { - if (DEBUG) { - Log.d(TAG, "suggestPhoneTime called: " + timeSuggestion); - } - try { - mITimeDetectorService.suggestPhoneTime(timeSuggestion); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - - /** - * Suggests the user's manually entered current time to the detector. - * - * @hide - */ - @RequiresPermission(android.Manifest.permission.SUGGEST_MANUAL_TIME_AND_ZONE) - public void suggestManualTime(@NonNull ManualTimeSuggestion timeSuggestion) { - if (DEBUG) { - Log.d(TAG, "suggestManualTime called: " + timeSuggestion); - } - try { - mITimeDetectorService.suggestManualTime(timeSuggestion); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } +public interface TimeDetector { /** * A shared utility method to create a {@link ManualTimeSuggestion}. * * @hide */ - public static ManualTimeSuggestion createManualTimeSuggestion(long when, String why) { + static ManualTimeSuggestion createManualTimeSuggestion(long when, String why) { TimestampedValue utcTime = new TimestampedValue<>(SystemClock.elapsedRealtime(), when); ManualTimeSuggestion manualTimeSuggestion = new ManualTimeSuggestion(utcTime); @@ -95,20 +46,27 @@ public class TimeDetector { return manualTimeSuggestion; } + /** + * Suggests the current phone-signal derived time 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. + */ + @RequiresPermission(android.Manifest.permission.SUGGEST_PHONE_TIME_AND_ZONE) + void suggestPhoneTime(@NonNull PhoneTimeSuggestion timeSuggestion); + + /** + * Suggests the user's manually entered current time to the detector. + * + * @hide + */ + @RequiresPermission(android.Manifest.permission.SUGGEST_MANUAL_TIME_AND_ZONE) + void suggestManualTime(@NonNull ManualTimeSuggestion timeSuggestion); + /** * Suggests the time according to a network time source like NTP. * * @hide */ @RequiresPermission(android.Manifest.permission.SET_TIME) - public void suggestNetworkTime(NetworkTimeSuggestion timeSuggestion) { - if (DEBUG) { - Log.d(TAG, "suggestNetworkTime called: " + timeSuggestion); - } - try { - mITimeDetectorService.suggestNetworkTime(timeSuggestion); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } + void suggestNetworkTime(NetworkTimeSuggestion timeSuggestion); } diff --git a/core/java/android/app/timedetector/TimeDetectorImpl.java b/core/java/android/app/timedetector/TimeDetectorImpl.java new file mode 100644 index 0000000000000..1683817740c3d --- /dev/null +++ b/core/java/android/app/timedetector/TimeDetectorImpl.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.timedetector; + +import android.annotation.NonNull; +import android.content.Context; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.ServiceManager.ServiceNotFoundException; +import android.util.Log; + +/** + * The real implementation of {@link TimeDetector}. + * + * @hide + */ +public final class TimeDetectorImpl implements TimeDetector { + private static final String TAG = "timedetector.TimeDetector"; + private static final boolean DEBUG = false; + + private final ITimeDetectorService mITimeDetectorService; + + public TimeDetectorImpl() throws ServiceNotFoundException { + mITimeDetectorService = ITimeDetectorService.Stub.asInterface( + ServiceManager.getServiceOrThrow(Context.TIME_DETECTOR_SERVICE)); + } + + @Override + public void suggestPhoneTime(@NonNull PhoneTimeSuggestion timeSuggestion) { + if (DEBUG) { + Log.d(TAG, "suggestPhoneTime called: " + timeSuggestion); + } + try { + mITimeDetectorService.suggestPhoneTime(timeSuggestion); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + @Override + public void suggestManualTime(@NonNull ManualTimeSuggestion timeSuggestion) { + if (DEBUG) { + Log.d(TAG, "suggestManualTime called: " + timeSuggestion); + } + try { + mITimeDetectorService.suggestManualTime(timeSuggestion); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + @Override + public void suggestNetworkTime(NetworkTimeSuggestion timeSuggestion) { + if (DEBUG) { + Log.d(TAG, "suggestNetworkTime called: " + timeSuggestion); + } + try { + mITimeDetectorService.suggestNetworkTime(timeSuggestion); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } +} diff --git a/core/java/android/app/timezonedetector/TimeZoneDetector.java b/core/java/android/app/timezonedetector/TimeZoneDetector.java index 5b5f311264e3f..b4f608787d4a3 100644 --- a/core/java/android/app/timezonedetector/TimeZoneDetector.java +++ b/core/java/android/app/timezonedetector/TimeZoneDetector.java @@ -21,29 +21,25 @@ import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.os.ServiceManager.ServiceNotFoundException; -import android.util.Log; /** * The interface through which system components can send signals to the TimeZoneDetectorService. * - *

This class is non-final for mockito. * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) @SystemService(Context.TIME_ZONE_DETECTOR_SERVICE) -public class TimeZoneDetector { - private static final String TAG = "timezonedetector.TimeZoneDetector"; - private static final boolean DEBUG = false; +public interface TimeZoneDetector { - private final ITimeZoneDetectorService mITimeZoneDetectorService; - - /** @hide */ - public TimeZoneDetector() throws ServiceNotFoundException { - mITimeZoneDetectorService = ITimeZoneDetectorService.Stub.asInterface( - ServiceManager.getServiceOrThrow(Context.TIME_ZONE_DETECTOR_SERVICE)); + /** + * A shared utility method to create a {@link ManualTimeZoneSuggestion}. + * + * @hide + */ + static ManualTimeZoneSuggestion createManualTimeZoneSuggestion(String tzId, String debugInfo) { + ManualTimeZoneSuggestion suggestion = new ManualTimeZoneSuggestion(tzId); + suggestion.addDebugInfo(debugInfo); + return suggestion; } /** @@ -55,16 +51,7 @@ public class TimeZoneDetector { */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) @RequiresPermission(android.Manifest.permission.SUGGEST_PHONE_TIME_AND_ZONE) - public void suggestPhoneTimeZone(@NonNull PhoneTimeZoneSuggestion timeZoneSuggestion) { - if (DEBUG) { - Log.d(TAG, "suggestPhoneTimeZone called: " + timeZoneSuggestion); - } - try { - mITimeZoneDetectorService.suggestPhoneTimeZone(timeZoneSuggestion); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } + void suggestPhoneTimeZone(@NonNull PhoneTimeZoneSuggestion timeZoneSuggestion); /** * Suggests the current time zone, determined for the user's manually information, to the @@ -73,25 +60,5 @@ public class TimeZoneDetector { * @hide */ @RequiresPermission(android.Manifest.permission.SUGGEST_MANUAL_TIME_AND_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}. - * - * @hide - */ - public static ManualTimeZoneSuggestion createManualTimeZoneSuggestion(String tzId, String why) { - ManualTimeZoneSuggestion suggestion = new ManualTimeZoneSuggestion(tzId); - suggestion.addDebugInfo(why); - return suggestion; - } + void suggestManualTimeZone(@NonNull ManualTimeZoneSuggestion timeZoneSuggestion); } diff --git a/core/java/android/app/timezonedetector/TimeZoneDetectorImpl.java b/core/java/android/app/timezonedetector/TimeZoneDetectorImpl.java new file mode 100644 index 0000000000000..27b8374db172e --- /dev/null +++ b/core/java/android/app/timezonedetector/TimeZoneDetectorImpl.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.timezonedetector; + +import android.annotation.NonNull; +import android.content.Context; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.ServiceManager.ServiceNotFoundException; +import android.util.Log; + +/** + * The real implementation of {@link TimeZoneDetector}. + * + * @hide + */ +public final class TimeZoneDetectorImpl implements TimeZoneDetector { + private static final String TAG = "timezonedetector.TimeZoneDetector"; + private static final boolean DEBUG = false; + + private final ITimeZoneDetectorService mITimeZoneDetectorService; + + public TimeZoneDetectorImpl() throws ServiceNotFoundException { + mITimeZoneDetectorService = ITimeZoneDetectorService.Stub.asInterface( + ServiceManager.getServiceOrThrow(Context.TIME_ZONE_DETECTOR_SERVICE)); + } + + @Override + public void suggestPhoneTimeZone(@NonNull PhoneTimeZoneSuggestion timeZoneSuggestion) { + if (DEBUG) { + Log.d(TAG, "suggestPhoneTimeZone called: " + timeZoneSuggestion); + } + try { + mITimeZoneDetectorService.suggestPhoneTimeZone(timeZoneSuggestion); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + @Override + public void suggestManualTimeZone(@NonNull ManualTimeZoneSuggestion timeZoneSuggestion) { + if (DEBUG) { + Log.d(TAG, "suggestManualTimeZone called: " + timeZoneSuggestion); + } + try { + mITimeZoneDetectorService.suggestManualTimeZone(timeZoneSuggestion); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } +}