Fix app uninstalling/stopping possible in screen pinning mode

Bug: 135604684
Test: maunal & robotest
Change-Id: I96eddb11ff32c6c46915682eb58857be7d24ed99
This commit is contained in:
Stanley Wang
2019-07-08 17:59:35 +08:00
parent 9848b293b0
commit 161c359508
2 changed files with 43 additions and 10 deletions

View File

@@ -19,6 +19,7 @@ package com.android.settings.applications.appinfo;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums;
import android.content.BroadcastReceiver;
@@ -182,6 +183,10 @@ public class AppInfoDashboardFragment extends DashboardFragment
super.onCreate(icicle);
mFinishing = false;
final Activity activity = getActivity();
if (isLockTaskModePinned(activity)) {
finishActivity(activity);
return;
}
mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
mPm = activity.getPackageManager();
@@ -192,7 +197,6 @@ public class AppInfoDashboardFragment extends DashboardFragment
return;
}
startListeningToPackageRemove();
setHasOptionsMenu(true);
}
@@ -314,9 +318,8 @@ public class AppInfoDashboardFragment extends DashboardFragment
@VisibleForTesting
boolean ensurePackageInfoAvailable(Activity activity) {
if (mPackageInfo == null) {
mFinishing = true;
Log.w(TAG, "Package info not available. Is this package already uninstalled?");
activity.finishAndRemoveTask();
finishActivity(activity);
return false;
}
return true;
@@ -331,14 +334,28 @@ public class AppInfoDashboardFragment extends DashboardFragment
@VisibleForTesting
boolean ensureDisplayableModule(Activity activity) {
if (AppUtils.isHiddenSystemModule(activity.getApplicationContext(), mPackageName)) {
mFinishing = true;
Log.w(TAG, "Package is hidden module, exiting: " + mPackageName);
activity.finishAndRemoveTask();
finishActivity(activity);
return false;
}
return true;
}
/**
* Check the state of device lock task mode.
*
* @return true if the device lock task mode pinned.
*/
@VisibleForTesting
boolean isLockTaskModePinned(Activity activity) {
ActivityManager activityManager = activity.getSystemService(ActivityManager.class);
if (activityManager.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_PINNED) {
Log.w(TAG, "Device lock task mode pinned.");
return true;
}
return false;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
@@ -637,6 +654,11 @@ public class AppInfoDashboardFragment extends DashboardFragment
getContext().unregisterReceiver(mPackageRemovedReceiver);
}
private void finishActivity(Activity activity) {
mFinishing = true;
activity.finishAndRemoveTask();
}
@VisibleForTesting
final BroadcastReceiver mPackageRemovedReceiver = new BroadcastReceiver() {
@Override

View File

@@ -33,6 +33,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.Intent;
@@ -86,6 +87,8 @@ public final class AppInfoDashboardFragmentTest {
private DevicePolicyManager mDevicePolicyManager;
@Mock
private PackageManager mPackageManager;
@Mock
private ActivityManager mActivityManager;
private AppInfoDashboardFragment mFragment;
private Context mShadowContext;
@@ -93,11 +96,13 @@ public final class AppInfoDashboardFragmentTest {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mShadowContext = RuntimeEnvironment.application;
mShadowContext = spy(RuntimeEnvironment.application);
mFragment = spy(new AppInfoDashboardFragment());
doReturn(mActivity).when(mFragment).getActivity();
doReturn(mShadowContext).when(mFragment).getContext();
doReturn(mPackageManager).when(mActivity).getPackageManager();
doReturn(mShadowContext).when(mActivity).getApplicationContext();
doReturn(mActivityManager).when(mActivity).getSystemService(ActivityManager.class);
when(mUserManager.isAdminUser()).thenReturn(true);
ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
@@ -202,7 +207,6 @@ public final class AppInfoDashboardFragmentTest {
ShadowAppUtils.addHiddenModule(PACKAGE_NAME);
ReflectionHelpers.setField(mFragment, "mPackageName", PACKAGE_NAME);
assertThat(mFragment.ensureDisplayableModule(mActivity)).isFalse();
}
@@ -214,6 +218,14 @@ public final class AppInfoDashboardFragmentTest {
assertThat(mFragment.ensureDisplayableModule(mActivity)).isTrue();
}
@Test
public void isLockTaskModePinned_pinned_shouldReturnTrue() {
doReturn(ActivityManager.LOCK_TASK_MODE_PINNED).when(
mActivityManager).getLockTaskModeState();
assertThat(mFragment.isLockTaskModePinned(mActivity)).isTrue();
}
@Test
public void createPreference_hasNoPackageInfo_shouldSkip() {
ReflectionHelpers.setField(mFragment, "mPackageInfo", null);
@@ -267,9 +279,8 @@ public final class AppInfoDashboardFragmentTest {
public void onActivityResult_uninstalledUpdates_shouldInvalidateOptionsMenu() {
doReturn(true).when(mFragment).refreshUi();
mFragment
.onActivityResult(AppInfoDashboardFragment.REQUEST_UNINSTALL, 0,
mock(Intent.class));
mFragment.onActivityResult(AppInfoDashboardFragment.REQUEST_UNINSTALL, 0,
mock(Intent.class));
verify(mActivity).invalidateOptionsMenu();
}