Fix app uninstalling/stopping possible in screen pinning mode
Bug: 135604684 Test: maunal & robotest Change-Id: I96eddb11ff32c6c46915682eb58857be7d24ed99
This commit is contained in:
@@ -19,6 +19,7 @@ package com.android.settings.applications.appinfo;
|
|||||||
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.app.ActivityManager;
|
||||||
import android.app.admin.DevicePolicyManager;
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.app.settings.SettingsEnums;
|
import android.app.settings.SettingsEnums;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
@@ -182,6 +183,10 @@ public class AppInfoDashboardFragment extends DashboardFragment
|
|||||||
super.onCreate(icicle);
|
super.onCreate(icicle);
|
||||||
mFinishing = false;
|
mFinishing = false;
|
||||||
final Activity activity = getActivity();
|
final Activity activity = getActivity();
|
||||||
|
if (isLockTaskModePinned(activity)) {
|
||||||
|
finishActivity(activity);
|
||||||
|
return;
|
||||||
|
}
|
||||||
mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
|
mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||||
mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
|
mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
|
||||||
mPm = activity.getPackageManager();
|
mPm = activity.getPackageManager();
|
||||||
@@ -192,7 +197,6 @@ public class AppInfoDashboardFragment extends DashboardFragment
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
startListeningToPackageRemove();
|
startListeningToPackageRemove();
|
||||||
|
|
||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -314,9 +318,8 @@ public class AppInfoDashboardFragment extends DashboardFragment
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
boolean ensurePackageInfoAvailable(Activity activity) {
|
boolean ensurePackageInfoAvailable(Activity activity) {
|
||||||
if (mPackageInfo == null) {
|
if (mPackageInfo == null) {
|
||||||
mFinishing = true;
|
|
||||||
Log.w(TAG, "Package info not available. Is this package already uninstalled?");
|
Log.w(TAG, "Package info not available. Is this package already uninstalled?");
|
||||||
activity.finishAndRemoveTask();
|
finishActivity(activity);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -331,14 +334,28 @@ public class AppInfoDashboardFragment extends DashboardFragment
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
boolean ensureDisplayableModule(Activity activity) {
|
boolean ensureDisplayableModule(Activity activity) {
|
||||||
if (AppUtils.isHiddenSystemModule(activity.getApplicationContext(), mPackageName)) {
|
if (AppUtils.isHiddenSystemModule(activity.getApplicationContext(), mPackageName)) {
|
||||||
mFinishing = true;
|
|
||||||
Log.w(TAG, "Package is hidden module, exiting: " + mPackageName);
|
Log.w(TAG, "Package is hidden module, exiting: " + mPackageName);
|
||||||
activity.finishAndRemoveTask();
|
finishActivity(activity);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
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
|
@Override
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
@@ -637,6 +654,11 @@ public class AppInfoDashboardFragment extends DashboardFragment
|
|||||||
getContext().unregisterReceiver(mPackageRemovedReceiver);
|
getContext().unregisterReceiver(mPackageRemovedReceiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void finishActivity(Activity activity) {
|
||||||
|
mFinishing = true;
|
||||||
|
activity.finishAndRemoveTask();
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
final BroadcastReceiver mPackageRemovedReceiver = new BroadcastReceiver() {
|
final BroadcastReceiver mPackageRemovedReceiver = new BroadcastReceiver() {
|
||||||
@Override
|
@Override
|
||||||
|
@@ -33,6 +33,7 @@ import static org.mockito.Mockito.times;
|
|||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.ActivityManager;
|
||||||
import android.app.admin.DevicePolicyManager;
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -86,6 +87,8 @@ public final class AppInfoDashboardFragmentTest {
|
|||||||
private DevicePolicyManager mDevicePolicyManager;
|
private DevicePolicyManager mDevicePolicyManager;
|
||||||
@Mock
|
@Mock
|
||||||
private PackageManager mPackageManager;
|
private PackageManager mPackageManager;
|
||||||
|
@Mock
|
||||||
|
private ActivityManager mActivityManager;
|
||||||
|
|
||||||
private AppInfoDashboardFragment mFragment;
|
private AppInfoDashboardFragment mFragment;
|
||||||
private Context mShadowContext;
|
private Context mShadowContext;
|
||||||
@@ -93,11 +96,13 @@ public final class AppInfoDashboardFragmentTest {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
mShadowContext = RuntimeEnvironment.application;
|
mShadowContext = spy(RuntimeEnvironment.application);
|
||||||
mFragment = spy(new AppInfoDashboardFragment());
|
mFragment = spy(new AppInfoDashboardFragment());
|
||||||
doReturn(mActivity).when(mFragment).getActivity();
|
doReturn(mActivity).when(mFragment).getActivity();
|
||||||
doReturn(mShadowContext).when(mFragment).getContext();
|
doReturn(mShadowContext).when(mFragment).getContext();
|
||||||
doReturn(mPackageManager).when(mActivity).getPackageManager();
|
doReturn(mPackageManager).when(mActivity).getPackageManager();
|
||||||
|
doReturn(mShadowContext).when(mActivity).getApplicationContext();
|
||||||
|
doReturn(mActivityManager).when(mActivity).getSystemService(ActivityManager.class);
|
||||||
when(mUserManager.isAdminUser()).thenReturn(true);
|
when(mUserManager.isAdminUser()).thenReturn(true);
|
||||||
|
|
||||||
ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
|
ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
|
||||||
@@ -202,7 +207,6 @@ public final class AppInfoDashboardFragmentTest {
|
|||||||
ShadowAppUtils.addHiddenModule(PACKAGE_NAME);
|
ShadowAppUtils.addHiddenModule(PACKAGE_NAME);
|
||||||
ReflectionHelpers.setField(mFragment, "mPackageName", PACKAGE_NAME);
|
ReflectionHelpers.setField(mFragment, "mPackageName", PACKAGE_NAME);
|
||||||
|
|
||||||
|
|
||||||
assertThat(mFragment.ensureDisplayableModule(mActivity)).isFalse();
|
assertThat(mFragment.ensureDisplayableModule(mActivity)).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,6 +218,14 @@ public final class AppInfoDashboardFragmentTest {
|
|||||||
assertThat(mFragment.ensureDisplayableModule(mActivity)).isTrue();
|
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
|
@Test
|
||||||
public void createPreference_hasNoPackageInfo_shouldSkip() {
|
public void createPreference_hasNoPackageInfo_shouldSkip() {
|
||||||
ReflectionHelpers.setField(mFragment, "mPackageInfo", null);
|
ReflectionHelpers.setField(mFragment, "mPackageInfo", null);
|
||||||
@@ -267,8 +279,7 @@ public final class AppInfoDashboardFragmentTest {
|
|||||||
public void onActivityResult_uninstalledUpdates_shouldInvalidateOptionsMenu() {
|
public void onActivityResult_uninstalledUpdates_shouldInvalidateOptionsMenu() {
|
||||||
doReturn(true).when(mFragment).refreshUi();
|
doReturn(true).when(mFragment).refreshUi();
|
||||||
|
|
||||||
mFragment
|
mFragment.onActivityResult(AppInfoDashboardFragment.REQUEST_UNINSTALL, 0,
|
||||||
.onActivityResult(AppInfoDashboardFragment.REQUEST_UNINSTALL, 0,
|
|
||||||
mock(Intent.class));
|
mock(Intent.class));
|
||||||
|
|
||||||
verify(mActivity).invalidateOptionsMenu();
|
verify(mActivity).invalidateOptionsMenu();
|
||||||
|
Reference in New Issue
Block a user