diff options
| author | 2018-06-19 12:53:47 +0100 | |
|---|---|---|
| committer | 2018-06-21 09:30:34 +0000 | |
| commit | cccc48d0fe07349e1804dd7803db604d37a6d450 (patch) | |
| tree | 5074de619835716126f01e71c1e5f55dd5559cdd | |
| parent | 3b0eba44994cf35b743a09cba351427a1f700c5f (diff) | |
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
Merged-In: I565fb5dd2f18b7aac2e5779d346bfe69e9da02af
Change-Id: I565fb5dd2f18b7aac2e5779d346bfe69e9da02af
8 files changed, 232 insertions, 0 deletions
diff --git a/Android.bp b/Android.bp index 773c9b74cb28..f11b6fe0e13c 100644 --- a/Android.bp +++ b/Android.bp @@ -100,6 +100,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 aa1738dc1d97..26ea06854b89 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -24,6 +24,7 @@ import android.app.job.IJobScheduler; import android.app.job.JobScheduler; 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; @@ -914,6 +915,13 @@ final class SystemServiceRegistry { throws ServiceNotFoundException { return new TimeDetector(); }}); + registerService(Context.TIME_ZONE_DETECTOR_SERVICE, TimeZoneDetector.class, + new CachedServiceFetcher<TimeZoneDetector>() { + @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. + * + * <p>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. + * + * <p>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 da3e7cb2f815..9c4767212c6c 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -3021,6 +3021,7 @@ public abstract class Context { //@hide: INCIDENT_SERVICE, COMPANION_DEVICE_SERVICE, //@hide: TIME_DETECTOR_SERVICE, + //@hide: TIME_ZONE_DETECTOR_SERVICE, }) @Retention(RetentionPolicy.SOURCE) public @interface ServiceName {} @@ -4107,6 +4108,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 58e77e8c078f..c523c7ee6fee 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -206,6 +206,8 @@ public final class SystemServer { "com.android.server.timezone.RulesManagerService$Lifecycle"; 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"; @@ -1211,6 +1213,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 (!disableNonCoreServices && !disableSearchManager) { 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(); + } +} |