Loading cmds/am/src/com/android/commands/am/Am.java +25 −15 Original line number Diff line number Diff line Loading @@ -194,18 +194,17 @@ public class Am { if (intent != null) { System.out.println("Starting: " + intent); try { intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // XXX should do something to determine the MIME type. int res = mAm.startActivity(null, intent, intent.getType(), null, 0, null, null, 0, false, mDebugOption); switch (res) { case IActivityManager.START_SUCCESS: break; case IActivityManager.START_CLASS_NOT_FOUND: System.err.println("Error type 3"); System.err.println("Error: Activity class " + intent.getComponent().toShortString() + " does not exist."); case IActivityManager.START_SWITCHES_CANCELED: System.err.println( "Warning: Activity not started because the " + " current activity is being kept for the user."); break; case IActivityManager.START_DELIVERED_TO_TOP: System.err.println( Loading @@ -213,25 +212,36 @@ public class Am { + "been delivered to currently running " + "top-most instance."); break; case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: case IActivityManager.START_RETURN_INTENT_TO_CALLER: System.err.println( "Error: Activity not started, you requested to " + "both forward and receive its result"); "Warning: Activity not started because intent " + "should be handled by the caller"); break; case IActivityManager.START_TASK_TO_FRONT: System.err.println( "Warning: Activity not started, its current " + "task has been brought to the front"); break; case IActivityManager.START_INTENT_NOT_RESOLVED: System.err.println( "Error: Activity not started, unable to " + "resolve " + intent.toString()); break; case IActivityManager.START_RETURN_INTENT_TO_CALLER: case IActivityManager.START_CLASS_NOT_FOUND: System.err.println("Error type 3"); System.err.println("Error: Activity class " + intent.getComponent().toShortString() + " does not exist."); break; case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: System.err.println( "Warning: Activity not started because intent " + "should be handled by the caller"); "Error: Activity not started, you requested to " + "both forward and receive its result"); break; case IActivityManager.START_TASK_TO_FRONT: case IActivityManager.START_PERMISSION_DENIED: System.err.println( "Warning: Activity not started, its current " + "task has been brought to the front"); "Error: Activity not started, you do not " + "have permission to access it."); break; default: System.err.println( Loading core/java/android/app/ActivityManagerNative.java +34 −0 Original line number Diff line number Diff line Loading @@ -998,6 +998,20 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case STOP_APP_SWITCHES_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); stopAppSwitches(); reply.writeNoException(); return true; } case RESUME_APP_SWITCHES_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); resumeAppSwitches(); reply.writeNoException(); return true; } case PEEK_SERVICE_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); Intent service = Intent.CREATOR.createFromParcel(data); Loading Loading @@ -2182,5 +2196,25 @@ class ActivityManagerProxy implements IActivityManager return res; } public void stopAppSwitches() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); mRemote.transact(STOP_APP_SWITCHES_TRANSACTION, data, reply, 0); reply.readException(); reply.recycle(); data.recycle(); } public void resumeAppSwitches() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); mRemote.transact(RESUME_APP_SWITCHES_TRANSACTION, data, reply, 0); reply.readException(); reply.recycle(); data.recycle(); } private IBinder mRemote; } core/java/android/app/IActivityManager.java +26 −0 Original line number Diff line number Diff line Loading @@ -44,9 +44,30 @@ import java.util.List; * {@hide} */ public interface IActivityManager extends IInterface { /** * Returned by startActivity() if the start request was canceled because * app switches are temporarily canceled to ensure the user's last request * (such as pressing home) is performed. */ public static final int START_SWITCHES_CANCELED = 4; /** * Returned by startActivity() if an activity wasn't really started, but * the given Intent was given to the existing top activity. */ public static final int START_DELIVERED_TO_TOP = 3; /** * Returned by startActivity() if an activity wasn't really started, but * a task was simply brought to the foreground. */ public static final int START_TASK_TO_FRONT = 2; /** * Returned by startActivity() if the caller asked that the Intent not * be executed if it is the recipient, and that is indeed the case. */ public static final int START_RETURN_INTENT_TO_CALLER = 1; /** * Activity was started successfully as normal. */ public static final int START_SUCCESS = 0; public static final int START_INTENT_NOT_RESOLVED = -1; public static final int START_CLASS_NOT_FOUND = -2; Loading Loading @@ -225,6 +246,9 @@ public interface IActivityManager extends IInterface { public boolean shutdown(int timeout) throws RemoteException; public void stopAppSwitches() throws RemoteException; public void resumeAppSwitches() throws RemoteException; /* * Private non-Binder interfaces */ Loading Loading @@ -371,4 +395,6 @@ public interface IActivityManager extends IInterface { int PEEK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+84; int PROFILE_CONTROL_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+85; int SHUTDOWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+86; int STOP_APP_SWITCHES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+87; int RESUME_APP_SWITCHES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+88; } core/res/AndroidManifest.xml +11 −3 Original line number Diff line number Diff line Loading @@ -803,14 +803,22 @@ android:description="@string/permdesc_runSetActivityWatcher" android:protectionLevel="signature" /> <!-- Allows an application to watch and control how activities are started globally in the system. Only for is in debugging (usually the monkey command). --> <!-- Allows an application to call the activity manager shutdown() API to put the higher-level system there into a shutdown state. --> <permission android:name="android.permission.SHUTDOWN" android:label="@string/permlab_shutdown" android:description="@string/permdesc_shutdown" android:protectionLevel="signature" /> <!-- Allows an application to tell the activity manager to temporarily stop application switches, putting it into a special mode that prevents applications from immediately switching away from some critical UI such as the home screen. --> <permission android:name="android.permission.STOP_APP_SWITCHES" android:label="@string/permlab_stopAppSwitches" android:description="@string/permdesc_stopAppSwitches" android:protectionLevel="signature" /> <!-- Allows an application to retrieve the current state of keys and switches. This is only for use by the system.--> <permission android:name="android.permission.READ_INPUT_STATE" Loading core/res/res/values/strings.xml +6 −0 Original line number Diff line number Diff line Loading @@ -479,6 +479,12 @@ <string name="permdesc_shutdown">Puts the activity manager into a shutdown state. Does not perform a complete shutdown.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_stopAppSwitches">prevent app switches</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_stopAppSwitches">Prevents the user from switching to another application.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_runSetActivityWatcher">monitor and control all application launching</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> Loading Loading
cmds/am/src/com/android/commands/am/Am.java +25 −15 Original line number Diff line number Diff line Loading @@ -194,18 +194,17 @@ public class Am { if (intent != null) { System.out.println("Starting: " + intent); try { intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // XXX should do something to determine the MIME type. int res = mAm.startActivity(null, intent, intent.getType(), null, 0, null, null, 0, false, mDebugOption); switch (res) { case IActivityManager.START_SUCCESS: break; case IActivityManager.START_CLASS_NOT_FOUND: System.err.println("Error type 3"); System.err.println("Error: Activity class " + intent.getComponent().toShortString() + " does not exist."); case IActivityManager.START_SWITCHES_CANCELED: System.err.println( "Warning: Activity not started because the " + " current activity is being kept for the user."); break; case IActivityManager.START_DELIVERED_TO_TOP: System.err.println( Loading @@ -213,25 +212,36 @@ public class Am { + "been delivered to currently running " + "top-most instance."); break; case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: case IActivityManager.START_RETURN_INTENT_TO_CALLER: System.err.println( "Error: Activity not started, you requested to " + "both forward and receive its result"); "Warning: Activity not started because intent " + "should be handled by the caller"); break; case IActivityManager.START_TASK_TO_FRONT: System.err.println( "Warning: Activity not started, its current " + "task has been brought to the front"); break; case IActivityManager.START_INTENT_NOT_RESOLVED: System.err.println( "Error: Activity not started, unable to " + "resolve " + intent.toString()); break; case IActivityManager.START_RETURN_INTENT_TO_CALLER: case IActivityManager.START_CLASS_NOT_FOUND: System.err.println("Error type 3"); System.err.println("Error: Activity class " + intent.getComponent().toShortString() + " does not exist."); break; case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: System.err.println( "Warning: Activity not started because intent " + "should be handled by the caller"); "Error: Activity not started, you requested to " + "both forward and receive its result"); break; case IActivityManager.START_TASK_TO_FRONT: case IActivityManager.START_PERMISSION_DENIED: System.err.println( "Warning: Activity not started, its current " + "task has been brought to the front"); "Error: Activity not started, you do not " + "have permission to access it."); break; default: System.err.println( Loading
core/java/android/app/ActivityManagerNative.java +34 −0 Original line number Diff line number Diff line Loading @@ -998,6 +998,20 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case STOP_APP_SWITCHES_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); stopAppSwitches(); reply.writeNoException(); return true; } case RESUME_APP_SWITCHES_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); resumeAppSwitches(); reply.writeNoException(); return true; } case PEEK_SERVICE_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); Intent service = Intent.CREATOR.createFromParcel(data); Loading Loading @@ -2182,5 +2196,25 @@ class ActivityManagerProxy implements IActivityManager return res; } public void stopAppSwitches() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); mRemote.transact(STOP_APP_SWITCHES_TRANSACTION, data, reply, 0); reply.readException(); reply.recycle(); data.recycle(); } public void resumeAppSwitches() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); mRemote.transact(RESUME_APP_SWITCHES_TRANSACTION, data, reply, 0); reply.readException(); reply.recycle(); data.recycle(); } private IBinder mRemote; }
core/java/android/app/IActivityManager.java +26 −0 Original line number Diff line number Diff line Loading @@ -44,9 +44,30 @@ import java.util.List; * {@hide} */ public interface IActivityManager extends IInterface { /** * Returned by startActivity() if the start request was canceled because * app switches are temporarily canceled to ensure the user's last request * (such as pressing home) is performed. */ public static final int START_SWITCHES_CANCELED = 4; /** * Returned by startActivity() if an activity wasn't really started, but * the given Intent was given to the existing top activity. */ public static final int START_DELIVERED_TO_TOP = 3; /** * Returned by startActivity() if an activity wasn't really started, but * a task was simply brought to the foreground. */ public static final int START_TASK_TO_FRONT = 2; /** * Returned by startActivity() if the caller asked that the Intent not * be executed if it is the recipient, and that is indeed the case. */ public static final int START_RETURN_INTENT_TO_CALLER = 1; /** * Activity was started successfully as normal. */ public static final int START_SUCCESS = 0; public static final int START_INTENT_NOT_RESOLVED = -1; public static final int START_CLASS_NOT_FOUND = -2; Loading Loading @@ -225,6 +246,9 @@ public interface IActivityManager extends IInterface { public boolean shutdown(int timeout) throws RemoteException; public void stopAppSwitches() throws RemoteException; public void resumeAppSwitches() throws RemoteException; /* * Private non-Binder interfaces */ Loading Loading @@ -371,4 +395,6 @@ public interface IActivityManager extends IInterface { int PEEK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+84; int PROFILE_CONTROL_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+85; int SHUTDOWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+86; int STOP_APP_SWITCHES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+87; int RESUME_APP_SWITCHES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+88; }
core/res/AndroidManifest.xml +11 −3 Original line number Diff line number Diff line Loading @@ -803,14 +803,22 @@ android:description="@string/permdesc_runSetActivityWatcher" android:protectionLevel="signature" /> <!-- Allows an application to watch and control how activities are started globally in the system. Only for is in debugging (usually the monkey command). --> <!-- Allows an application to call the activity manager shutdown() API to put the higher-level system there into a shutdown state. --> <permission android:name="android.permission.SHUTDOWN" android:label="@string/permlab_shutdown" android:description="@string/permdesc_shutdown" android:protectionLevel="signature" /> <!-- Allows an application to tell the activity manager to temporarily stop application switches, putting it into a special mode that prevents applications from immediately switching away from some critical UI such as the home screen. --> <permission android:name="android.permission.STOP_APP_SWITCHES" android:label="@string/permlab_stopAppSwitches" android:description="@string/permdesc_stopAppSwitches" android:protectionLevel="signature" /> <!-- Allows an application to retrieve the current state of keys and switches. This is only for use by the system.--> <permission android:name="android.permission.READ_INPUT_STATE" Loading
core/res/res/values/strings.xml +6 −0 Original line number Diff line number Diff line Loading @@ -479,6 +479,12 @@ <string name="permdesc_shutdown">Puts the activity manager into a shutdown state. Does not perform a complete shutdown.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_stopAppSwitches">prevent app switches</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_stopAppSwitches">Prevents the user from switching to another application.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_runSetActivityWatcher">monitor and control all application launching</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> Loading