diff --git a/res/drawable/ic_airplanemode_active.xml b/res/drawable/ic_airplanemode_active.xml index 575934169ed..10dd7ed1c58 100644 --- a/res/drawable/ic_airplanemode_active.xml +++ b/res/drawable/ic_airplanemode_active.xml @@ -20,9 +20,9 @@ android:viewportHeight="24.0" android:tint="?android:attr/colorControlNormal"> - diff --git a/res/drawable/ic_apps.xml b/res/drawable/ic_apps.xml index 784a818a43b..9f00141c4fe 100644 --- a/res/drawable/ic_apps.xml +++ b/res/drawable/ic_apps.xml @@ -20,6 +20,11 @@ android:viewportHeight="24.0" android:tint="?android:attr/colorControlNormal"> diff --git a/res/drawable/ic_arrow_down_24dp.xml b/res/drawable/ic_arrow_down_24dp.xml index 7c5866d7fd4..f334902646b 100644 --- a/res/drawable/ic_arrow_down_24dp.xml +++ b/res/drawable/ic_arrow_down_24dp.xml @@ -22,5 +22,6 @@ android:tint="?android:attr/colorAccent"> + android:pathData="M8.12 9.29L12 13.17l3.88-3.88a.996 .996 0 1 1 1.41 1.41l-4.59 4.59a.996 .996 0 0 +1-1.41 0L6.7 10.7a.996 .996 0 0 1 0-1.41c.39-.38 1.03-.39 1.42 0z"/> diff --git a/res/drawable/ic_cast_24dp.xml b/res/drawable/ic_cast_24dp.xml index 7dc895e1fd6..948decab7d7 100644 --- a/res/drawable/ic_cast_24dp.xml +++ b/res/drawable/ic_cast_24dp.xml @@ -22,5 +22,10 @@ android:tint="?android:attr/colorControlNormal"> + android:pathData="M1 18v2c0 .55 .45 1 1 1h2c0-1.66-1.34-3-3-3zm0-2.94c-.01 .51 .32 .93 .82 1.02 +2.08 .36 3.74 2 4.1 4.08 .09 .48 .5 .84 .99 .84 .61 0 1.09-.54 1-1.14a6.996 +6.996 0 0 0-5.8-5.78c-.59-.09-1.09 .38 -1.11 .98 zm0-4.03c-.01 .52 .34 .96 .85 +1.01 4.26 .43 7.68 3.82 8.1 8.08 .05 .5 .48 .88 .99 .88 .59 0 1.06-.51 +1-1.1-.52-5.21-4.66-9.34-9.87-9.85-.57-.05-1.05 .4 -1.07 .98 zM21 3H3c-1.1 0-2 +.9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/> diff --git a/res/drawable/ic_chevron_right_24dp.xml b/res/drawable/ic_chevron_right_24dp.xml index 63532cbe95a..ba621874ebb 100644 --- a/res/drawable/ic_chevron_right_24dp.xml +++ b/res/drawable/ic_chevron_right_24dp.xml @@ -23,5 +23,6 @@ android:viewportWidth="24.0" android:tint="?android:attr/colorControlNormal"> + android:pathData="M9.29,15.63l3.88-3.88L9.29,7.87c-0.39-0.39-0.39-1.02,0-1.41l0,0c0.39-0.39,1.02-0.39,1.41,0l4.59,4.59 +c0.39,0.39,0.39,1.02,0,1.41l-4.59,4.59c-0.39,0.39-1.02,0.39-1.41,0l0,0C8.91,16.66,8.9,16.02,9.29,15.63z" /> diff --git a/res/drawable/ic_devices_other.xml b/res/drawable/ic_devices_other.xml index 20639a3a6e9..b22e48356e6 100644 --- a/res/drawable/ic_devices_other.xml +++ b/res/drawable/ic_devices_other.xml @@ -20,6 +20,13 @@ android:viewportHeight="24.0" android:tint="?android:attr/colorControlNormal"> + android:fillColor="#FFFFFFFF" + android:pathData="M3,6h17c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1H3C1.9,4,1,4.9,1,6v12c0,1.1,0.9,2,2,2h3c0.55,0,1-0.45,1-1v0 + c0-0.55-0.45-1-1-1H3V6z + M13,12H9v1.78C8.39,14.33,8,15.11,8,16c0,0.89,0.39,1.67,1,2.22V20h4v-1.78c0.61-0.55,1-1.34,1-2.22 + s-0.39-1.67-1-2.22V12z + M11,17.5c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5s1.5,0.67,1.5,1.5S11.83,17.5,11,17.5z + M22,8h-6 + c-0.5,0-1,0.5-1,1v10c0,0.5,0.5,1,1,1h6c0.5,0,1-0.5,1-1V9C23,8.5,22.5,8,22,8z + M21,18h-4v-8h4V18z" /> diff --git a/res/drawable/ic_expand_more.xml b/res/drawable/ic_expand_more.xml index 609cf363a1a..edffde399a0 100644 --- a/res/drawable/ic_expand_more.xml +++ b/res/drawable/ic_expand_more.xml @@ -23,7 +23,8 @@ android:tint="?android:attr/colorControlNormal"> + android:fillColor="#000000" + android:pathData="M8.12 9.29L12 13.17l3.88-3.88a.996 .996 0 1 1 1.41 1.41l-4.59 4.59a.996 .996 0 0 +1-1.41 0L6.7 10.7a.996 .996 0 0 1 0-1.41c.39-.38 1.03-.39 1.42 0z" /> diff --git a/res/drawable/ic_help.xml b/res/drawable/ic_help.xml index 7a225e50342..6add4842798 100644 --- a/res/drawable/ic_help.xml +++ b/res/drawable/ic_help.xml @@ -20,6 +20,11 @@ android:viewportHeight="24.0" android:tint="?android:attr/colorControlNormal"> diff --git a/res/drawable/ic_info_outline_24dp.xml b/res/drawable/ic_info_outline_24dp.xml deleted file mode 100644 index 3fe1e9e5ca9..00000000000 --- a/res/drawable/ic_info_outline_24dp.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/res/drawable/ic_menu_add.xml b/res/drawable/ic_menu_add.xml index 3387f294200..9e2175b7c61 100644 --- a/res/drawable/ic_menu_add.xml +++ b/res/drawable/ic_menu_add.xml @@ -23,5 +23,6 @@ android:tint="?android:attr/colorAccent"> + android:pathData="M18,13h-5v5c0,0.55-0.45,1-1,1h0c-0.55,0-1-0.45-1-1v-5H6c-0.55,0-1-0.45-1-1v0c0-0.55,0.45-1,1-1h5V6c0-0.55,0.45-1,1-1h0 +c0.55,0,1,0.45,1,1v5h5c0.55,0,1,0.45,1,1v0C19,12.55,18.55,13,18,13z"/> diff --git a/res/drawable/ic_restore.xml b/res/drawable/ic_restore.xml index 737f811a2aa..201b1df11d1 100644 --- a/res/drawable/ic_restore.xml +++ b/res/drawable/ic_restore.xml @@ -22,7 +22,11 @@ android:tint="?android:attr/colorControlNormal"> + android:pathData="M13.5 7.75v4.5l3.37 2c.34 .2 .46 .65 .25 .99 s-.64 .45 -.98 .24 L12 +13V7.75c0-.41 .34 -.75 .75 -.75s.75 .34 .75 .75 zM13.05 3C8.11 3 4.1 7.02 4.1 +11.95c0 .02 .01 .03 .01 .05H2.05c-.47 0-.71 .57 -.37 .9 l2.95 2.94c.21 .21 .54 +.21 .75 0l2.95-2.94c.33-.33 .1 -.9-.37-.9H5.99c0-.02 .01 -.03 .01 -.05C6 8.06 +9.16 4.9 13.05 4.9S20.1 8.11 20.1 12s-3.16 7.1-7.05 7.1c-1.58 +0-3.08-.51-4.32-1.48a.94 .94 0 0 0-1.32 .16 l-.01 .01 a.94 .94 0 0 0 .16 +1.32l.01 .01 A8.77 8.77 0 0 0 13.05 21c4.94 0 8.95-4.07 8.95-9s-4.02-9-8.95-9z" /> \ No newline at end of file diff --git a/res/drawable/ic_search_24dp.xml b/res/drawable/ic_search_24dp.xml index 4693dd756c9..8f14e888f71 100644 --- a/res/drawable/ic_search_24dp.xml +++ b/res/drawable/ic_search_24dp.xml @@ -16,12 +16,15 @@ --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="?android:attr/colorControlNormal"> + - + android:fillColor="#000000" + android:pathData="M15.5,14h-0.79l-0.28-0.27c1.2-1.4,1.82-3.31,1.48-5.34c-0.47-2.78-2.79-5-5.59-5.34c-4.23-0.52-7.79,3.04-7.27,7.27 +c0.34,2.8,2.56,5.12,5.34,5.59c2.03,0.34,3.94-0.28,5.34-1.48L14,14.71v0.79l5.2,5.19c0.41,0.41,1.07,0.41,1.48,0l0.01-0.01 +c0.41-0.41,0.41-1.07,0-1.48L15.5,14z M9.5,14C7.01,14,5,11.99,5,9.5S7.01,5,9.5,5S14,7.01,14,9.5S11.99,14,9.5,14z" /> + \ No newline at end of file diff --git a/res/drawable/ic_settings.xml b/res/drawable/ic_settings.xml index 439c1a7c8b6..3d8563d3729 100644 --- a/res/drawable/ic_settings.xml +++ b/res/drawable/ic_settings.xml @@ -21,16 +21,14 @@ android:tint="?android:attr/colorAccent"> + android:pathData="M21.4 14.2l-1.94-1.45c.03-.25 .04 -.5 .04 -.76s-.01-.51-.04-.76L21.4 9.8c.42-.31 +.52 -.94 .24 -1.41l-1.6-2.76c-.28-.48-.88-.7-1.36-.5l-2.14 .91 +c-.48-.37-1.01-.68-1.57-.92l-.27-2.2c-.06-.52-.56-.92-1.11-.92h-3.18c-.55 0-1.05 +.4 -1.11 .92 l-.26 2.19c-.57 .24 -1.1 .55 -1.58 .92 l-2.14-.91c-.48-.2-1.08 .02 +-1.36 .5 l-1.6 2.76c-.28 .48 -.18 1.1 .24 1.42l1.94 1.45c-.03 .24 -.04 .49 -.04 +.75 s.01 .51 .04 .76 L2.6 14.2c-.42 .31 -.52 .94 -.24 1.41l1.6 2.76c.28 .48 .88 +.7 1.36 .5 l2.14-.91c.48 .37 1.01 .68 1.57 .92 l.27 2.19c.06 .53 .56 .93 1.11 +.93 h3.18c.55 0 1.04-.4 1.11-.92l.27-2.19c.56-.24 1.09-.55 1.57-.92l2.14 .91 +c.48 .2 1.08-.02 1.36-.5l1.6-2.76c.28-.48 .18 -1.1-.24-1.42zM12 15.5c-1.93 +0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/> diff --git a/res/drawable/ic_settings_about.xml b/res/drawable/ic_settings_about.xml index cdf82754ef7..887fca60c12 100644 --- a/res/drawable/ic_settings_about.xml +++ b/res/drawable/ic_settings_about.xml @@ -20,6 +20,12 @@ android:viewportHeight="24.0" android:tint="?android:attr/colorControlNormal"> + android:fillColor="#FF000000" + android:pathData="M12,17L12,17c0.55,0 1,-0.45 1,-1v-4c0,-0.55 -0.45,-1 -1,-1l0,0c-0.55,0 -1,0.45 -1,1v4C11,16.55 11.45,17 12,17z"/> + + diff --git a/res/drawable/ic_settings_accessibility.xml b/res/drawable/ic_settings_accessibility.xml index 15703123b69..7054d78073c 100644 --- a/res/drawable/ic_settings_accessibility.xml +++ b/res/drawable/ic_settings_accessibility.xml @@ -21,5 +21,10 @@ android:tint="?android:attr/colorControlNormal"> + android:pathData="M3 10v4c0 .55 .45 1 1 1h3l3.29 3.29c.63 .63 1.71 .18 +1.71-.71V6.41c0-.89-1.08-1.34-1.71-.71L7 9H4c-.55 0-1 .45-1 1zm13.5 2A4.5 4.5 0 +0 0 14 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 4.46v.19c0 .38 .25 .71 .61 +.85C17.18 6.54 19 9.06 19 12s-1.82 5.46-4.39 6.5c-.36 .14 -.61 .47 -.61 .85 +v.19c0 .63 .63 1.08 1.22 .86 a8.995 8.995 0 0 0 0-16.8c-.59-.23-1.22 .23 -1.22 +.86 z"/> diff --git a/res/drawable/ic_settings_data_usage.xml b/res/drawable/ic_settings_data_usage.xml index 31ea99471ea..0e0b447db05 100644 --- a/res/drawable/ic_settings_data_usage.xml +++ b/res/drawable/ic_settings_data_usage.xml @@ -16,23 +16,16 @@ + android:pathData="M18.32 16.75l1.32 .76 c.26 .15 .34 .51 .15 .74 -2.09 2.6-5.44 4.14-9.14 +3.65-4.4-.58-7.96-4.12-8.56-8.52C1.34 7.8 5.21 2.95 10.43 2.12c.3-.05 .57 .2 .57 +.5v1.53c0 .24-.18 .44 -.41 .49 -3.6 .69 -6.29 3.95-6.07 7.79 .21 3.82 3.43 6.95 +7.25 7.07 2.37 .08 4.51-.96 5.93-2.63a.48 .48 0 0 1 .62-.12zM19.5 12c0 .83-.14 +1.63-.39 2.38-.08 .23 .01 .47 .21 .59 l1.33 .77 c.26 .15 .61 .04 .72-.24 .4 +-1.09 .63 -2.27 .63 -3.5 0-4.99-3.65-9.12-8.43-9.88-.3-.04-.57 .2 -.57 .5 +v1.53c0 .24 .18 .44 .41 .48 3.46 .68 6.09 3.72 6.09 7.37z"/> diff --git a/res/drawable/ic_settings_date_time.xml b/res/drawable/ic_settings_date_time.xml index b965878242a..1d2f3d336bb 100644 --- a/res/drawable/ic_settings_date_time.xml +++ b/res/drawable/ic_settings_date_time.xml @@ -1,28 +1,25 @@ - + android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM11.75,6.1c-0.5,0 -0.75,0.32 -0.75,0.72L11,13l4.64,2.78c0.34,0.2 0.78,0.1 0.98,-0.24a0.71,0.71 0,0 0,-0.25 -0.99l-3.87,-2.3L12.5,6.82c0,-0.4 -0.25,-0.72 -0.75,-0.72z"/> diff --git a/res/drawable/ic_settings_display.xml b/res/drawable/ic_settings_display.xml index ff763f052bc..de71508b841 100644 --- a/res/drawable/ic_settings_display.xml +++ b/res/drawable/ic_settings_display.xml @@ -21,5 +21,8 @@ android:tint="?android:attr/colorControlNormal"> + android:pathData="M20,15.31l2.6-2.6c0.39-0.39,0.39-1.02,0-1.41L20,8.69V5c0-0.55-0.45-1-1-1h-3.69l-2.6-2.6c-0.39-0.39-1.02-0.39-1.41,0 +L8.69,4H5C4.45,4,4,4.45,4,5v3.69l-2.6,2.6c-0.39,0.39-0.39,1.02,0,1.41l2.6,2.6V19c0,0.55,0.45,1,1,1h3.69l2.6,2.6 +c0.39,0.39,1.02,0.39,1.41,0l2.6-2.6H19c0.55,0,1-0.45,1-1V15.31z +M12,18V6c3.31,0,6,2.69,6,6S15.31,18,12,18z"/> diff --git a/res/drawable/ic_settings_print.xml b/res/drawable/ic_settings_print.xml index 74700141c04..0eab4021956 100644 --- a/res/drawable/ic_settings_print.xml +++ b/res/drawable/ic_settings_print.xml @@ -21,5 +21,8 @@ android:tint="?android:attr/colorControlNormal"> + android:pathData="M19,8H5c-1.66,0-3,1.34-3,3v5c0,0.55,0.45,1,1,1h3v3c0,0.55,0.45,1,1,1h10c0.55,0,1-0.45,1-1v-3h3c0.55,0,1-0.45,1-1v-5 +C22,9.34,20.66,8,19,8z M16,19H8v-5h8V19z +M19,12c-0.55,0-1-0.45-1-1s0.45-1,1-1s1,0.45,1,1S19.55,12,19,12z M17,3H7 +C6.45,3,6,3.45,6,4v3h12V4C18,3.45,17.55,3,17,3z"/> diff --git a/res/drawable/ic_settings_sound.xml b/res/drawable/ic_settings_sound.xml index 598a02a4dc4..7054d78073c 100644 --- a/res/drawable/ic_settings_sound.xml +++ b/res/drawable/ic_settings_sound.xml @@ -21,5 +21,10 @@ android:tint="?android:attr/colorControlNormal"> + android:pathData="M3 10v4c0 .55 .45 1 1 1h3l3.29 3.29c.63 .63 1.71 .18 +1.71-.71V6.41c0-.89-1.08-1.34-1.71-.71L7 9H4c-.55 0-1 .45-1 1zm13.5 2A4.5 4.5 0 +0 0 14 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 4.46v.19c0 .38 .25 .71 .61 +.85C17.18 6.54 19 9.06 19 12s-1.82 5.46-4.39 6.5c-.36 .14 -.61 .47 -.61 .85 +v.19c0 .63 .63 1.08 1.22 .86 a8.995 8.995 0 0 0 0-16.8c-.59-.23-1.22 .23 -1.22 +.86 z"/> diff --git a/res/drawable/ic_vpn_key.xml b/res/drawable/ic_vpn_key.xml index aad1096b17a..71b29d651a8 100644 --- a/res/drawable/ic_vpn_key.xml +++ b/res/drawable/ic_vpn_key.xml @@ -20,6 +20,7 @@ android:viewportHeight="24.0" android:tint="?android:attr/colorControlNormal"> diff --git a/res/drawable/ic_zen.xml b/res/drawable/ic_zen.xml index 17ecf217b86..8c50d5dd456 100644 --- a/res/drawable/ic_zen.xml +++ b/res/drawable/ic_zen.xml @@ -14,13 +14,13 @@ limitations under the License. --> + android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4 11H8c-.55 0-1-.45-1-1s.45-1 1-1h8c.55 0 1 .45 1 1s-.45 1-1 1z" /> diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 2a57577bb69..417ac0faeb5 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -107,6 +107,7 @@ import com.android.internal.app.UnlaunchableAppActivity; import com.android.internal.util.ArrayUtils; import com.android.internal.util.UserIcons; import com.android.internal.widget.LockPatternUtils; +import com.android.settings.enterprise.DevicePolicyManagerWrapper; import com.android.settings.password.FingerprintManagerWrapper; import com.android.settings.password.IFingerprintManager; @@ -1279,6 +1280,28 @@ public final class Utils extends com.android.settingslib.Utils { return isVolumeValid(volume) ? volume : null; } + /** + * Return {@code true} if the supplied package is device owner or profile owner of at + * least one user. + * @param userManager used to get profile owner app for each user + * @param devicePolicyManager used to check whether it is device owner app + * @param packageName package to check about + */ + public static boolean isProfileOrDeviceOwner(UserManager userManager, + DevicePolicyManagerWrapper devicePolicyManager, String packageName) { + List userInfos = userManager.getUsers(); + if (devicePolicyManager.isDeviceOwnerAppOnAnyUser(packageName)) { + return true; + } + for (int i = 0, size = userInfos.size(); i < size; i++) { + ComponentName cn = devicePolicyManager.getProfileOwnerAsUser(userInfos.get(i).id); + if (cn != null && cn.getPackageName().equals(packageName)) { + return true; + } + } + return false; + } + /** * Return the resource id to represent the install status for an app */ diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java index 4af9bc656ce..a5daee26564 100644 --- a/src/com/android/settings/applications/AppInfoBase.java +++ b/src/com/android/settings/applications/AppInfoBase.java @@ -43,6 +43,8 @@ import com.android.settings.SettingsActivity; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import com.android.settings.enterprise.DevicePolicyManagerWrapper; +import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.applications.ApplicationsState; @@ -73,7 +75,7 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment protected String mPackageName; protected IUsbManager mUsbManager; - protected DevicePolicyManager mDpm; + protected DevicePolicyManagerWrapper mDpm; protected UserManager mUserManager; protected PackageManager mPm; @@ -92,7 +94,8 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment .getApplicationFeatureProvider(activity); mState = ApplicationsState.getInstance(activity.getApplication()); mSession = mState.newSession(this); - mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE); + mDpm = new DevicePolicyManagerWrapperImpl( + (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE)); mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE); mPm = activity.getPackageManager(); IBinder b = ServiceManager.getService(Context.USB_SERVICE); diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java index 5e834d80957..209cd22b972 100755 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -277,7 +277,7 @@ public class InstalledAppDetails extends AppInfoBase // We don't allow uninstalling DO/PO on *any* users, because if it's a system app, // "uninstall" is actually "downgrade to the system version + disable", and "downgrade" // will clear data on all users. - if (isProfileOrDeviceOwner(mPackageInfo.packageName)) { + if (Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mPackageInfo.packageName)) { enabled = false; } @@ -352,23 +352,6 @@ public class InstalledAppDetails extends AppInfoBase return enabled; } - /** Returns if the supplied package is device owner or profile owner of at least one user */ - private boolean isProfileOrDeviceOwner(String packageName) { - List userInfos = mUserManager.getUsers(); - DevicePolicyManager dpm = (DevicePolicyManager) - getContext().getSystemService(Context.DEVICE_POLICY_SERVICE); - if (dpm.isDeviceOwnerAppOnAnyUser(packageName)) { - return true; - } - for (UserInfo userInfo : userInfos) { - ComponentName cn = dpm.getProfileOwnerAsUser(userInfo.id); - if (cn != null && cn.getPackageName().equals(packageName)) { - return true; - } - } - return false; - } - /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java index 7ebf2948e17..6ae2fa1c2d7 100644 --- a/src/com/android/settings/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/fingerprint/FingerprintSettings.java @@ -903,7 +903,7 @@ public class FingerprintSettings extends SubSettings { } private static class LearnMoreSpan extends URLSpan { - + private static final String TAG = "LearnMoreSpan"; private static final Typeface TYPEFACE_MEDIUM = Typeface.create("sans-serif-medium", Typeface.NORMAL); @@ -928,6 +928,10 @@ public class FingerprintSettings extends SubSettings { RestrictedLockUtils.sendShowAdminSupportDetailsIntent(ctx, mEnforcedAdmin); } else { Intent intent = HelpUtils.getHelpIntent(ctx, getURL(), ctx.getClass().getName()); + if (intent == null) { + Log.w(LearnMoreSpan.TAG, "Null help intent."); + return; + } try { widget.startActivityForResult(intent, 0); } catch (ActivityNotFoundException e) { diff --git a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java index 8b56b597ed6..0d5bed8aca5 100644 --- a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java +++ b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java @@ -383,7 +383,7 @@ public class AppButtonsPreferenceController extends AbstractPreferenceController // We don't allow uninstalling DO/PO on *any* users, because if it's a system app, // "uninstall" is actually "downgrade to the system version + disable", and "downgrade" // will clear data on all users. - if (isProfileOrDeviceOwner(mPackageInfo.packageName)) { + if (Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mPackageInfo.packageName)) { enabled = false; } @@ -582,21 +582,6 @@ public class AppButtonsPreferenceController extends AbstractPreferenceController || (mUserManager.isSplitSystemUser() && userCount == 2); } - /** Returns if the supplied package is device owner or profile owner of at least one user */ - private boolean isProfileOrDeviceOwner(String packageName) { - List userInfos = mUserManager.getUsers(); - if (mDpm.isDeviceOwnerAppOnAnyUser(packageName)) { - return true; - } - for (int i = 0, size = userInfos.size(); i < size; i++) { - ComponentName cn = mDpm.getProfileOwnerAsUser(userInfos.get(i).id); - if (cn != null && cn.getPackageName().equals(packageName)) { - return true; - } - } - return false; - } - private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { diff --git a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java index 89089e593ce..4d1cf77c2eb 100644 --- a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java @@ -15,17 +15,22 @@ package com.android.settings.fuelgauge; import android.app.AppOpsManager; +import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Build; +import android.os.UserManager; import android.support.annotation.VisibleForTesting; import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import android.util.Log; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.enterprise.DevicePolicyManagerWrapper; +import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl; import com.android.settingslib.core.AbstractPreferenceController; /** @@ -39,14 +44,20 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo private final PackageManager mPackageManager; private final AppOpsManager mAppOpsManager; + private final UserManager mUserManager; private final String[] mPackages; private final int mUid; + @VisibleForTesting + DevicePolicyManagerWrapper mDpm; private String mTargetPackage; public BackgroundActivityPreferenceController(Context context, int uid) { super(context); mPackageManager = context.getPackageManager(); + mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + mDpm = new DevicePolicyManagerWrapperImpl( + (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE)); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mUid = uid; mPackages = mPackageManager.getPackagesForUid(mUid); @@ -56,12 +67,15 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo public void updateState(Preference preference) { final int mode = mAppOpsManager .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage); - if (mode == AppOpsManager.MODE_ERRORED) { - preference.setEnabled(false); - } else { + // Set checked or not before we may set it disabled + if (mode != AppOpsManager.MODE_ERRORED) { final boolean checked = mode != AppOpsManager.MODE_IGNORED; ((SwitchPreference) preference).setChecked(checked); } + if (mode == AppOpsManager.MODE_ERRORED + || Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mTargetPackage)) { + preference.setEnabled(false); + } updateSummary(preference); } diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java index d85464d1e08..33ead1fd4d0 100644 --- a/tests/robotests/src/com/android/settings/UtilsTest.java +++ b/tests/robotests/src/com/android/settings/UtilsTest.java @@ -8,14 +8,17 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; +import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; +import android.content.pm.UserInfo; import android.net.ConnectivityManager; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.Network; import android.net.wifi.WifiManager; import android.os.Bundle; +import android.os.UserManager; import android.os.storage.DiskInfo; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; @@ -23,6 +26,7 @@ import android.text.SpannableStringBuilder; import android.text.format.DateUtils; import android.text.style.TtsSpan; +import com.android.settings.enterprise.DevicePolicyManagerWrapper; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; @@ -34,12 +38,15 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.net.InetAddress; +import java.util.ArrayList; +import java.util.List; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class UtilsTest { private static final String TIME_DESCRIPTION = "1 day 20 hours 30 minutes"; + private static final String PACKAGE_NAME = "com.android.app"; private Context mContext; @Mock private WifiManager wifiManager; @@ -47,6 +54,10 @@ public class UtilsTest { private Network network; @Mock private ConnectivityManager connectivityManager; + @Mock + private DevicePolicyManagerWrapper mDevicePolicyManager; + @Mock + private UserManager mUserManager; @Before public void setUp() { @@ -194,4 +205,25 @@ public class UtilsTest { assertThat(Utils.getInstallationStatus(info)).isEqualTo(R.string.disabled); } + + @Test + public void testIsProfileOrDeviceOwner_deviceOwnerApp_returnTrue() { + when(mDevicePolicyManager.isDeviceOwnerAppOnAnyUser(PACKAGE_NAME)).thenReturn(true); + + assertThat(Utils.isProfileOrDeviceOwner(mUserManager, mDevicePolicyManager, + PACKAGE_NAME)).isTrue(); + } + + @Test + public void testIsProfileOrDeviceOwner_profileOwnerApp_returnTrue() { + final List userInfos = new ArrayList<>(); + userInfos.add(new UserInfo()); + + when(mUserManager.getUsers()).thenReturn(userInfos); + when(mDevicePolicyManager.getProfileOwnerAsUser(userInfos.get(0).id)).thenReturn( + new ComponentName(PACKAGE_NAME, "")); + + assertThat(Utils.isProfileOrDeviceOwner(mUserManager, mDevicePolicyManager, + PACKAGE_NAME)).isTrue(); + } } diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java index dc0730e5eea..8fb1e99ae8a 100644 --- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java @@ -55,6 +55,7 @@ import com.android.settings.SettingsActivity; import com.android.settings.TestConfig; import com.android.settings.applications.instantapps.InstantAppButtonsController; import com.android.settings.applications.instantapps.InstantAppButtonsController.ShowDialogDelegate; +import com.android.settings.enterprise.DevicePolicyManagerWrapper; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -103,7 +104,7 @@ public final class InstalledAppDetailsTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private SettingsActivity mActivity; @Mock - private DevicePolicyManager mDevicePolicyManager; + private DevicePolicyManagerWrapper mDevicePolicyManager; @Mock private BatterySipper mBatterySipper; @Mock diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java index 4f489451ac6..91f4a2b606e 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java @@ -17,14 +17,17 @@ package com.android.settings.fuelgauge; import android.app.AppOpsManager; +import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Build; +import android.os.UserManager; import android.support.v14.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.TestConfig; +import com.android.settings.enterprise.DevicePolicyManagerWrapper; import org.junit.Before; import org.junit.Test; @@ -62,6 +65,12 @@ public class BackgroundActivityPreferenceControllerTest { private ApplicationInfo mHighApplicationInfo; @Mock private ApplicationInfo mLowApplicationInfo; + @Mock + private UserManager mUserManager; + @Mock + private DevicePolicyManager mDevicePolicyManager; + @Mock + private DevicePolicyManagerWrapper mDevicePolicyManagerWrapper; private BackgroundActivityPreferenceController mController; private SwitchPreference mPreference; private Context mShadowContext; @@ -73,6 +82,9 @@ public class BackgroundActivityPreferenceControllerTest { mShadowContext = RuntimeEnvironment.application; when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager); + when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); + when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn( + mDevicePolicyManager); when(mPackageManager.getPackagesForUid(UID_NORMAL)).thenReturn(PACKAGES_NORMAL); when(mPackageManager.getPackagesForUid(UID_SPECIAL)).thenReturn(PACKAGES_SPECIAL); @@ -86,6 +98,7 @@ public class BackgroundActivityPreferenceControllerTest { mPreference = new SwitchPreference(mShadowContext); mController = spy(new BackgroundActivityPreferenceController(mContext, UID_NORMAL)); mController.isAvailable(); + mController.mDpm = mDevicePolicyManagerWrapper; } @Test @@ -181,6 +194,7 @@ public class BackgroundActivityPreferenceControllerTest { @Test public void testMultiplePackages_ReturnStatusForTargetPackage() { mController = new BackgroundActivityPreferenceController(mContext, UID_SPECIAL); + mController.mDpm = mDevicePolicyManagerWrapper; when(mAppOpsManager .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_SPECIAL, LOW_SDK_PACKAGE)) .thenReturn(AppOpsManager.MODE_ALLOWED);