Trigger a support dialog when an action is disabled by policy

Change-Id: I847b481a16cce33fe7bd4040d38ec50ca62172c2
This commit is contained in:
Sudheer Shanka
2016-01-15 12:20:46 +00:00
parent ae7e15b730
commit ef550767b0
6 changed files with 80 additions and 38 deletions

View File

@@ -25,6 +25,7 @@ import android.os.PersistableBundle;
import android.os.SELinux; import android.os.SELinux;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
import android.provider.Settings; import android.provider.Settings;
@@ -41,11 +42,14 @@ import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Index; import com.android.settings.search.Index;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settingslib.DeviceInfoUtils; import com.android.settingslib.DeviceInfoUtils;
import com.android.settingslib.RestrictedLockUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
public class DeviceInfoSettings extends SettingsPreferenceFragment implements Indexable { public class DeviceInfoSettings extends SettingsPreferenceFragment implements Indexable {
private static final String LOG_TAG = "DeviceInfoSettings"; private static final String LOG_TAG = "DeviceInfoSettings";
@@ -76,6 +80,9 @@ public class DeviceInfoSettings extends SettingsPreferenceFragment implements In
private UserManager mUm; private UserManager mUm;
private EnforcedAdmin mFunDisallowedAdmin;
private EnforcedAdmin mDebuggingFeaturesDisallowedAdmin;
@Override @Override
protected int getMetricsCategory() { protected int getMetricsCategory() {
return MetricsLogger.DEVICEINFO; return MetricsLogger.DEVICEINFO;
@@ -183,6 +190,10 @@ public class DeviceInfoSettings extends SettingsPreferenceFragment implements In
Context.MODE_PRIVATE).getBoolean(DevelopmentSettings.PREF_SHOW, Context.MODE_PRIVATE).getBoolean(DevelopmentSettings.PREF_SHOW,
android.os.Build.TYPE.equals("eng")) ? -1 : TAPS_TO_BE_A_DEVELOPER; android.os.Build.TYPE.equals("eng")) ? -1 : TAPS_TO_BE_A_DEVELOPER;
mDevHitToast = null; mDevHitToast = null;
mFunDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(
getActivity(), UserManager.DISALLOW_FUN, UserHandle.myUserId());
mDebuggingFeaturesDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(
getActivity(), UserManager.DISALLOW_DEBUGGING_FEATURES, UserHandle.myUserId());
} }
@Override @Override
@@ -191,7 +202,9 @@ public class DeviceInfoSettings extends SettingsPreferenceFragment implements In
System.arraycopy(mHits, 1, mHits, 0, mHits.length-1); System.arraycopy(mHits, 1, mHits, 0, mHits.length-1);
mHits[mHits.length-1] = SystemClock.uptimeMillis(); mHits[mHits.length-1] = SystemClock.uptimeMillis();
if (mHits[0] >= (SystemClock.uptimeMillis()-500)) { if (mHits[0] >= (SystemClock.uptimeMillis()-500)) {
if (mUm.hasUserRestriction(UserManager.DISALLOW_FUN)) { if (mFunDisallowedAdmin != null) {
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(),
mFunDisallowedAdmin);
Log.d(LOG_TAG, "Sorry, no fun for you!"); Log.d(LOG_TAG, "Sorry, no fun for you!");
return false; return false;
} }
@@ -215,7 +228,11 @@ public class DeviceInfoSettings extends SettingsPreferenceFragment implements In
return true; return true;
} }
if (mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) return true; if (mDebuggingFeaturesDisallowedAdmin != null) {
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(),
mDebuggingFeaturesDisallowedAdmin);
return true;
}
if (mDevHitCountdown > 0) { if (mDevHitCountdown > 0) {
mDevHitCountdown--; mDevHitCountdown--;

View File

@@ -273,10 +273,8 @@ public class AccountSyncSettings extends AccountPreferenceBase {
final EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced( final EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(
getPrefContext(), UserManager.DISALLOW_MODIFY_ACCOUNTS, getPrefContext(), UserManager.DISALLOW_MODIFY_ACCOUNTS,
mUserHandle.getIdentifier()); mUserHandle.getIdentifier());
if (admin != null) { RestrictedLockUtils.setMenuItemAsDisabledByAdmin(getPrefContext(),
RestrictedLockUtils.setMenuItemAsDisabledByAdmin(getPrefContext(), removeAccount, admin);
removeAccount, admin);
}
syncNow.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER | syncNow.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER |
MenuItem.SHOW_AS_ACTION_WITH_TEXT); MenuItem.SHOW_AS_ACTION_WITH_TEXT);
syncCancel.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER | syncCancel.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER |

View File

@@ -38,11 +38,14 @@ import android.util.Log;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.AppEntry;
import java.util.ArrayList; import java.util.ArrayList;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
public abstract class AppInfoBase extends SettingsPreferenceFragment public abstract class AppInfoBase extends SettingsPreferenceFragment
implements ApplicationsState.Callbacks { implements ApplicationsState.Callbacks {
@@ -52,7 +55,7 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
protected static final String TAG = AppInfoBase.class.getSimpleName(); protected static final String TAG = AppInfoBase.class.getSimpleName();
protected static final boolean localLOGV = false; protected static final boolean localLOGV = false;
protected boolean mAppControlRestricted = false; protected EnforcedAdmin mAppsControlDisallowedAdmin;
protected ApplicationsState mState; protected ApplicationsState mState;
protected ApplicationsState.Session mSession; protected ApplicationsState.Session mSession;
@@ -92,7 +95,8 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
mSession.resume(); mSession.resume();
mAppControlRestricted = mUserManager.hasUserRestriction(UserManager.DISALLOW_APPS_CONTROL); mAppsControlDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(getActivity(),
UserManager.DISALLOW_APPS_CONTROL, mUserId);
if (!refreshUi()) { if (!refreshUi()) {
setIntentAndFinish(true, true); setIntentAndFinish(true, true);

View File

@@ -48,6 +48,7 @@ import com.android.internal.logging.MetricsLogger;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.deviceinfo.StorageWizardMoveConfirm; import com.android.settings.deviceinfo.StorageWizardMoveConfirm;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.AppEntry;
import com.android.settingslib.applications.ApplicationsState.Callbacks; import com.android.settingslib.applications.ApplicationsState.Callbacks;
@@ -192,13 +193,19 @@ public class AppStorageSettings extends AppInfoWithHeader
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (v == mClearCacheButton) { if (v == mClearCacheButton) {
// Lazy initialization of observer if (mAppsControlDisallowedAdmin != null) {
if (mClearCacheObserver == null) { RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
getActivity(), mAppsControlDisallowedAdmin);
return;
} else if (mClearCacheObserver == null) { // Lazy initialization of observer
mClearCacheObserver = new ClearCacheObserver(); mClearCacheObserver = new ClearCacheObserver();
} }
mPm.deleteApplicationCacheFiles(mPackageName, mClearCacheObserver); mPm.deleteApplicationCacheFiles(mPackageName, mClearCacheObserver);
} else if (v == mClearDataButton) { } else if (v == mClearDataButton) {
if (mAppEntry.info.manageSpaceActivityName != null) { if (mAppsControlDisallowedAdmin != null) {
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
getActivity(), mAppsControlDisallowedAdmin);
} else if (mAppEntry.info.manageSpaceActivityName != null) {
if (!Utils.isMonkeyRunning()) { if (!Utils.isMonkeyRunning()) {
Intent intent = new Intent(Intent.ACTION_DEFAULT); Intent intent = new Intent(Intent.ACTION_DEFAULT);
intent.setClassName(mAppEntry.info.packageName, intent.setClassName(mAppEntry.info.packageName,
@@ -211,7 +218,12 @@ public class AppStorageSettings extends AppInfoWithHeader
} else if (v == mChangeStorageButton && mDialogBuilder != null && !isMoveInProgress()) { } else if (v == mChangeStorageButton && mDialogBuilder != null && !isMoveInProgress()) {
mDialogBuilder.show(); mDialogBuilder.show();
} else if (v == mClearUriButton) { } else if (v == mClearUriButton) {
clearUriPermissions(); if (mAppsControlDisallowedAdmin != null) {
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
getActivity(), mAppsControlDisallowedAdmin);
} else {
clearUriPermissions();
}
} }
} }
@@ -310,10 +322,6 @@ public class AppStorageSettings extends AppInfoWithHeader
mClearCacheButton.setOnClickListener(this); mClearCacheButton.setOnClickListener(this);
} }
} }
if (mAppControlRestricted) {
mClearCacheButton.setEnabled(false);
mClearDataButton.setEnabled(false);
}
} }
@Override @Override
@@ -360,10 +368,6 @@ public class AppStorageSettings extends AppInfoWithHeader
} }
mClearDataButton.setOnClickListener(this); mClearDataButton.setOnClickListener(this);
} }
if (mAppControlRestricted) {
mClearDataButton.setEnabled(false);
}
} }
private void initMoveDialog() { private void initMoveDialog() {
@@ -483,10 +487,6 @@ public class AppStorageSettings extends AppInfoWithHeader
mUri.addPreference(pref); mUri.addPreference(pref);
} }
if (mAppControlRestricted) {
mClearUriButton.setEnabled(false);
}
mClearUri.setOrder(order); mClearUri.setOrder(order);
mClearUriButton.setVisibility(View.VISIBLE); mClearUriButton.setVisibility(View.VISIBLE);

