Stop apps with Storage Managers from launching activity when disabled

An app with a storage manager would be able to launch Manage Storage
from application settings, but when the app was disabled, the
activity would be null.

Test: In order to properly unit test this function, a large redesign is 
needed in this class, and is outside the scope of this bug.

Change-Id: Ia6b78bc6761bac8b701c904a6e438bbd951b63e8
Fixes: 30457616
This commit is contained in:
Matthew Fritze
2016-08-02 14:39:59 -07:00
parent a8c0d42ceb
commit 8f17fcaa1d

View File

@@ -60,6 +60,9 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.TreeMap; import java.util.TreeMap;
import static android.content.pm.ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA;
import static android.content.pm.ApplicationInfo.FLAG_SYSTEM;
public class AppStorageSettings extends AppInfoWithHeader public class AppStorageSettings extends AppInfoWithHeader
implements OnClickListener, Callbacks, DialogInterface.OnClickListener { implements OnClickListener, Callbacks, DialogInterface.OnClickListener {
private static final String TAG = AppStorageSettings.class.getSimpleName(); private static final String TAG = AppStorageSettings.class.getSimpleName();
@@ -354,19 +357,27 @@ public class AppStorageSettings extends AppInfoWithHeader
} }
private void initDataButtons() { private void initDataButtons() {
// If the app doesn't have its own space management UI final boolean appHasSpaceManagementUI = mAppEntry.info.manageSpaceActivityName != null;
// And it's a system app that doesn't allow clearing user data or is an active admin final boolean appHasActiveAdmins = mDpm.packageHasActiveAdmins(mPackageName);
// Then disable the Clear Data button. // Check that SYSTEM_APP flag is set, and ALLOW_CLEAR_USER_DATA is not set.
if (mAppEntry.info.manageSpaceActivityName == null final boolean isNonClearableSystemApp =
&& ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM (mAppEntry.info.flags & (FLAG_SYSTEM | FLAG_ALLOW_CLEAR_USER_DATA)) == FLAG_SYSTEM;
| ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA)) final boolean appRestrictsClearingData = isNonClearableSystemApp || appHasActiveAdmins;
== ApplicationInfo.FLAG_SYSTEM
|| mDpm.packageHasActiveAdmins(mPackageName))) { final Intent intent = new Intent(Intent.ACTION_DEFAULT);
if (appHasSpaceManagementUI) {
intent.setClassName(mAppEntry.info.packageName, mAppEntry.info.manageSpaceActivityName);
}
final boolean isManageSpaceActivityAvailable =
getPackageManager().resolveActivity(intent, 0) != null;
if ((!appHasSpaceManagementUI && appRestrictsClearingData)
|| !isManageSpaceActivityAvailable) {
mClearDataButton.setText(R.string.clear_user_data_text); mClearDataButton.setText(R.string.clear_user_data_text);
mClearDataButton.setEnabled(false); mClearDataButton.setEnabled(false);
mCanClearData = false; mCanClearData = false;
} else { } else {
if (mAppEntry.info.manageSpaceActivityName != null) { if (appHasSpaceManagementUI) {
mClearDataButton.setText(R.string.manage_space_text); mClearDataButton.setText(R.string.manage_space_text);
} else { } else {
mClearDataButton.setText(R.string.clear_user_data_text); mClearDataButton.setText(R.string.clear_user_data_text);