From 7fb88c3928b6fef1f3d559ea23468ccd1379bd49 Mon Sep 17 00:00:00 2001 From: Neil Fuller Date: Tue, 19 Jun 2018 12:53:47 +0100 Subject: [PATCH] Minimum viable TimeZoneDetectorService This is a do-nothing TimeZoneDetectorService that can be populated in following commits. A temporary method has been added so the service has one method. Unit tests can be run with: atest FrameworksServicesTests:TimeZoneDetectorServiceTest Test: build / boot Test: See above Change-Id: I565fb5dd2f18b7aac2e5779d346bfe69e9da02af --- Android.bp | 1 + core/java/android/app/SystemServiceRegistry.java | 8 +++ .../timezonedetector/ITimeZoneDetectorService.aidl | 34 +++++++++++ .../app/timezonedetector/TimeZoneDetector.java | 57 ++++++++++++++++++ core/java/android/content/Context.java | 10 ++++ .../timezonedetector/TimeZoneDetectorService.java | 67 ++++++++++++++++++++++ services/java/com/android/server/SystemServer.java | 10 ++++ .../TimeZoneDetectorServiceTest.java | 45 +++++++++++++++ 8 files changed, 232 insertions(+) create mode 100644 core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl create mode 100644 core/java/android/app/timezonedetector/TimeZoneDetector.java create mode 100644 services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java create mode 100644 services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java diff --git a/Android.bp b/Android.bp index 4d2e5e1cb0f5..6bf8e268908c 100644 --- a/Android.bp +++ b/Android.bp @@ -104,6 +104,7 @@ java_library { "core/java/android/app/timedetector/ITimeDetectorService.aidl", "core/java/android/app/timezone/ICallback.aidl", "core/java/android/app/timezone/IRulesManager.aidl", + "core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl", "core/java/android/app/usage/ICacheQuotaService.aidl", "core/java/android/app/usage/IStorageStatsManager.aidl", "core/java/android/app/usage/IUsageStatsManager.aidl", diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index e5f143ce8930..aae311ac5000 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -26,6 +26,7 @@ import android.app.job.JobScheduler; import android.app.slice.SliceManager; import android.app.timedetector.TimeDetector; import android.app.timezone.RulesManager; +import android.app.timezonedetector.TimeZoneDetector; import android.app.trust.TrustManager; import android.app.usage.IStorageStatsManager; import android.app.usage.IUsageStatsManager; @@ -1015,6 +1016,13 @@ final class SystemServiceRegistry { throws ServiceNotFoundException { return new TimeDetector(); }}); + registerService(Context.TIME_ZONE_DETECTOR_SERVICE, TimeZoneDetector.class, + new CachedServiceFetcher() { + @Override + public TimeZoneDetector createService(ContextImpl ctx) + throws ServiceNotFoundException { + return new TimeZoneDetector(); + }}); } /** diff --git a/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl b/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl new file mode 100644 index 000000000000..ef2cbab137dc --- /dev/null +++ b/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2018 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; + +/** + * System private API to comunicate with time zone detector service. + * + *

Used by parts of the Android system with signals associated with the device's time zone to + * provide information to the Time Zone Detector Service. + * + *

Use the {@link android.app.timezonedetector.TimeZoneDetector} class rather than going through + * this Binder interface directly. See {@link android.app.timezonedetector.TimeZoneDetectorService} + * for more complete documentation. + * + * + * {@hide} + */ +interface ITimeZoneDetectorService { + void stubbedCall(); +} diff --git a/core/java/android/app/timezonedetector/TimeZoneDetector.java b/core/java/android/app/timezonedetector/TimeZoneDetector.java new file mode 100644 index 000000000000..be3c7649a486 --- /dev/null +++ b/core/java/android/app/timezonedetector/TimeZoneDetector.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2018 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.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. + * @hide + */ +@SystemService(Context.TIME_ZONE_DETECTOR_SERVICE) +public final class TimeZoneDetector { + + private static final String TAG = "timezonedetector.TimeZoneDetector"; + private static final boolean DEBUG = false; + + private final ITimeZoneDetectorService mITimeZoneDetectorService; + + public TimeZoneDetector() throws ServiceNotFoundException { + mITimeZoneDetectorService = ITimeZoneDetectorService.Stub.asInterface( + ServiceManager.getServiceOrThrow(Context.TIME_ZONE_DETECTOR_SERVICE)); + + } + /** + * Does nothing. + * TODO: Remove this when the service implementation is built out. + */ + public void stubbedCall() { + if (DEBUG) { + Log.d(TAG, "stubbedCall called"); + } + try { + mITimeZoneDetectorService.stubbedCall(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } +} diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index c0cfb90e6676..0d4300fae5a4 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -3060,6 +3060,7 @@ public abstract class Context { CROSS_PROFILE_APPS_SERVICE, //@hide: SYSTEM_UPDATE_SERVICE, //@hide: TIME_DETECTOR_SERVICE, + //@hide: TIME_ZONE_DETECTOR_SERVICE, }) @Retention(RetentionPolicy.SOURCE) public @interface ServiceName {} @@ -4231,6 +4232,15 @@ public abstract class Context { public static final String TIME_DETECTOR_SERVICE = "time_detector"; /** + * Use with {@link #getSystemService(String)} to retrieve an + * {@link android.app.timezonedetector.ITimeZoneDetectorService}. + * @hide + * + * @see #getSystemService(String) + */ + public static final String TIME_ZONE_DETECTOR_SERVICE = "time_zone_detector"; + + /** * Determine whether the given permission is allowed for a particular * process and user ID running in the system. * diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java new file mode 100644 index 000000000000..5f71b0b3a59a --- /dev/null +++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2018 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 com.android.server.timezonedetector; + +import com.android.internal.util.DumpUtils; +import com.android.server.SystemService; +import android.app.timezonedetector.ITimeZoneDetectorService; +import android.content.Context; +import android.util.Slog; +import java.io.FileDescriptor; +import java.io.PrintWriter; + +public final class TimeZoneDetectorService extends ITimeZoneDetectorService.Stub { + private static final String TAG = "timezonedetector.TimeZoneDetectorService"; + + public static class Lifecycle extends SystemService { + + public Lifecycle(Context context) { + super(context); + } + + @Override + public void onStart() { + TimeZoneDetectorService service = TimeZoneDetectorService.create(getContext()); + // Publish the binder service so it can be accessed from other (appropriately + // permissioned) processes. + publishBinderService(Context.TIME_ZONE_DETECTOR_SERVICE, service); + } + } + + private final Context mContext; + + private static TimeZoneDetectorService create(Context context) { + return new TimeZoneDetectorService(context); + } + + public TimeZoneDetectorService(Context context) { + mContext = context; + } + + @Override + public void stubbedCall() { + // Empty call for initial tests. + Slog.d(TAG, "stubbedCall() called"); + // TODO: Remove when there are real methods. + } + + @Override + protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; + // TODO: Implement when there is state. + } +} diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 2811f711b74d..ad8884f06bb6 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -232,6 +232,8 @@ public final class SystemServer { "com.android.internal.car.CarServiceHelperService"; private static final String TIME_DETECTOR_SERVICE_CLASS = "com.android.server.timedetector.TimeDetectorService$Lifecycle"; + private static final String TIME_ZONE_DETECTOR_SERVICE_CLASS = + "com.android.server.timezonedetector.TimeZoneDetectorService$Lifecycle"; private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst"; @@ -1251,6 +1253,14 @@ public final class SystemServer { } traceEnd(); + traceBeginAndSlog("StartTimeZoneDetectorService"); + try { + mSystemServiceManager.startService(TIME_ZONE_DETECTOR_SERVICE_CLASS); + } catch (Throwable e) { + reportWtf("starting StartTimeZoneDetectorService service", e); + } + traceEnd(); + if (!isWatch) { traceBeginAndSlog("StartSearchManagerService"); try { diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java new file mode 100644 index 000000000000..19d31cfafc35 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2018 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 com.android.server.timezonedetector; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Unit tests for the {@link TimeZoneDetectorService}. + */ +@RunWith(AndroidJUnit4.class) +public class TimeZoneDetectorServiceTest { + + private TimeZoneDetectorService mTimeZoneDetectorService; + + @Before + public void setUp() { + final Context context = InstrumentationRegistry.getContext(); + mTimeZoneDetectorService = new TimeZoneDetectorService(context); + } + + @Test + public void testStubbedCall() { + mTimeZoneDetectorService.stubbedCall(); + } +} -- 2.11.0