View File

@@ -48,6 +48,7 @@ import android.os.Bundle;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceClickListener; import android.support.v7.preference.Preference.OnPreferenceClickListener;
import android.text.TextUtils; import android.text.TextUtils;
@@ -80,6 +81,7 @@ import com.android.settings.notification.AppNotificationSettings;
import com.android.settings.notification.NotificationBackend; import com.android.settings.notification.NotificationBackend;
import com.android.settings.notification.NotificationBackend.AppRow; import com.android.settings.notification.NotificationBackend.AppRow;
import com.android.settingslib.AppItem; import com.android.settingslib.AppItem;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.AppEntry;
@@ -92,6 +94,8 @@ import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
/** /**
* Activity to display application information from Settings. This activity presents * Activity to display application information from Settings. This activity presents
* extended information associated with a package like code, data, total size, permissions * extended information associated with a package like code, data, total size, permissions
@@ -238,10 +242,6 @@ public class InstalledAppDetails extends AppInfoBase
} }
} }
if (mAppControlRestricted) {
enabled = false;
}
mUninstallButton.setEnabled(enabled); mUninstallButton.setEnabled(enabled);
if (enabled) { if (enabled) {
// Register listener // Register listener
@@ -404,7 +404,12 @@ public class InstalledAppDetails extends AppInfoBase
} }
menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt); menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt);
mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
menu.findItem(UNINSTALL_UPDATES).setVisible(mUpdatedSysApp && !mAppControlRestricted); MenuItem uninstallUpdatesItem = menu.findItem(UNINSTALL_UPDATES);
uninstallUpdatesItem.setVisible(mUpdatedSysApp);
if (uninstallUpdatesItem.isVisible()) {
RestrictedLockUtils.setMenuItemAsDisabledByAdmin(getActivity(),
uninstallUpdatesItem, mAppsControlDisallowedAdmin);
}
} }
@Override @Override
@@ -655,12 +660,8 @@ public class InstalledAppDetails extends AppInfoBase
} }
private void updateForceStopButton(boolean enabled) { private void updateForceStopButton(boolean enabled) {
if (mAppControlRestricted) { mForceStopButton.setEnabled(enabled);
mForceStopButton.setEnabled(false); mForceStopButton.setOnClickListener(InstalledAppDetails.this);
} else {
mForceStopButton.setEnabled(enabled);
mForceStopButton.setOnClickListener(InstalledAppDetails.this);
}
} }
private void checkForceStop() { private void checkForceStop() {
@@ -716,7 +717,11 @@ public class InstalledAppDetails extends AppInfoBase
} }
String packageName = mAppEntry.info.packageName; String packageName = mAppEntry.info.packageName;
if(v == mUninstallButton) { if(v == mUninstallButton) {
if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { EnforcedAdmin admin = RestrictedLockUtils.checkIfUninstallBlocked(getActivity(),
packageName, mUserId);
if (admin != null) {
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(), admin);
} else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
if (mAppEntry.info.enabled && !isDisabledUntilUsed()) { if (mAppEntry.info.enabled && !isDisabledUntilUsed()) {
if (mUpdatedSysApp) { if (mUpdatedSysApp) {
showDialogInner(DLG_SPECIAL_DISABLE, 0); showDialogInner(DLG_SPECIAL_DISABLE, 0);
@@ -734,8 +739,13 @@ public class InstalledAppDetails extends AppInfoBase
uninstallPkg(packageName, false, false); uninstallPkg(packageName, false, false);
} }
} else if (v == mForceStopButton) { } else if (v == mForceStopButton) {
showDialogInner(DLG_FORCE_STOP, 0); if (mAppsControlDisallowedAdmin != null) {
//forceStopPackage(mAppInfo.packageName); RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
getActivity(), mAppsControlDisallowedAdmin);
} else {
showDialogInner(DLG_FORCE_STOP, 0);
//forceStopPackage(mAppInfo.packageName);
}
} }
} }

View File

@@ -28,6 +28,8 @@ import android.graphics.Color;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.DiskInfo; import android.os.storage.DiskInfo;
import android.os.storage.StorageEventListener; import android.os.storage.StorageEventListener;
import android.os.storage.StorageManager; import android.os.storage.StorageManager;
@@ -48,11 +50,15 @@ import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw; import com.android.settings.search.SearchIndexableRaw;
import com.android.settingslib.RestrictedLockUtils;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
/** /**
* Panel showing both internal storage (both built-in storage and private * Panel showing both internal storage (both built-in storage and private
* volumes) and removable storage (public volumes). * volumes) and removable storage (public volumes).
@@ -386,6 +392,13 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(
getActivity(), UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA,
UserHandle.myUserId());
if (admin != null) {
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(), admin);
return;
}
new MountTask(context, vol).execute(); new MountTask(context, vol).execute();
} }
}); });