summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/etc/privapp-permissions-platform.xml2
-rw-r--r--packages/Shell/AndroidManifest.xml2
-rw-r--r--services/core/java/com/android/server/AlarmManagerService.java75
3 files changed, 71 insertions, 8 deletions
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 8e76dd38aeb9..b4de3a3203cb 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -322,6 +322,8 @@ applications that come with the platform
<permission name="android.permission.SET_ANIMATION_SCALE"/>
<permission name="android.permission.SET_DEBUG_APP"/>
<permission name="android.permission.SET_PROCESS_LIMIT"/>
+ <permission name="android.permission.SET_TIME"/>
+ <permission name="android.permission.SET_TIME_ZONE"/>
<permission name="android.permission.SIGNAL_PERSISTENT_PROCESSES"/>
<permission name="android.permission.STOP_APP_SWITCHES"/>
<permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index d284bf9076e1..26cd0e48c29e 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -125,6 +125,8 @@
<uses-permission android:name="android.permission.MANAGE_AUTO_FILL" />
<uses-permission android:name="android.permission.NETWORK_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+ <uses-permission android:name="android.permission.SET_TIME" />
+ <uses-permission android:name="android.permission.SET_TIME_ZONE" />
<!-- Permission needed to rename bugreport notifications (so they're not shown as Shell) -->
<uses-permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" />
<!-- Permission needed to hold a wakelock in dumpstate.cpp (drop_root_user()) -->
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index d17ca7f9e77a..d066056145da 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -57,6 +57,9 @@ import android.os.ParcelableException;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ShellCallback;
+import android.os.ShellCommand;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
@@ -1369,6 +1372,17 @@ class AlarmManagerService extends SystemService {
}
}
+ boolean setTimeImpl(long millis) {
+ if (mNativeData == 0) {
+ Slog.w(TAG, "Not setting time since no alarm driver is available.");
+ return false;
+ }
+
+ synchronized (mLock) {
+ return setKernelTime(mNativeData, millis) == 0;
+ }
+ }
+
void setTimeZoneImpl(String tz) {
if (TextUtils.isEmpty(tz)) {
return;
@@ -1766,14 +1780,7 @@ class AlarmManagerService extends SystemService {
"android.permission.SET_TIME",
"setTime");
- if (mNativeData == 0) {
- Slog.w(TAG, "Not setting time since no alarm driver is available.");
- return false;
- }
-
- synchronized (mLock) {
- return setKernelTime(mNativeData, millis) == 0;
- }
+ return setTimeImpl(millis);
}
@Override
@@ -1836,6 +1843,13 @@ class AlarmManagerService extends SystemService {
dumpImpl(pw);
}
}
+
+ @Override
+ public void onShellCommand(FileDescriptor in, FileDescriptor out,
+ FileDescriptor err, String[] args, ShellCallback callback,
+ ResultReceiver resultReceiver) {
+ (new ShellCmd()).exec(this, in, out, err, args, callback, resultReceiver);
+ }
};
void dumpImpl(PrintWriter pw) {
@@ -4244,4 +4258,49 @@ class AlarmManagerService extends SystemService {
}
}
}
+
+ private class ShellCmd extends ShellCommand {
+
+ IAlarmManager getBinderService() {
+ return IAlarmManager.Stub.asInterface(mService);
+ }
+
+ @Override
+ public int onCommand(String cmd) {
+ if (cmd == null) {
+ return handleDefaultCommands(cmd);
+ }
+
+ final PrintWriter pw = getOutPrintWriter();
+ try {
+ switch (cmd) {
+ case "set-time":
+ final long millis = Long.parseLong(getNextArgRequired());
+ return (getBinderService().setTime(millis)) ? 0 : -1;
+ case "set-timezone":
+ final String tz = getNextArgRequired();
+ getBinderService().setTimeZone(tz);
+ return 0;
+ default:
+ return handleDefaultCommands(cmd);
+ }
+ } catch (Exception e) {
+ pw.println(e);
+ }
+ return -1;
+ }
+
+ @Override
+ public void onHelp() {
+ PrintWriter pw = getOutPrintWriter();
+ pw.println("Alarm manager service (alarm) commands:");
+ pw.println(" help");
+ pw.println(" Print this help text.");
+ pw.println(" set-time TIME");
+ pw.println(" Set the system clock time to TIME where TIME is milliseconds");
+ pw.println(" since the Epoch.");
+ pw.println(" set-timezone TZ");
+ pw.println(" Set the system timezone to TZ where TZ is an Olson id.");
+ }
+ }
}