Merge "Do not override finish activity behavior on back event" into udc-dev

This commit is contained in:
Louis Chang
2023-04-10 00:23:19 +00:00
committed by Android (Google) Code Review
2 changed files with 22 additions and 34 deletions

View File

@@ -78,8 +78,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ParceledListSlice;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.os.Binder;
import android.os.Bundle;
@@ -1645,18 +1643,15 @@ class ActivityClientController extends IActivityClientController.Stub {
launchedFromHome = root.isLaunchSourceType(ActivityRecord.LAUNCH_SOURCE_TYPE_HOME);
}
// If the activity is one of the main entry points for the application, then we should
// If the activity was launched directly from the home screen, then we should
// refrain from finishing the activity and instead move it to the back to keep it in
// memory. The requirements for this are:
// 1. The activity is the last running activity in the task.
// 2. The current activity is the base activity for the task.
// 3. a. If the activity was launched by the home process, we trust that its intent
// was resolved, so we check if the it is a main intent for the application.
// b. Otherwise, we query Package Manager to verify whether the activity is a
// launcher activity for the application.
// 3. The activity was launched by the home process, and is one of the main entry
// points for the application.
if (baseActivityIntent != null && isLastRunningActivity
&& ((launchedFromHome && ActivityRecord.isMainIntent(baseActivityIntent))
|| isLauncherActivity(baseActivityIntent.getComponent()))) {
&& launchedFromHome && ActivityRecord.isMainIntent(baseActivityIntent)) {
moveActivityTaskToBack(token, true /* nonRoot */);
return;
}
@@ -1668,31 +1663,6 @@ class ActivityClientController extends IActivityClientController.Stub {
}
}
/**
* Queries PackageManager to see if the given activity is one of the main entry point for the
* application. This should not be called with the WM lock held.
*/
@SuppressWarnings("unchecked")
private boolean isLauncherActivity(@NonNull ComponentName activity) {
final Intent queryIntent = new Intent(Intent.ACTION_MAIN);
queryIntent.addCategory(Intent.CATEGORY_LAUNCHER);
queryIntent.setPackage(activity.getPackageName());
try {
final ParceledListSlice<ResolveInfo> resolved =
mService.getPackageManager().queryIntentActivities(
queryIntent, null, 0, mContext.getUserId());
if (resolved == null) return false;
for (final ResolveInfo ri : resolved.getList()) {
if (ri.getComponentInfo().getComponentName().equals(activity)) {
return true;
}
}
} catch (RemoteException e) {
Slog.e(TAG, "Failed to query intent activities", e);
}
return false;
}
@Override
public void enableTaskLocaleOverride(IBinder token) {
if (UserHandle.getAppId(Binder.getCallingUid()) != SYSTEM_UID) {

View File

@@ -83,6 +83,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.server.wm.ActivityRecord.FINISH_RESULT_CANCELLED;
import static com.android.server.wm.ActivityRecord.FINISH_RESULT_REMOVED;
import static com.android.server.wm.ActivityRecord.FINISH_RESULT_REQUESTED;
import static com.android.server.wm.ActivityRecord.LAUNCH_SOURCE_TYPE_HOME;
import static com.android.server.wm.ActivityRecord.State.DESTROYED;
import static com.android.server.wm.ActivityRecord.State.DESTROYING;
import static com.android.server.wm.ActivityRecord.State.FINISHING;
@@ -3688,6 +3689,23 @@ public class ActivityRecordTests extends WindowTestsBase {
assertTrue(activity.inTransition());
}
/**
* Verifies the task is moved to back when back pressed if the root activity was originally
* started from Launcher.
*/
@Test
public void testMoveTaskToBackWhenStartedFromLauncher() {
final Task task = createTask(mDisplayContent);
final ActivityRecord ar = createActivityRecord(task);
task.realActivity = ar.mActivityComponent;
ar.intent.setAction(Intent.ACTION_MAIN);
ar.intent.addCategory(Intent.CATEGORY_LAUNCHER);
doReturn(true).when(ar).isLaunchSourceType(eq(LAUNCH_SOURCE_TYPE_HOME));
mAtm.mActivityClientController.onBackPressed(ar.token, null /* callback */);
verify(task).moveTaskToBack(any());
}
private ICompatCameraControlCallback getCompatCameraControlCallback() {
return new ICompatCameraControlCallback.Stub() {
@Override