diff options
5 files changed, 54 insertions, 4 deletions
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java index 20ac8d83ebad..5c9fd51d606d 100644 --- a/cmds/am/src/com/android/commands/am/Am.java +++ b/cmds/am/src/com/android/commands/am/Am.java @@ -163,6 +163,7 @@ public class Am extends BaseCommand { " am task drag-task-test <TASK_ID> <STEP_SIZE> [DELAY_MS] \n" + " am task size-task-test <TASK_ID> <STEP_SIZE> [DELAY_MS] \n" + " am get-config\n" + + " am suppress-resize-config-changes <true|false>\n" + " am set-inactive [--user <USER_ID>] <PACKAGE> true|false\n" + " am get-inactive [--user <USER_ID>] <PACKAGE>\n" + " am send-trim-memory [--user <USER_ID>] <PROCESS>\n" + @@ -326,6 +327,8 @@ public class Am extends BaseCommand { "\n" + "am get-config: retrieve the configuration and any recent configurations\n" + " of the device.\n" + + "am suppress-resize-config-changes: suppresses configuration changes due to\n" + + " user resizing an activity/task.\n" + "\n" + "am set-inactive: sets the inactive state of an app.\n" + "\n" + @@ -453,6 +456,8 @@ public class Am extends BaseCommand { runTask(); } else if (op.equals("get-config")) { runGetConfig(); + } else if (op.equals("suppress-resize-config-changes")) { + runSuppressResizeConfigChanges(); } else if (op.equals("set-inactive")) { runSetInactive(); } else if (op.equals("get-inactive")) { @@ -2606,6 +2611,16 @@ public class Am extends BaseCommand { } } + private void runSuppressResizeConfigChanges() throws Exception { + boolean suppress = Boolean.valueOf(nextArgRequired()); + + try { + mAm.suppressResizeConfigChanges(suppress); + } catch (RemoteException e) { + System.err.println("Error suppressing resize config changes: " + e); + } + } + private void runSetInactive() throws Exception { int userId = UserHandle.USER_CURRENT; diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 3864a4bba1f9..cb1a89fd6601 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2682,6 +2682,13 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reportSizeConfigurations(token, horizontal, vertical); return true; } + case SUPPRESS_RESIZE_CONFIG_CHANGES_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + final boolean suppress = data.readInt() == 1; + suppressResizeConfigChanges(suppress); + reply.writeNoException(); + return true; + } } return super.onTransact(code, data, reply, flags); @@ -6216,5 +6223,17 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } + @Override + public void suppressResizeConfigChanges(boolean suppress) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeInt(suppress ? 1 : 0); + mRemote.transact(SUPPRESS_RESIZE_CONFIG_CHANGES_TRANSACTION, data, reply, 0); + reply.readException(); + data.recycle(); + reply.recycle(); + } + private IBinder mRemote; } diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 2180bcc1e4b9..478fdd14e093 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -535,6 +535,8 @@ public interface IActivityManager extends IInterface { public int getActivityStackId(IBinder token) throws RemoteException; public void moveActivityToStack(IBinder token, int stackId) throws RemoteException; + public void suppressResizeConfigChanges(boolean suppress) throws RemoteException; + /* * Private non-Binder interfaces */ @@ -891,4 +893,5 @@ public interface IActivityManager extends IInterface { int MOVE_ACTIVITY_TO_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 344; int REPORT_SIZE_CONFIGURATIONS = IBinder.FIRST_CALL_TRANSACTION + 345; int MOVE_TASK_TO_DOCKED_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 346; + int SUPPRESS_RESIZE_CONFIG_CHANGES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 347; } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 07a7af46e265..bd10c63edbda 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -994,6 +994,8 @@ public final class ActivityManagerService extends ActivityManagerNative */ int mConfigurationSeq = 0; + boolean mSuppressResizeConfigChanges = false; + /** * Hardware-reported OpenGLES version. */ @@ -17515,6 +17517,15 @@ public final class ActivityManagerService extends ActivityManagerNative } @Override + public void suppressResizeConfigChanges(boolean suppress) throws RemoteException { + enforceCallingPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS, + "suppressResizeConfigChanges()"); + synchronized (this) { + mSuppressResizeConfigChanges = suppress; + } + } + + @Override public void updatePersistentConfiguration(Configuration values) { enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, "updateConfiguration()"); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 9809c2e4906c..5d106dce294b 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -4181,8 +4181,12 @@ final class ActivityStack { | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE | ActivityInfo.CONFIG_ORIENTATION)) == 0; } - private boolean relaunchActivityLocked(ActivityRecord r, int changes, boolean andResume, - boolean preserveWindow) { + private void relaunchActivityLocked( + ActivityRecord r, int changes, boolean andResume, boolean preserveWindow) { + if (mService.mSuppressResizeConfigChanges && preserveWindow) { + return; + } + List<ResultInfo> results = null; List<ReferrerIntent> newIntents = null; if (andResume) { @@ -4222,8 +4226,6 @@ final class ActivityStack { mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); r.state = ActivityState.PAUSED; } - - return true; } boolean willActivityBeVisibleLocked(IBinder token) { |