Loading core/java/android/app/Activity.java +16 −0 Original line number Diff line number Diff line Loading @@ -5201,6 +5201,22 @@ public class Activity extends ContextThemeWrapper } } /** * Indication of whether this is the highest level activity in this task. Can be used to * determine whether an activity launched by this activity was placed in the same task or * another task. * * @return true if this is the topmost, non-finishing activity in its task. * @hide */ public boolean isTopOfTask() { try { return ActivityManagerNative.getDefault().isTopOfTask(mToken); } catch (RemoteException e) { return false; } } /** * Convert a translucent themed Activity {@link android.R.attr#windowIsTranslucent} to a * fullscreen opaque Activity. Loading core/java/android/app/ActivityManagerNative.java +26 −4 Original line number Diff line number Diff line Loading @@ -1546,6 +1546,15 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case IS_TOP_OF_TASK_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); final boolean isTopOfTask = isTopOfTask(token); reply.writeNoException(); reply.writeInt(isTopOfTask ? 1 : 0); return true; } case CONVERT_FROM_TRANSLUCENT_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); Loading Loading @@ -2129,7 +2138,7 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case START_LOCK_TASK_BY_CURRENT: { case START_LOCK_TASK_BY_CURRENT_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); startLockTaskModeOnCurrent(); reply.writeNoException(); Loading @@ -2143,7 +2152,7 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case STOP_LOCK_TASK_BY_CURRENT: { case STOP_LOCK_TASK_BY_CURRENT_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); stopLockTaskModeOnCurrent(); reply.writeNoException(); Loading Loading @@ -4182,6 +4191,19 @@ class ActivityManagerProxy implements IActivityManager return res; } public boolean isTopOfTask(IBinder token) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(token); mRemote.transact(IS_TOP_OF_TASK_TRANSACTION, data, reply, 0); reply.readException(); boolean res = reply.readInt() == 1; data.recycle(); reply.recycle(); return res; } public boolean isTopActivityImmersive() throws RemoteException { Parcel data = Parcel.obtain(); Loading Loading @@ -4930,7 +4952,7 @@ class ActivityManagerProxy implements IActivityManager Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); mRemote.transact(START_LOCK_TASK_BY_CURRENT, data, reply, 0); mRemote.transact(START_LOCK_TASK_BY_CURRENT_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); reply.recycle(); Loading @@ -4952,7 +4974,7 @@ class ActivityManagerProxy implements IActivityManager Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); mRemote.transact(STOP_LOCK_TASK_BY_CURRENT, data, reply, 0); mRemote.transact(STOP_LOCK_TASK_BY_CURRENT_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); reply.recycle(); Loading core/java/android/app/IActivityManager.java +8 −6 Original line number Diff line number Diff line Loading @@ -320,6 +320,7 @@ public interface IActivityManager extends IInterface { public void setImmersive(IBinder token, boolean immersive) throws RemoteException; public boolean isImmersive(IBinder token) throws RemoteException; public boolean isTopActivityImmersive() throws RemoteException; public boolean isTopOfTask(IBinder token) throws RemoteException; public void crashApplication(int uid, int initialPid, String packageName, String message) throws RemoteException; Loading Loading @@ -748,7 +749,8 @@ public interface IActivityManager extends IInterface { int START_VOICE_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+218; int GET_ACTIVITY_OPTIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+219; int GET_APP_TASKS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+220; int START_LOCK_TASK_BY_CURRENT = IBinder.FIRST_CALL_TRANSACTION+221; int STOP_LOCK_TASK_BY_CURRENT = IBinder.FIRST_CALL_TRANSACTION+222; int START_LOCK_TASK_BY_CURRENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+221; int STOP_LOCK_TASK_BY_CURRENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+222; int FINISH_VOICE_TASK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+223; int IS_TOP_OF_TASK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+224; } services/core/java/com/android/server/am/ActivityManagerService.java +13 −4 Original line number Diff line number Diff line Loading @@ -9437,6 +9437,17 @@ public final class ActivityManagerService extends ActivityManagerNative } } @Override public boolean isTopOfTask(IBinder token) { synchronized (this) { ActivityRecord r = ActivityRecord.isInStackLocked(token); if (r == null) { throw new IllegalArgumentException(); } return r.task.getTopActivity() == r; } } public final void enterSafeMode() { synchronized(this) { // It only makes sense to do this before the system is ready Loading Loading @@ -16538,13 +16549,11 @@ public final class ActivityManagerService extends ActivityManagerNative cleanUpApplicationRecordLocked(app, false, true, -1); mRemovedProcesses.remove(i); if (app.persistent) { if (app.persistent) { addAppLocked(app.info, false, null /* ABI override */); } } } } // Now update the oom adj for all processes. updateOomAdjLocked(); Loading
core/java/android/app/Activity.java +16 −0 Original line number Diff line number Diff line Loading @@ -5201,6 +5201,22 @@ public class Activity extends ContextThemeWrapper } } /** * Indication of whether this is the highest level activity in this task. Can be used to * determine whether an activity launched by this activity was placed in the same task or * another task. * * @return true if this is the topmost, non-finishing activity in its task. * @hide */ public boolean isTopOfTask() { try { return ActivityManagerNative.getDefault().isTopOfTask(mToken); } catch (RemoteException e) { return false; } } /** * Convert a translucent themed Activity {@link android.R.attr#windowIsTranslucent} to a * fullscreen opaque Activity. Loading
core/java/android/app/ActivityManagerNative.java +26 −4 Original line number Diff line number Diff line Loading @@ -1546,6 +1546,15 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case IS_TOP_OF_TASK_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); final boolean isTopOfTask = isTopOfTask(token); reply.writeNoException(); reply.writeInt(isTopOfTask ? 1 : 0); return true; } case CONVERT_FROM_TRANSLUCENT_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); Loading Loading @@ -2129,7 +2138,7 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case START_LOCK_TASK_BY_CURRENT: { case START_LOCK_TASK_BY_CURRENT_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); startLockTaskModeOnCurrent(); reply.writeNoException(); Loading @@ -2143,7 +2152,7 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case STOP_LOCK_TASK_BY_CURRENT: { case STOP_LOCK_TASK_BY_CURRENT_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); stopLockTaskModeOnCurrent(); reply.writeNoException(); Loading Loading @@ -4182,6 +4191,19 @@ class ActivityManagerProxy implements IActivityManager return res; } public boolean isTopOfTask(IBinder token) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(token); mRemote.transact(IS_TOP_OF_TASK_TRANSACTION, data, reply, 0); reply.readException(); boolean res = reply.readInt() == 1; data.recycle(); reply.recycle(); return res; } public boolean isTopActivityImmersive() throws RemoteException { Parcel data = Parcel.obtain(); Loading Loading @@ -4930,7 +4952,7 @@ class ActivityManagerProxy implements IActivityManager Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); mRemote.transact(START_LOCK_TASK_BY_CURRENT, data, reply, 0); mRemote.transact(START_LOCK_TASK_BY_CURRENT_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); reply.recycle(); Loading @@ -4952,7 +4974,7 @@ class ActivityManagerProxy implements IActivityManager Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); mRemote.transact(STOP_LOCK_TASK_BY_CURRENT, data, reply, 0); mRemote.transact(STOP_LOCK_TASK_BY_CURRENT_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); reply.recycle(); Loading
core/java/android/app/IActivityManager.java +8 −6 Original line number Diff line number Diff line Loading @@ -320,6 +320,7 @@ public interface IActivityManager extends IInterface { public void setImmersive(IBinder token, boolean immersive) throws RemoteException; public boolean isImmersive(IBinder token) throws RemoteException; public boolean isTopActivityImmersive() throws RemoteException; public boolean isTopOfTask(IBinder token) throws RemoteException; public void crashApplication(int uid, int initialPid, String packageName, String message) throws RemoteException; Loading Loading @@ -748,7 +749,8 @@ public interface IActivityManager extends IInterface { int START_VOICE_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+218; int GET_ACTIVITY_OPTIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+219; int GET_APP_TASKS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+220; int START_LOCK_TASK_BY_CURRENT = IBinder.FIRST_CALL_TRANSACTION+221; int STOP_LOCK_TASK_BY_CURRENT = IBinder.FIRST_CALL_TRANSACTION+222; int START_LOCK_TASK_BY_CURRENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+221; int STOP_LOCK_TASK_BY_CURRENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+222; int FINISH_VOICE_TASK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+223; int IS_TOP_OF_TASK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+224; }
services/core/java/com/android/server/am/ActivityManagerService.java +13 −4 Original line number Diff line number Diff line Loading @@ -9437,6 +9437,17 @@ public final class ActivityManagerService extends ActivityManagerNative } } @Override public boolean isTopOfTask(IBinder token) { synchronized (this) { ActivityRecord r = ActivityRecord.isInStackLocked(token); if (r == null) { throw new IllegalArgumentException(); } return r.task.getTopActivity() == r; } } public final void enterSafeMode() { synchronized(this) { // It only makes sense to do this before the system is ready Loading Loading @@ -16538,13 +16549,11 @@ public final class ActivityManagerService extends ActivityManagerNative cleanUpApplicationRecordLocked(app, false, true, -1); mRemovedProcesses.remove(i); if (app.persistent) { if (app.persistent) { addAppLocked(app.info, false, null /* ABI override */); } } } } // Now update the oom adj for all processes. updateOomAdjLocked();