Skip to content
Snippets Groups Projects
Commit b557907f authored by Neil Fuller's avatar Neil Fuller
Browse files

Minimum viable TimeDetectorService

This is a do-nothing TimeDetectorService 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:TimeDetectorServiceTest

Test: build / boot
Test: See above
Merged-In: I9e4eac70b944441f34491315cd1ce7fa2b9ae150
Change-Id: I9e4eac70b944441f34491315cd1ce7fa2b9ae150
(cherry picked from commit feeee682)
parent 20e243d6
No related branches found
No related tags found
No related merge requests found
......@@ -97,6 +97,7 @@ java_library {
"core/java/android/app/backup/IRestoreObserver.aidl",
"core/java/android/app/backup/IRestoreSession.aidl",
"core/java/android/app/backup/ISelectBackupTransportCallback.aidl",
"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/usage/ICacheQuotaService.aidl",
......
......@@ -22,6 +22,7 @@ import android.app.admin.DevicePolicyManager;
import android.app.admin.IDevicePolicyManager;
import android.app.job.IJobScheduler;
import android.app.job.JobScheduler;
import android.app.timedetector.TimeDetector;
import android.app.timezone.RulesManager;
import android.app.trust.TrustManager;
import android.app.usage.IStorageStatsManager;
......@@ -905,6 +906,14 @@ final class SystemServiceRegistry {
public RulesManager createService(ContextImpl ctx) {
return new RulesManager(ctx.getOuterContext());
}});
registerService(Context.TIME_DETECTOR_SERVICE, TimeDetector.class,
new CachedServiceFetcher<TimeDetector>() {
@Override
public TimeDetector createService(ContextImpl ctx)
throws ServiceNotFoundException {
return new TimeDetector();
}});
}
/**
......
/*
* 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.timedetector;
/**
* System private API to comunicate with time detector service.
*
* <p>Used by parts of the Android system with signals associated with the device's time to provide
* information to the Time Detector Service.
*
* <p>Use the {@link android.app.timedetector.TimeDetector} class rather than going through
* this Binder interface directly. See {@link android.app.timedetector.TimeDetectorService} for
* more complete documentation.
*
*
* {@hide}
*/
interface ITimeDetectorService {
void stubbedCall();
}
/*
* 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.timedetector;
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 TimeDetectorService.
* @hide
*/
@SystemService(Context.TIME_DETECTOR_SERVICE)
public final class TimeDetector {
private static final String TAG = "timedetector.TimeDetector";
private static final boolean DEBUG = false;
private final ITimeDetectorService mITimeDetectorService;
public TimeDetector() throws ServiceNotFoundException {
mITimeDetectorService = ITimeDetectorService.Stub.asInterface(
ServiceManager.getServiceOrThrow(Context.TIME_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 {
mITimeDetectorService.stubbedCall();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
......@@ -3019,7 +3019,8 @@ public abstract class Context {
//@hide: CONTEXTHUB_SERVICE,
SYSTEM_HEALTH_SERVICE,
//@hide: INCIDENT_SERVICE,
COMPANION_DEVICE_SERVICE
COMPANION_DEVICE_SERVICE,
//@hide: TIME_DETECTOR_SERVICE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ServiceName {}
......@@ -4096,6 +4097,15 @@ public abstract class Context {
@SystemApi
public static final String SECURE_ELEMENT_SERVICE = "secure_element";
/**
* Use with {@link #getSystemService(String)} to retrieve an
* {@link android.app.timedetector.ITimeDetectorService}.
* @hide
*
* @see #getSystemService(String)
*/
public static final String TIME_DETECTOR_SERVICE = "time_detector";
/**
* Determine whether the given permission is allowed for a particular
* process and user ID running in the system.
......
/*
* 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.timedetector;
import com.android.internal.util.DumpUtils;
import com.android.server.SystemService;
import android.app.timedetector.ITimeDetectorService;
import android.content.Context;
import android.util.Slog;
import java.io.FileDescriptor;
import java.io.PrintWriter;
public final class TimeDetectorService extends ITimeDetectorService.Stub {
private static final String TAG = "timedetector.TimeDetectorService";
public static class Lifecycle extends SystemService {
public Lifecycle(Context context) {
super(context);
}
@Override
public void onStart() {
TimeDetectorService service = TimeDetectorService.create(getContext());
// Publish the binder service so it can be accessed from other (appropriately
// permissioned) processes.
publishBinderService(Context.TIME_DETECTOR_SERVICE, service);
}
}
private final Context mContext;
private static TimeDetectorService create(Context context) {
return new TimeDetectorService(context);
}
public TimeDetectorService(Context context) {
mContext = context;
}
@Override
public void stubbedCall() {
// Empty call for initial tests.
Slog.d(TAG, "stubbedCall() called");
// TODO(nfuller): Remove when there are real methods.
}
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
// TODO(nfuller): Implement when there is state.
}
}
\ No newline at end of file
......@@ -204,6 +204,8 @@ public final class SystemServer {
"com.android.server.autofill.AutofillManagerService";
private static final String TIME_ZONE_RULES_MANAGER_SERVICE_CLASS =
"com.android.server.timezone.RulesManagerService$Lifecycle";
private static final String TIME_DETECTOR_SERVICE_CLASS =
"com.android.server.timedetector.TimeDetectorService$Lifecycle";
private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
......@@ -1201,6 +1203,14 @@ public final class SystemServer {
traceEnd();
}
traceBeginAndSlog("StartTimeDetectorService");
try {
mSystemServiceManager.startService(TIME_DETECTOR_SERVICE_CLASS);
} catch (Throwable e) {
reportWtf("starting StartTimeDetectorService service", e);
}
traceEnd();
if (!disableNonCoreServices && !disableSearchManager) {
traceBeginAndSlog("StartSearchManagerService");
try {
......
/*
* 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.timedetector;
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 TimeDetectorService}.
*/
@RunWith(AndroidJUnit4.class)
public class TimeDetectorServiceTest {
private TimeDetectorService mTimeDetectorService;
@Before
public void setUp() {
final Context context = InstrumentationRegistry.getContext();
mTimeDetectorService = new TimeDetectorService(context);
}
@Test
public void testStubbedCall() {
mTimeDetectorService.stubbedCall();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment