Loading src/com/android/settings/Utils.java +46 −43 Original line number Original line Diff line number Diff line Loading @@ -156,19 +156,19 @@ public final class Utils extends com.android.settingslib.Utils { public static boolean updatePreferenceToSpecificActivityOrRemove(Context context, public static boolean updatePreferenceToSpecificActivityOrRemove(Context context, PreferenceGroup parentPreferenceGroup, String preferenceKey, int flags) { PreferenceGroup parentPreferenceGroup, String preferenceKey, int flags) { Preference preference = parentPreferenceGroup.findPreference(preferenceKey); final Preference preference = parentPreferenceGroup.findPreference(preferenceKey); if (preference == null) { if (preference == null) { return false; return false; } } Intent intent = preference.getIntent(); final Intent intent = preference.getIntent(); if (intent != null) { if (intent != null) { // Find the activity that is in the system image // Find the activity that is in the system image PackageManager pm = context.getPackageManager(); final PackageManager pm = context.getPackageManager(); List<ResolveInfo> list = pm.queryIntentActivities(intent, 0); final List<ResolveInfo> list = pm.queryIntentActivities(intent, 0); int listSize = list.size(); final int listSize = list.size(); for (int i = 0; i < listSize; i++) { for (int i = 0; i < listSize; i++) { ResolveInfo resolveInfo = list.get(i); final ResolveInfo resolveInfo = list.get(i); if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { != 0) { Loading Loading @@ -199,7 +199,7 @@ public final class Utils extends com.android.settingslib.Utils { * @throws IllegalStateException if no UserManager could be retrieved. * @throws IllegalStateException if no UserManager could be retrieved. */ */ public static UserManager getUserManager(Context context) { public static UserManager getUserManager(Context context) { UserManager um = UserManager.get(context); final UserManager um = UserManager.get(context); if (um == null) { if (um == null) { throw new IllegalStateException("Unable to load UserManager"); throw new IllegalStateException("Unable to load UserManager"); } } Loading @@ -217,7 +217,7 @@ public final class Utils extends com.android.settingslib.Utils { * Returns whether the device is voice-capable (meaning, it is also a phone). * Returns whether the device is voice-capable (meaning, it is also a phone). */ */ public static boolean isVoiceCapable(Context context) { public static boolean isVoiceCapable(Context context) { TelephonyManager telephony = final TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return telephony != null && telephony.isVoiceCapable(); return telephony != null && telephony.isVoiceCapable(); } } Loading @@ -228,12 +228,12 @@ public final class Utils extends com.android.settingslib.Utils { * @return the formatted and newline-separated IP addresses, or null if none. * @return the formatted and newline-separated IP addresses, or null if none. */ */ public static String getWifiIpAddresses(Context context) { public static String getWifiIpAddresses(Context context) { WifiManager wifiManager = context.getSystemService(WifiManager.class); final WifiManager wifiManager = context.getSystemService(WifiManager.class); Network currentNetwork = wifiManager.getCurrentNetwork(); final Network currentNetwork = wifiManager.getCurrentNetwork(); if (currentNetwork != null) { if (currentNetwork != null) { ConnectivityManager cm = (ConnectivityManager) final ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); context.getSystemService(Context.CONNECTIVITY_SERVICE); LinkProperties prop = cm.getLinkProperties(currentNetwork); final LinkProperties prop = cm.getLinkProperties(currentNetwork); return formatIpAddresses(prop); return formatIpAddresses(prop); } } return null; return null; Loading @@ -241,7 +241,7 @@ public final class Utils extends com.android.settingslib.Utils { private static String formatIpAddresses(LinkProperties prop) { private static String formatIpAddresses(LinkProperties prop) { if (prop == null) return null; if (prop == null) return null; Iterator<InetAddress> iter = prop.getAllAddresses().iterator(); final Iterator<InetAddress> iter = prop.getAllAddresses().iterator(); // If there are no entries, return null // If there are no entries, return null if (!iter.hasNext()) return null; if (!iter.hasNext()) return null; // Concatenate all available addresses, comma separated // Concatenate all available addresses, comma separated Loading @@ -262,7 +262,7 @@ public final class Utils extends com.android.settingslib.Utils { // And : new Locale("en_US").toString() => "en_us" // And : new Locale("en_US").toString() => "en_us" if (null == localeStr) if (null == localeStr) return Locale.getDefault(); return Locale.getDefault(); String[] brokenDownLocale = localeStr.split("_", 3); final String[] brokenDownLocale = localeStr.split("_", 3); // split may not return a 0-length array. // split may not return a 0-length array. if (1 == brokenDownLocale.length) { if (1 == brokenDownLocale.length) { return new Locale(brokenDownLocale[0]); return new Locale(brokenDownLocale[0]); Loading Loading @@ -396,7 +396,7 @@ public final class Utils extends com.android.settingslib.Utils { * exists but it is disabled. * exists but it is disabled. */ */ public static UserHandle getManagedProfile(UserManager userManager) { public static UserHandle getManagedProfile(UserManager userManager) { List<UserHandle> userProfiles = userManager.getUserProfiles(); final List<UserHandle> userProfiles = userManager.getUserProfiles(); for (UserHandle profile : userProfiles) { for (UserHandle profile : userProfiles) { if (profile.getIdentifier() == userManager.getUserHandle()) { if (profile.getIdentifier() == userManager.getUserHandle()) { continue; continue; Loading @@ -420,7 +420,7 @@ public final class Utils extends com.android.settingslib.Utils { // we need to use UserManager.getProfiles that is available on API 23 (the one currently // we need to use UserManager.getProfiles that is available on API 23 (the one currently // used for Settings Robolectric tests). // used for Settings Robolectric tests). final int myUserId = UserHandle.myUserId(); final int myUserId = UserHandle.myUserId(); List<UserInfo> profiles = userManager.getProfiles(myUserId); final List<UserInfo> profiles = userManager.getProfiles(myUserId); final int count = profiles.size(); final int count = profiles.size(); for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { final UserInfo profile = profiles.get(i); final UserInfo profile = profiles.get(i); Loading @@ -438,7 +438,7 @@ public final class Utils extends com.android.settingslib.Utils { * @return the managed profile id or UserHandle.USER_NULL if there is none. * @return the managed profile id or UserHandle.USER_NULL if there is none. */ */ public static int getManagedProfileId(UserManager um, int parentUserId) { public static int getManagedProfileId(UserManager um, int parentUserId) { int[] profileIds = um.getProfileIdsWithDisabled(parentUserId); final int[] profileIds = um.getProfileIdsWithDisabled(parentUserId); for (int profileId : profileIds) { for (int profileId : profileIds) { if (profileId != parentUserId) { if (profileId != parentUserId) { return profileId; return profileId; Loading @@ -464,13 +464,14 @@ public final class Utils extends com.android.settingslib.Utils { */ */ public static UserHandle getSecureTargetUser(IBinder activityToken, public static UserHandle getSecureTargetUser(IBinder activityToken, UserManager um, @Nullable Bundle arguments, @Nullable Bundle intentExtras) { UserManager um, @Nullable Bundle arguments, @Nullable Bundle intentExtras) { UserHandle currentUser = new UserHandle(UserHandle.myUserId()); final UserHandle currentUser = new UserHandle(UserHandle.myUserId()); IActivityManager am = ActivityManager.getService(); final IActivityManager am = ActivityManager.getService(); try { try { String launchedFromPackage = am.getLaunchedFromPackage(activityToken); final String launchedFromPackage = am.getLaunchedFromPackage(activityToken); boolean launchedFromSettingsApp = SETTINGS_PACKAGE_NAME.equals(launchedFromPackage); final boolean launchedFromSettingsApp = SETTINGS_PACKAGE_NAME.equals(launchedFromPackage); UserHandle launchedFromUser = new UserHandle(UserHandle.getUserId( final UserHandle launchedFromUser = new UserHandle(UserHandle.getUserId( am.getLaunchedFromUid(activityToken))); am.getLaunchedFromUid(activityToken))); if (launchedFromUser != null && !launchedFromUser.equals(currentUser)) { if (launchedFromUser != null && !launchedFromUser.equals(currentUser)) { // Check it's secure // Check it's secure Loading @@ -478,14 +479,14 @@ public final class Utils extends com.android.settingslib.Utils { return launchedFromUser; return launchedFromUser; } } } } UserHandle extrasUser = getUserHandleFromBundle(intentExtras); final UserHandle extrasUser = getUserHandleFromBundle(intentExtras); if (extrasUser != null && !extrasUser.equals(currentUser)) { if (extrasUser != null && !extrasUser.equals(currentUser)) { // Check it's secure // Check it's secure if (launchedFromSettingsApp && isProfileOf(um, extrasUser)) { if (launchedFromSettingsApp && isProfileOf(um, extrasUser)) { return extrasUser; return extrasUser; } } } } UserHandle argumentsUser = getUserHandleFromBundle(arguments); final UserHandle argumentsUser = getUserHandleFromBundle(arguments); if (argumentsUser != null && !argumentsUser.equals(currentUser)) { if (argumentsUser != null && !argumentsUser.equals(currentUser)) { // Check it's secure // Check it's secure if (launchedFromSettingsApp && isProfileOf(um, argumentsUser)) { if (launchedFromSettingsApp && isProfileOf(um, argumentsUser)) { Loading Loading @@ -555,10 +556,11 @@ public final class Utils extends com.android.settingslib.Utils { } } public static ArraySet<String> getHandledDomains(PackageManager pm, String packageName) { public static ArraySet<String> getHandledDomains(PackageManager pm, String packageName) { List<IntentFilterVerificationInfo> iviList = pm.getIntentFilterVerifications(packageName); final List<IntentFilterVerificationInfo> iviList = List<IntentFilter> filters = pm.getAllIntentFilters(packageName); pm.getIntentFilterVerifications(packageName); final List<IntentFilter> filters = pm.getAllIntentFilters(packageName); ArraySet<String> result = new ArraySet<>(); final ArraySet<String> result = new ArraySet<>(); if (iviList != null && iviList.size() > 0) { if (iviList != null && iviList.size() > 0) { for (IntentFilterVerificationInfo ivi : iviList) { for (IntentFilterVerificationInfo ivi : iviList) { for (String host : ivi.getDomains()) { for (String host : ivi.getDomains()) { Loading @@ -582,16 +584,16 @@ public final class Utils extends com.android.settingslib.Utils { * Returns the application info of the currently installed MDM package. * Returns the application info of the currently installed MDM package. */ */ public static ApplicationInfo getAdminApplicationInfo(Context context, int profileId) { public static ApplicationInfo getAdminApplicationInfo(Context context, int profileId) { DevicePolicyManager dpm = final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName mdmPackage = dpm.getProfileOwnerAsUser(profileId); final ComponentName mdmPackage = dpm.getProfileOwnerAsUser(profileId); if (mdmPackage == null) { if (mdmPackage == null) { return null; return null; } } String mdmPackageName = mdmPackage.getPackageName(); final String mdmPackageName = mdmPackage.getPackageName(); try { try { IPackageManager ipm = AppGlobals.getPackageManager(); final IPackageManager ipm = AppGlobals.getPackageManager(); ApplicationInfo mdmApplicationInfo = final ApplicationInfo mdmApplicationInfo = ipm.getApplicationInfo(mdmPackageName, 0, profileId); ipm.getApplicationInfo(mdmPackageName, 0, profileId); return mdmApplicationInfo; return mdmApplicationInfo; } catch (RemoteException e) { } catch (RemoteException e) { Loading @@ -618,7 +620,7 @@ public final class Utils extends com.android.settingslib.Utils { */ */ public static SpannableString createAccessibleSequence(CharSequence displayText, public static SpannableString createAccessibleSequence(CharSequence displayText, String accessibileText) { String accessibileText) { SpannableString str = new SpannableString(displayText); final SpannableString str = new SpannableString(displayText); str.setSpan(new TtsSpan.TextBuilder(accessibileText).build(), 0, str.setSpan(new TtsSpan.TextBuilder(accessibileText).build(), 0, displayText.length(), displayText.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); Spannable.SPAN_INCLUSIVE_INCLUSIVE); Loading Loading @@ -652,7 +654,7 @@ public final class Utils extends com.android.settingslib.Utils { } } final boolean allowAnyUser = isInternal final boolean allowAnyUser = isInternal && bundle.getBoolean(ChooseLockSettingsHelper.EXTRA_ALLOW_ANY_USER, false); && bundle.getBoolean(ChooseLockSettingsHelper.EXTRA_ALLOW_ANY_USER, false); int userId = bundle.getInt(Intent.EXTRA_USER_ID, UserHandle.myUserId()); final int userId = bundle.getInt(Intent.EXTRA_USER_ID, UserHandle.myUserId()); if (userId == LockPatternUtils.USER_FRP) { if (userId == LockPatternUtils.USER_FRP) { return allowAnyUser ? userId : enforceSystemUser(context, userId); return allowAnyUser ? userId : enforceSystemUser(context, userId); } else { } else { Loading Loading @@ -699,7 +701,7 @@ public final class Utils extends com.android.settingslib.Utils { * Returns the user id of the credential owner of the given user id. * Returns the user id of the credential owner of the given user id. */ */ public static int getCredentialOwnerUserId(Context context, int userId) { public static int getCredentialOwnerUserId(Context context, int userId) { UserManager um = getUserManager(context); final UserManager um = getUserManager(context); return um.getCredentialOwnerProfile(userId); return um.getCredentialOwnerProfile(userId); } } Loading Loading @@ -799,7 +801,7 @@ public final class Utils extends com.android.settingslib.Utils { } } public static boolean hasFingerprintHardware(Context context) { public static boolean hasFingerprintHardware(Context context) { FingerprintManager fingerprintManager = getFingerprintManagerOrNull(context); final FingerprintManager fingerprintManager = getFingerprintManagerOrNull(context); return fingerprintManager != null && fingerprintManager.isHardwareDetected(); return fingerprintManager != null && fingerprintManager.isHardwareDetected(); } } Loading @@ -812,7 +814,7 @@ public final class Utils extends com.android.settingslib.Utils { } } public static boolean hasFaceHardware(Context context) { public static boolean hasFaceHardware(Context context) { FaceManager faceManager = getFaceManagerOrNull(context); final FaceManager faceManager = getFaceManagerOrNull(context); return faceManager != null && faceManager.isHardwareDetected(); return faceManager != null && faceManager.isHardwareDetected(); } } Loading Loading @@ -865,7 +867,7 @@ public final class Utils extends com.android.settingslib.Utils { public static VolumeInfo maybeInitializeVolume(StorageManager sm, Bundle bundle) { public static VolumeInfo maybeInitializeVolume(StorageManager sm, Bundle bundle) { final String volumeId = bundle.getString(VolumeInfo.EXTRA_VOLUME_ID, final String volumeId = bundle.getString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_PRIVATE_INTERNAL); VolumeInfo.ID_PRIVATE_INTERNAL); VolumeInfo volume = sm.findVolumeById(volumeId); final VolumeInfo volume = sm.findVolumeById(volumeId); return isVolumeValid(volume) ? volume : null; return isVolumeValid(volume) ? volume : null; } } Loading @@ -878,12 +880,13 @@ public final class Utils extends com.android.settingslib.Utils { */ */ public static boolean isProfileOrDeviceOwner(UserManager userManager, public static boolean isProfileOrDeviceOwner(UserManager userManager, DevicePolicyManager devicePolicyManager, String packageName) { DevicePolicyManager devicePolicyManager, String packageName) { List<UserInfo> userInfos = userManager.getUsers(); final List<UserInfo> userInfos = userManager.getUsers(); if (devicePolicyManager.isDeviceOwnerAppOnAnyUser(packageName)) { if (devicePolicyManager.isDeviceOwnerAppOnAnyUser(packageName)) { return true; return true; } } for (int i = 0, size = userInfos.size(); i < size; i++) { for (int i = 0, size = userInfos.size(); i < size; i++) { ComponentName cn = devicePolicyManager.getProfileOwnerAsUser(userInfos.get(i).id); final ComponentName cn = devicePolicyManager .getProfileOwnerAsUser(userInfos.get(i).id); if (cn != null && cn.getPackageName().equals(packageName)) { if (cn != null && cn.getPackageName().equals(packageName)) { return true; return true; } } Loading Loading @@ -938,9 +941,9 @@ public final class Utils extends com.android.settingslib.Utils { return original; return original; } } float scaleWidth = ((float) maxWidth) / actualWidth; final float scaleWidth = ((float) maxWidth) / actualWidth; float scaleHeight = ((float) maxHeight) / actualHeight; final float scaleHeight = ((float) maxHeight) / actualHeight; float scale = Math.min(scaleWidth, scaleHeight); final float scale = Math.min(scaleWidth, scaleHeight); final int width = (int) (actualWidth * scale); final int width = (int) (actualWidth * scale); final int height = (int) (actualHeight * scale); final int height = (int) (actualHeight * scale); Loading src/com/android/settings/datausage/BillingCyclePreference.java +23 −11 Original line number Original line Diff line number Diff line Loading @@ -26,27 +26,39 @@ import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.R; import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher; import com.android.settings.datausage.CellDataPreference.DataStateListener; import com.android.settings.network.MobileDataEnabledListener; public class BillingCyclePreference extends Preference implements TemplatePreference { /** * Preference which displays billing cycle of subscription */ public class BillingCyclePreference extends Preference implements TemplatePreference, MobileDataEnabledListener.Client { private NetworkTemplate mTemplate; private NetworkTemplate mTemplate; private NetworkServices mServices; private NetworkServices mServices; private int mSubId; private int mSubId; private MobileDataEnabledListener mListener; /** * Preference constructor * * @param context Context of preference * @param arrts The attributes of the XML tag that is inflating the preference */ public BillingCyclePreference(Context context, AttributeSet attrs) { public BillingCyclePreference(Context context, AttributeSet attrs) { super(context, attrs); super(context, attrs); mListener = new MobileDataEnabledListener(context, this); } } @Override @Override public void onAttached() { public void onAttached() { super.onAttached(); super.onAttached(); mListener.setListener(true, mSubId, getContext()); mListener.start(mSubId); } } @Override @Override public void onDetached() { public void onDetached() { mListener.setListener(false, mSubId, getContext()); mListener.stop(); super.onDetached(); super.onDetached(); } } Loading @@ -73,7 +85,7 @@ public class BillingCyclePreference extends Preference implements TemplatePrefer @Override @Override public Intent getIntent() { public Intent getIntent() { Bundle args = new Bundle(); final Bundle args = new Bundle(); args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate); args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate); return new SubSettingLauncher(getContext()) return new SubSettingLauncher(getContext()) .setDestination(BillingCycleSettings.class.getName()) .setDestination(BillingCycleSettings.class.getName()) Loading @@ -83,10 +95,10 @@ public class BillingCyclePreference extends Preference implements TemplatePrefer .toIntent(); .toIntent(); } } private final DataStateListener mListener = new DataStateListener() { /** @Override * Implementation of MobileDataEnabledListener.Client public void onChange(boolean selfChange) { */ public void onMobileDataEnabledChange() { updateEnabled(); updateEnabled(); } } }; } } src/com/android/settings/datausage/CellDataPreference.java +51 −75 Original line number Original line Diff line number Diff line Loading @@ -17,14 +17,9 @@ package com.android.settings.datausage; import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface; import android.database.ContentObserver; import android.net.NetworkTemplate; import android.net.NetworkTemplate; import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.Parcel; import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; import android.provider.Settings.Global; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; Loading @@ -39,33 +34,38 @@ import androidx.core.content.res.TypedArrayUtils; import androidx.preference.PreferenceViewHolder; import androidx.preference.PreferenceViewHolder; import com.android.settings.R; import com.android.settings.R; import com.android.settings.network.MobileDataEnabledListener; import com.android.settings.network.ProxySubscriptionManager; import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.CustomDialogPreferenceCompat; import com.android.settingslib.CustomDialogPreferenceCompat; import java.util.List; /** * Preference of cellular data control within Data Usage public class CellDataPreference extends CustomDialogPreferenceCompat implements TemplatePreference { */ public class CellDataPreference extends CustomDialogPreferenceCompat implements TemplatePreference, MobileDataEnabledListener.Client { private static final String TAG = "CellDataPreference"; private static final String TAG = "CellDataPreference"; public int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; public int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; public boolean mChecked; public boolean mChecked; public boolean mMultiSimDialog; public boolean mMultiSimDialog; private TelephonyManager mTelephonyManager; @VisibleForTesting @VisibleForTesting SubscriptionManager mSubscriptionManager; ProxySubscriptionManager mProxySubscriptionMgr; private MobileDataEnabledListener mDataStateListener; public CellDataPreference(Context context, AttributeSet attrs) { public CellDataPreference(Context context, AttributeSet attrs) { super(context, attrs, TypedArrayUtils.getAttr(context, super(context, attrs, TypedArrayUtils.getAttr(context, androidx.preference.R.attr.switchPreferenceStyle, androidx.preference.R.attr.switchPreferenceStyle, android.R.attr.switchPreferenceStyle)); android.R.attr.switchPreferenceStyle)); mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(context); mDataStateListener = new MobileDataEnabledListener(context, this); } } @Override @Override protected void onRestoreInstanceState(Parcelable s) { protected void onRestoreInstanceState(Parcelable s) { CellDataState state = (CellDataState) s; final CellDataState state = (CellDataState) s; super.onRestoreInstanceState(state.getSuperState()); super.onRestoreInstanceState(state.getSuperState()); mTelephonyManager = TelephonyManager.from(getContext()); mChecked = state.mChecked; mChecked = state.mChecked; mMultiSimDialog = state.mMultiSimDialog; mMultiSimDialog = state.mMultiSimDialog; if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { Loading @@ -77,7 +77,7 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements @Override @Override protected Parcelable onSaveInstanceState() { protected Parcelable onSaveInstanceState() { CellDataState state = new CellDataState(super.onSaveInstanceState()); final CellDataState state = new CellDataState(super.onSaveInstanceState()); state.mChecked = mChecked; state.mChecked = mChecked; state.mMultiSimDialog = mMultiSimDialog; state.mMultiSimDialog = mMultiSimDialog; state.mSubId = mSubId; state.mSubId = mSubId; Loading @@ -87,19 +87,14 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements @Override @Override public void onAttached() { public void onAttached() { super.onAttached(); super.onAttached(); mDataStateListener.setListener(true, mSubId, getContext()); mDataStateListener.start(mSubId); if (mSubscriptionManager!= null) { mProxySubscriptionMgr.addActiveSubscriptionsListener(mOnSubscriptionsChangeListener); mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); } } } @Override @Override public void onDetached() { public void onDetached() { mDataStateListener.setListener(false, mSubId, getContext()); mDataStateListener.stop(); if (mSubscriptionManager!= null) { mProxySubscriptionMgr.removeActiveSubscriptionsListener(mOnSubscriptionsChangeListener); mSubscriptionManager.removeOnSubscriptionsChangedListener( mOnSubscriptionsChangeListener); } super.onDetached(); super.onDetached(); } } Loading @@ -108,10 +103,9 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { throw new IllegalArgumentException("CellDataPreference needs a SubscriptionInfo"); throw new IllegalArgumentException("CellDataPreference needs a SubscriptionInfo"); } } mSubscriptionManager = SubscriptionManager.from(getContext()); mTelephonyManager = TelephonyManager.from(getContext()); mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(getContext()); mProxySubscriptionMgr.addActiveSubscriptionsListener(mOnSubscriptionsChangeListener); if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { mSubId = subId; mSubId = subId; Loading @@ -122,13 +116,13 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements } } private void updateChecked() { private void updateChecked() { setChecked(mTelephonyManager.getDataEnabled(mSubId)); setChecked(getContext().getSystemService(TelephonyManager.class).getDataEnabled(mSubId)); } } private void updateEnabled() { private void updateEnabled() { // If this subscription is not active, for example, SIM card is taken out, we disable // If this subscription is not active, for example, SIM card is taken out, we disable // the button. // the button. setEnabled(mSubscriptionManager.getActiveSubscriptionInfo(mSubId) != null); setEnabled(mProxySubscriptionMgr.getActiveSubscriptionInfo(mSubId) != null); } } @Override @Override Loading @@ -136,9 +130,10 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements final Context context = getContext(); final Context context = getContext(); FeatureFactory.getFactory(context).getMetricsFeatureProvider() FeatureFactory.getFactory(context).getMetricsFeatureProvider() .action(context, SettingsEnums.ACTION_CELL_DATA_TOGGLE, !mChecked); .action(context, SettingsEnums.ACTION_CELL_DATA_TOGGLE, !mChecked); final SubscriptionInfo currentSir = mSubscriptionManager.getActiveSubscriptionInfo( final SubscriptionInfo currentSir = mProxySubscriptionMgr.getActiveSubscriptionInfo( mSubId); mSubId); final SubscriptionInfo nextSir = mSubscriptionManager.getDefaultDataSubscriptionInfo(); final SubscriptionInfo nextSir = mProxySubscriptionMgr.getActiveSubscriptionInfo( SubscriptionManager.getDefaultDataSubscriptionId()); if (mChecked) { if (mChecked) { setMobileDataEnabled(false); setMobileDataEnabled(false); if (nextSir != null && currentSir != null if (nextSir != null && currentSir != null Loading @@ -153,7 +148,7 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements private void setMobileDataEnabled(boolean enabled) { private void setMobileDataEnabled(boolean enabled) { if (DataUsageSummary.LOGD) Log.d(TAG, "setMobileDataEnabled(" + enabled + "," if (DataUsageSummary.LOGD) Log.d(TAG, "setMobileDataEnabled(" + enabled + "," + mSubId + ")"); + mSubId + ")"); mTelephonyManager.setDataEnabled(mSubId, enabled); getContext().getSystemService(TelephonyManager.class).setDataEnabled(mSubId, enabled); setChecked(enabled); setChecked(enabled); } } Loading @@ -166,7 +161,7 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements @Override @Override public void onBindViewHolder(PreferenceViewHolder holder) { public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); super.onBindViewHolder(holder); View switchView = holder.findViewById(android.R.id.switch_widget); final View switchView = holder.findViewById(android.R.id.switch_widget); switchView.setClickable(false); switchView.setClickable(false); ((Checkable) switchView).setChecked(mChecked); ((Checkable) switchView).setChecked(mChecked); } } Loading @@ -191,8 +186,10 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements private void showMultiSimDialog(Builder builder, private void showMultiSimDialog(Builder builder, DialogInterface.OnClickListener listener) { DialogInterface.OnClickListener listener) { final SubscriptionInfo currentSir = mSubscriptionManager.getActiveSubscriptionInfo(mSubId); final SubscriptionInfo currentSir = mProxySubscriptionMgr.getActiveSubscriptionInfo( final SubscriptionInfo nextSir = mSubscriptionManager.getDefaultDataSubscriptionInfo(); mSubId); final SubscriptionInfo nextSir = mProxySubscriptionMgr.getActiveSubscriptionInfo( SubscriptionManager.getDefaultDataSubscriptionId()); final String previousName = (nextSir == null) final String previousName = (nextSir == null) ? getContext().getResources().getString(R.string.sim_selection_required_pref) ? getContext().getResources().getString(R.string.sim_selection_required_pref) Loading @@ -208,14 +205,10 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements } } private void disableDataForOtherSubscriptions(int subId) { private void disableDataForOtherSubscriptions(int subId) { List<SubscriptionInfo> subInfoList = mSubscriptionManager final SubscriptionInfo subInfo = mProxySubscriptionMgr.getActiveSubscriptionInfo( .getActiveSubscriptionInfoList(true); subId); if (subInfoList != null) { if (subInfo != null) { for (SubscriptionInfo subInfo : subInfoList) { getContext().getSystemService(TelephonyManager.class).setDataEnabled(subId, false); if (subInfo.getSubscriptionId() != subId) { mTelephonyManager.setDataEnabled(subInfo.getSubscriptionId(), false); } } } } } } Loading @@ -225,7 +218,7 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements return; return; } } if (mMultiSimDialog) { if (mMultiSimDialog) { mSubscriptionManager.setDefaultDataSubId(mSubId); mProxySubscriptionMgr.get().setDefaultDataSubId(mSubId); setMobileDataEnabled(true); setMobileDataEnabled(true); disableDataForOtherSubscriptions(mSubId); disableDataForOtherSubscriptions(mSubId); } else { } else { Loading @@ -235,10 +228,10 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements } } @VisibleForTesting @VisibleForTesting final SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangeListener final ProxySubscriptionManager.OnActiveSubscriptionChangedListener = new SubscriptionManager.OnSubscriptionsChangedListener() { mOnSubscriptionsChangeListener = @Override new ProxySubscriptionManager.OnActiveSubscriptionChangedListener() { public void onSubscriptionsChanged() { public void onChanged() { if (DataUsageSummary.LOGD) { if (DataUsageSummary.LOGD) { Log.d(TAG, "onSubscriptionsChanged"); Log.d(TAG, "onSubscriptionsChanged"); } } Loading @@ -246,30 +239,13 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements } } }; }; private final DataStateListener mDataStateListener = new DataStateListener() { /** @Override * Implementation of MobileDataEnabledListener.Client public void onChange(boolean selfChange) { */ @VisibleForTesting public void onMobileDataEnabledChange() { updateChecked(); updateChecked(); } } }; public abstract static class DataStateListener extends ContentObserver { public DataStateListener() { super(new Handler(Looper.getMainLooper())); } public void setListener(boolean listening, int subId, Context context) { if (listening) { Uri uri = Global.getUriFor(Global.MOBILE_DATA); if (TelephonyManager.getDefault().getSimCount() != 1) { uri = Global.getUriFor(Global.MOBILE_DATA + subId); } context.getContentResolver().registerContentObserver(uri, false, this); } else { context.getContentResolver().unregisterContentObserver(this); } } } public static class CellDataState extends BaseSavedState { public static class CellDataState extends BaseSavedState { public int mSubId; public int mSubId; Loading src/com/android/settings/datausage/DataUsageList.java +20 −15 File changed.Preview size limit exceeded, changes collapsed. Show changes src/com/android/settings/datausage/DataUsageSummary.java +7 −0 Original line number Original line Diff line number Diff line Loading @@ -33,6 +33,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.R; import com.android.settings.network.ProxySubscriptionManager; import com.android.settingslib.NetworkPolicyEditor; import com.android.settingslib.NetworkPolicyEditor; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; Loading Loading @@ -65,6 +66,7 @@ public class DataUsageSummary extends DataUsageBaseFragment implements DataUsage private DataUsageSummaryPreference mSummaryPreference; private DataUsageSummaryPreference mSummaryPreference; private DataUsageSummaryPreferenceController mSummaryController; private DataUsageSummaryPreferenceController mSummaryController; private NetworkTemplate mDefaultTemplate; private NetworkTemplate mDefaultTemplate; private ProxySubscriptionManager mProxySubscriptionMgr; @Override @Override public int getHelpResource() { public int getHelpResource() { Loading @@ -76,6 +78,11 @@ public class DataUsageSummary extends DataUsageBaseFragment implements DataUsage super.onCreate(icicle); super.onCreate(icicle); Context context = getContext(); Context context = getContext(); // enable ProxySubscriptionMgr with Lifecycle support for all controllers // live within this fragment mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(context); mProxySubscriptionMgr.setLifecycle(getLifecycle()); boolean hasMobileData = DataUsageUtils.hasMobileData(context); boolean hasMobileData = DataUsageUtils.hasMobileData(context); final int defaultSubId = SubscriptionManager.getDefaultDataSubscriptionId(); final int defaultSubId = SubscriptionManager.getDefaultDataSubscriptionId(); Loading Loading
src/com/android/settings/Utils.java +46 −43 Original line number Original line Diff line number Diff line Loading @@ -156,19 +156,19 @@ public final class Utils extends com.android.settingslib.Utils { public static boolean updatePreferenceToSpecificActivityOrRemove(Context context, public static boolean updatePreferenceToSpecificActivityOrRemove(Context context, PreferenceGroup parentPreferenceGroup, String preferenceKey, int flags) { PreferenceGroup parentPreferenceGroup, String preferenceKey, int flags) { Preference preference = parentPreferenceGroup.findPreference(preferenceKey); final Preference preference = parentPreferenceGroup.findPreference(preferenceKey); if (preference == null) { if (preference == null) { return false; return false; } } Intent intent = preference.getIntent(); final Intent intent = preference.getIntent(); if (intent != null) { if (intent != null) { // Find the activity that is in the system image // Find the activity that is in the system image PackageManager pm = context.getPackageManager(); final PackageManager pm = context.getPackageManager(); List<ResolveInfo> list = pm.queryIntentActivities(intent, 0); final List<ResolveInfo> list = pm.queryIntentActivities(intent, 0); int listSize = list.size(); final int listSize = list.size(); for (int i = 0; i < listSize; i++) { for (int i = 0; i < listSize; i++) { ResolveInfo resolveInfo = list.get(i); final ResolveInfo resolveInfo = list.get(i); if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { != 0) { Loading Loading @@ -199,7 +199,7 @@ public final class Utils extends com.android.settingslib.Utils { * @throws IllegalStateException if no UserManager could be retrieved. * @throws IllegalStateException if no UserManager could be retrieved. */ */ public static UserManager getUserManager(Context context) { public static UserManager getUserManager(Context context) { UserManager um = UserManager.get(context); final UserManager um = UserManager.get(context); if (um == null) { if (um == null) { throw new IllegalStateException("Unable to load UserManager"); throw new IllegalStateException("Unable to load UserManager"); } } Loading @@ -217,7 +217,7 @@ public final class Utils extends com.android.settingslib.Utils { * Returns whether the device is voice-capable (meaning, it is also a phone). * Returns whether the device is voice-capable (meaning, it is also a phone). */ */ public static boolean isVoiceCapable(Context context) { public static boolean isVoiceCapable(Context context) { TelephonyManager telephony = final TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return telephony != null && telephony.isVoiceCapable(); return telephony != null && telephony.isVoiceCapable(); } } Loading @@ -228,12 +228,12 @@ public final class Utils extends com.android.settingslib.Utils { * @return the formatted and newline-separated IP addresses, or null if none. * @return the formatted and newline-separated IP addresses, or null if none. */ */ public static String getWifiIpAddresses(Context context) { public static String getWifiIpAddresses(Context context) { WifiManager wifiManager = context.getSystemService(WifiManager.class); final WifiManager wifiManager = context.getSystemService(WifiManager.class); Network currentNetwork = wifiManager.getCurrentNetwork(); final Network currentNetwork = wifiManager.getCurrentNetwork(); if (currentNetwork != null) { if (currentNetwork != null) { ConnectivityManager cm = (ConnectivityManager) final ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); context.getSystemService(Context.CONNECTIVITY_SERVICE); LinkProperties prop = cm.getLinkProperties(currentNetwork); final LinkProperties prop = cm.getLinkProperties(currentNetwork); return formatIpAddresses(prop); return formatIpAddresses(prop); } } return null; return null; Loading @@ -241,7 +241,7 @@ public final class Utils extends com.android.settingslib.Utils { private static String formatIpAddresses(LinkProperties prop) { private static String formatIpAddresses(LinkProperties prop) { if (prop == null) return null; if (prop == null) return null; Iterator<InetAddress> iter = prop.getAllAddresses().iterator(); final Iterator<InetAddress> iter = prop.getAllAddresses().iterator(); // If there are no entries, return null // If there are no entries, return null if (!iter.hasNext()) return null; if (!iter.hasNext()) return null; // Concatenate all available addresses, comma separated // Concatenate all available addresses, comma separated Loading @@ -262,7 +262,7 @@ public final class Utils extends com.android.settingslib.Utils { // And : new Locale("en_US").toString() => "en_us" // And : new Locale("en_US").toString() => "en_us" if (null == localeStr) if (null == localeStr) return Locale.getDefault(); return Locale.getDefault(); String[] brokenDownLocale = localeStr.split("_", 3); final String[] brokenDownLocale = localeStr.split("_", 3); // split may not return a 0-length array. // split may not return a 0-length array. if (1 == brokenDownLocale.length) { if (1 == brokenDownLocale.length) { return new Locale(brokenDownLocale[0]); return new Locale(brokenDownLocale[0]); Loading Loading @@ -396,7 +396,7 @@ public final class Utils extends com.android.settingslib.Utils { * exists but it is disabled. * exists but it is disabled. */ */ public static UserHandle getManagedProfile(UserManager userManager) { public static UserHandle getManagedProfile(UserManager userManager) { List<UserHandle> userProfiles = userManager.getUserProfiles(); final List<UserHandle> userProfiles = userManager.getUserProfiles(); for (UserHandle profile : userProfiles) { for (UserHandle profile : userProfiles) { if (profile.getIdentifier() == userManager.getUserHandle()) { if (profile.getIdentifier() == userManager.getUserHandle()) { continue; continue; Loading @@ -420,7 +420,7 @@ public final class Utils extends com.android.settingslib.Utils { // we need to use UserManager.getProfiles that is available on API 23 (the one currently // we need to use UserManager.getProfiles that is available on API 23 (the one currently // used for Settings Robolectric tests). // used for Settings Robolectric tests). final int myUserId = UserHandle.myUserId(); final int myUserId = UserHandle.myUserId(); List<UserInfo> profiles = userManager.getProfiles(myUserId); final List<UserInfo> profiles = userManager.getProfiles(myUserId); final int count = profiles.size(); final int count = profiles.size(); for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { final UserInfo profile = profiles.get(i); final UserInfo profile = profiles.get(i); Loading @@ -438,7 +438,7 @@ public final class Utils extends com.android.settingslib.Utils { * @return the managed profile id or UserHandle.USER_NULL if there is none. * @return the managed profile id or UserHandle.USER_NULL if there is none. */ */ public static int getManagedProfileId(UserManager um, int parentUserId) { public static int getManagedProfileId(UserManager um, int parentUserId) { int[] profileIds = um.getProfileIdsWithDisabled(parentUserId); final int[] profileIds = um.getProfileIdsWithDisabled(parentUserId); for (int profileId : profileIds) { for (int profileId : profileIds) { if (profileId != parentUserId) { if (profileId != parentUserId) { return profileId; return profileId; Loading @@ -464,13 +464,14 @@ public final class Utils extends com.android.settingslib.Utils { */ */ public static UserHandle getSecureTargetUser(IBinder activityToken, public static UserHandle getSecureTargetUser(IBinder activityToken, UserManager um, @Nullable Bundle arguments, @Nullable Bundle intentExtras) { UserManager um, @Nullable Bundle arguments, @Nullable Bundle intentExtras) { UserHandle currentUser = new UserHandle(UserHandle.myUserId()); final UserHandle currentUser = new UserHandle(UserHandle.myUserId()); IActivityManager am = ActivityManager.getService(); final IActivityManager am = ActivityManager.getService(); try { try { String launchedFromPackage = am.getLaunchedFromPackage(activityToken); final String launchedFromPackage = am.getLaunchedFromPackage(activityToken); boolean launchedFromSettingsApp = SETTINGS_PACKAGE_NAME.equals(launchedFromPackage); final boolean launchedFromSettingsApp = SETTINGS_PACKAGE_NAME.equals(launchedFromPackage); UserHandle launchedFromUser = new UserHandle(UserHandle.getUserId( final UserHandle launchedFromUser = new UserHandle(UserHandle.getUserId( am.getLaunchedFromUid(activityToken))); am.getLaunchedFromUid(activityToken))); if (launchedFromUser != null && !launchedFromUser.equals(currentUser)) { if (launchedFromUser != null && !launchedFromUser.equals(currentUser)) { // Check it's secure // Check it's secure Loading @@ -478,14 +479,14 @@ public final class Utils extends com.android.settingslib.Utils { return launchedFromUser; return launchedFromUser; } } } } UserHandle extrasUser = getUserHandleFromBundle(intentExtras); final UserHandle extrasUser = getUserHandleFromBundle(intentExtras); if (extrasUser != null && !extrasUser.equals(currentUser)) { if (extrasUser != null && !extrasUser.equals(currentUser)) { // Check it's secure // Check it's secure if (launchedFromSettingsApp && isProfileOf(um, extrasUser)) { if (launchedFromSettingsApp && isProfileOf(um, extrasUser)) { return extrasUser; return extrasUser; } } } } UserHandle argumentsUser = getUserHandleFromBundle(arguments); final UserHandle argumentsUser = getUserHandleFromBundle(arguments); if (argumentsUser != null && !argumentsUser.equals(currentUser)) { if (argumentsUser != null && !argumentsUser.equals(currentUser)) { // Check it's secure // Check it's secure if (launchedFromSettingsApp && isProfileOf(um, argumentsUser)) { if (launchedFromSettingsApp && isProfileOf(um, argumentsUser)) { Loading Loading @@ -555,10 +556,11 @@ public final class Utils extends com.android.settingslib.Utils { } } public static ArraySet<String> getHandledDomains(PackageManager pm, String packageName) { public static ArraySet<String> getHandledDomains(PackageManager pm, String packageName) { List<IntentFilterVerificationInfo> iviList = pm.getIntentFilterVerifications(packageName); final List<IntentFilterVerificationInfo> iviList = List<IntentFilter> filters = pm.getAllIntentFilters(packageName); pm.getIntentFilterVerifications(packageName); final List<IntentFilter> filters = pm.getAllIntentFilters(packageName); ArraySet<String> result = new ArraySet<>(); final ArraySet<String> result = new ArraySet<>(); if (iviList != null && iviList.size() > 0) { if (iviList != null && iviList.size() > 0) { for (IntentFilterVerificationInfo ivi : iviList) { for (IntentFilterVerificationInfo ivi : iviList) { for (String host : ivi.getDomains()) { for (String host : ivi.getDomains()) { Loading @@ -582,16 +584,16 @@ public final class Utils extends com.android.settingslib.Utils { * Returns the application info of the currently installed MDM package. * Returns the application info of the currently installed MDM package. */ */ public static ApplicationInfo getAdminApplicationInfo(Context context, int profileId) { public static ApplicationInfo getAdminApplicationInfo(Context context, int profileId) { DevicePolicyManager dpm = final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName mdmPackage = dpm.getProfileOwnerAsUser(profileId); final ComponentName mdmPackage = dpm.getProfileOwnerAsUser(profileId); if (mdmPackage == null) { if (mdmPackage == null) { return null; return null; } } String mdmPackageName = mdmPackage.getPackageName(); final String mdmPackageName = mdmPackage.getPackageName(); try { try { IPackageManager ipm = AppGlobals.getPackageManager(); final IPackageManager ipm = AppGlobals.getPackageManager(); ApplicationInfo mdmApplicationInfo = final ApplicationInfo mdmApplicationInfo = ipm.getApplicationInfo(mdmPackageName, 0, profileId); ipm.getApplicationInfo(mdmPackageName, 0, profileId); return mdmApplicationInfo; return mdmApplicationInfo; } catch (RemoteException e) { } catch (RemoteException e) { Loading @@ -618,7 +620,7 @@ public final class Utils extends com.android.settingslib.Utils { */ */ public static SpannableString createAccessibleSequence(CharSequence displayText, public static SpannableString createAccessibleSequence(CharSequence displayText, String accessibileText) { String accessibileText) { SpannableString str = new SpannableString(displayText); final SpannableString str = new SpannableString(displayText); str.setSpan(new TtsSpan.TextBuilder(accessibileText).build(), 0, str.setSpan(new TtsSpan.TextBuilder(accessibileText).build(), 0, displayText.length(), displayText.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); Spannable.SPAN_INCLUSIVE_INCLUSIVE); Loading Loading @@ -652,7 +654,7 @@ public final class Utils extends com.android.settingslib.Utils { } } final boolean allowAnyUser = isInternal final boolean allowAnyUser = isInternal && bundle.getBoolean(ChooseLockSettingsHelper.EXTRA_ALLOW_ANY_USER, false); && bundle.getBoolean(ChooseLockSettingsHelper.EXTRA_ALLOW_ANY_USER, false); int userId = bundle.getInt(Intent.EXTRA_USER_ID, UserHandle.myUserId()); final int userId = bundle.getInt(Intent.EXTRA_USER_ID, UserHandle.myUserId()); if (userId == LockPatternUtils.USER_FRP) { if (userId == LockPatternUtils.USER_FRP) { return allowAnyUser ? userId : enforceSystemUser(context, userId); return allowAnyUser ? userId : enforceSystemUser(context, userId); } else { } else { Loading Loading @@ -699,7 +701,7 @@ public final class Utils extends com.android.settingslib.Utils { * Returns the user id of the credential owner of the given user id. * Returns the user id of the credential owner of the given user id. */ */ public static int getCredentialOwnerUserId(Context context, int userId) { public static int getCredentialOwnerUserId(Context context, int userId) { UserManager um = getUserManager(context); final UserManager um = getUserManager(context); return um.getCredentialOwnerProfile(userId); return um.getCredentialOwnerProfile(userId); } } Loading Loading @@ -799,7 +801,7 @@ public final class Utils extends com.android.settingslib.Utils { } } public static boolean hasFingerprintHardware(Context context) { public static boolean hasFingerprintHardware(Context context) { FingerprintManager fingerprintManager = getFingerprintManagerOrNull(context); final FingerprintManager fingerprintManager = getFingerprintManagerOrNull(context); return fingerprintManager != null && fingerprintManager.isHardwareDetected(); return fingerprintManager != null && fingerprintManager.isHardwareDetected(); } } Loading @@ -812,7 +814,7 @@ public final class Utils extends com.android.settingslib.Utils { } } public static boolean hasFaceHardware(Context context) { public static boolean hasFaceHardware(Context context) { FaceManager faceManager = getFaceManagerOrNull(context); final FaceManager faceManager = getFaceManagerOrNull(context); return faceManager != null && faceManager.isHardwareDetected(); return faceManager != null && faceManager.isHardwareDetected(); } } Loading Loading @@ -865,7 +867,7 @@ public final class Utils extends com.android.settingslib.Utils { public static VolumeInfo maybeInitializeVolume(StorageManager sm, Bundle bundle) { public static VolumeInfo maybeInitializeVolume(StorageManager sm, Bundle bundle) { final String volumeId = bundle.getString(VolumeInfo.EXTRA_VOLUME_ID, final String volumeId = bundle.getString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_PRIVATE_INTERNAL); VolumeInfo.ID_PRIVATE_INTERNAL); VolumeInfo volume = sm.findVolumeById(volumeId); final VolumeInfo volume = sm.findVolumeById(volumeId); return isVolumeValid(volume) ? volume : null; return isVolumeValid(volume) ? volume : null; } } Loading @@ -878,12 +880,13 @@ public final class Utils extends com.android.settingslib.Utils { */ */ public static boolean isProfileOrDeviceOwner(UserManager userManager, public static boolean isProfileOrDeviceOwner(UserManager userManager, DevicePolicyManager devicePolicyManager, String packageName) { DevicePolicyManager devicePolicyManager, String packageName) { List<UserInfo> userInfos = userManager.getUsers(); final List<UserInfo> userInfos = userManager.getUsers(); if (devicePolicyManager.isDeviceOwnerAppOnAnyUser(packageName)) { if (devicePolicyManager.isDeviceOwnerAppOnAnyUser(packageName)) { return true; return true; } } for (int i = 0, size = userInfos.size(); i < size; i++) { for (int i = 0, size = userInfos.size(); i < size; i++) { ComponentName cn = devicePolicyManager.getProfileOwnerAsUser(userInfos.get(i).id); final ComponentName cn = devicePolicyManager .getProfileOwnerAsUser(userInfos.get(i).id); if (cn != null && cn.getPackageName().equals(packageName)) { if (cn != null && cn.getPackageName().equals(packageName)) { return true; return true; } } Loading Loading @@ -938,9 +941,9 @@ public final class Utils extends com.android.settingslib.Utils { return original; return original; } } float scaleWidth = ((float) maxWidth) / actualWidth; final float scaleWidth = ((float) maxWidth) / actualWidth; float scaleHeight = ((float) maxHeight) / actualHeight; final float scaleHeight = ((float) maxHeight) / actualHeight; float scale = Math.min(scaleWidth, scaleHeight); final float scale = Math.min(scaleWidth, scaleHeight); final int width = (int) (actualWidth * scale); final int width = (int) (actualWidth * scale); final int height = (int) (actualHeight * scale); final int height = (int) (actualHeight * scale); Loading
src/com/android/settings/datausage/BillingCyclePreference.java +23 −11 Original line number Original line Diff line number Diff line Loading @@ -26,27 +26,39 @@ import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.R; import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher; import com.android.settings.datausage.CellDataPreference.DataStateListener; import com.android.settings.network.MobileDataEnabledListener; public class BillingCyclePreference extends Preference implements TemplatePreference { /** * Preference which displays billing cycle of subscription */ public class BillingCyclePreference extends Preference implements TemplatePreference, MobileDataEnabledListener.Client { private NetworkTemplate mTemplate; private NetworkTemplate mTemplate; private NetworkServices mServices; private NetworkServices mServices; private int mSubId; private int mSubId; private MobileDataEnabledListener mListener; /** * Preference constructor * * @param context Context of preference * @param arrts The attributes of the XML tag that is inflating the preference */ public BillingCyclePreference(Context context, AttributeSet attrs) { public BillingCyclePreference(Context context, AttributeSet attrs) { super(context, attrs); super(context, attrs); mListener = new MobileDataEnabledListener(context, this); } } @Override @Override public void onAttached() { public void onAttached() { super.onAttached(); super.onAttached(); mListener.setListener(true, mSubId, getContext()); mListener.start(mSubId); } } @Override @Override public void onDetached() { public void onDetached() { mListener.setListener(false, mSubId, getContext()); mListener.stop(); super.onDetached(); super.onDetached(); } } Loading @@ -73,7 +85,7 @@ public class BillingCyclePreference extends Preference implements TemplatePrefer @Override @Override public Intent getIntent() { public Intent getIntent() { Bundle args = new Bundle(); final Bundle args = new Bundle(); args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate); args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate); return new SubSettingLauncher(getContext()) return new SubSettingLauncher(getContext()) .setDestination(BillingCycleSettings.class.getName()) .setDestination(BillingCycleSettings.class.getName()) Loading @@ -83,10 +95,10 @@ public class BillingCyclePreference extends Preference implements TemplatePrefer .toIntent(); .toIntent(); } } private final DataStateListener mListener = new DataStateListener() { /** @Override * Implementation of MobileDataEnabledListener.Client public void onChange(boolean selfChange) { */ public void onMobileDataEnabledChange() { updateEnabled(); updateEnabled(); } } }; } }
src/com/android/settings/datausage/CellDataPreference.java +51 −75 Original line number Original line Diff line number Diff line Loading @@ -17,14 +17,9 @@ package com.android.settings.datausage; import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface; import android.database.ContentObserver; import android.net.NetworkTemplate; import android.net.NetworkTemplate; import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.Parcel; import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; import android.provider.Settings.Global; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; Loading @@ -39,33 +34,38 @@ import androidx.core.content.res.TypedArrayUtils; import androidx.preference.PreferenceViewHolder; import androidx.preference.PreferenceViewHolder; import com.android.settings.R; import com.android.settings.R; import com.android.settings.network.MobileDataEnabledListener; import com.android.settings.network.ProxySubscriptionManager; import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.CustomDialogPreferenceCompat; import com.android.settingslib.CustomDialogPreferenceCompat; import java.util.List; /** * Preference of cellular data control within Data Usage public class CellDataPreference extends CustomDialogPreferenceCompat implements TemplatePreference { */ public class CellDataPreference extends CustomDialogPreferenceCompat implements TemplatePreference, MobileDataEnabledListener.Client { private static final String TAG = "CellDataPreference"; private static final String TAG = "CellDataPreference"; public int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; public int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; public boolean mChecked; public boolean mChecked; public boolean mMultiSimDialog; public boolean mMultiSimDialog; private TelephonyManager mTelephonyManager; @VisibleForTesting @VisibleForTesting SubscriptionManager mSubscriptionManager; ProxySubscriptionManager mProxySubscriptionMgr; private MobileDataEnabledListener mDataStateListener; public CellDataPreference(Context context, AttributeSet attrs) { public CellDataPreference(Context context, AttributeSet attrs) { super(context, attrs, TypedArrayUtils.getAttr(context, super(context, attrs, TypedArrayUtils.getAttr(context, androidx.preference.R.attr.switchPreferenceStyle, androidx.preference.R.attr.switchPreferenceStyle, android.R.attr.switchPreferenceStyle)); android.R.attr.switchPreferenceStyle)); mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(context); mDataStateListener = new MobileDataEnabledListener(context, this); } } @Override @Override protected void onRestoreInstanceState(Parcelable s) { protected void onRestoreInstanceState(Parcelable s) { CellDataState state = (CellDataState) s; final CellDataState state = (CellDataState) s; super.onRestoreInstanceState(state.getSuperState()); super.onRestoreInstanceState(state.getSuperState()); mTelephonyManager = TelephonyManager.from(getContext()); mChecked = state.mChecked; mChecked = state.mChecked; mMultiSimDialog = state.mMultiSimDialog; mMultiSimDialog = state.mMultiSimDialog; if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { Loading @@ -77,7 +77,7 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements @Override @Override protected Parcelable onSaveInstanceState() { protected Parcelable onSaveInstanceState() { CellDataState state = new CellDataState(super.onSaveInstanceState()); final CellDataState state = new CellDataState(super.onSaveInstanceState()); state.mChecked = mChecked; state.mChecked = mChecked; state.mMultiSimDialog = mMultiSimDialog; state.mMultiSimDialog = mMultiSimDialog; state.mSubId = mSubId; state.mSubId = mSubId; Loading @@ -87,19 +87,14 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements @Override @Override public void onAttached() { public void onAttached() { super.onAttached(); super.onAttached(); mDataStateListener.setListener(true, mSubId, getContext()); mDataStateListener.start(mSubId); if (mSubscriptionManager!= null) { mProxySubscriptionMgr.addActiveSubscriptionsListener(mOnSubscriptionsChangeListener); mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); } } } @Override @Override public void onDetached() { public void onDetached() { mDataStateListener.setListener(false, mSubId, getContext()); mDataStateListener.stop(); if (mSubscriptionManager!= null) { mProxySubscriptionMgr.removeActiveSubscriptionsListener(mOnSubscriptionsChangeListener); mSubscriptionManager.removeOnSubscriptionsChangedListener( mOnSubscriptionsChangeListener); } super.onDetached(); super.onDetached(); } } Loading @@ -108,10 +103,9 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { throw new IllegalArgumentException("CellDataPreference needs a SubscriptionInfo"); throw new IllegalArgumentException("CellDataPreference needs a SubscriptionInfo"); } } mSubscriptionManager = SubscriptionManager.from(getContext()); mTelephonyManager = TelephonyManager.from(getContext()); mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(getContext()); mProxySubscriptionMgr.addActiveSubscriptionsListener(mOnSubscriptionsChangeListener); if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { mSubId = subId; mSubId = subId; Loading @@ -122,13 +116,13 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements } } private void updateChecked() { private void updateChecked() { setChecked(mTelephonyManager.getDataEnabled(mSubId)); setChecked(getContext().getSystemService(TelephonyManager.class).getDataEnabled(mSubId)); } } private void updateEnabled() { private void updateEnabled() { // If this subscription is not active, for example, SIM card is taken out, we disable // If this subscription is not active, for example, SIM card is taken out, we disable // the button. // the button. setEnabled(mSubscriptionManager.getActiveSubscriptionInfo(mSubId) != null); setEnabled(mProxySubscriptionMgr.getActiveSubscriptionInfo(mSubId) != null); } } @Override @Override Loading @@ -136,9 +130,10 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements final Context context = getContext(); final Context context = getContext(); FeatureFactory.getFactory(context).getMetricsFeatureProvider() FeatureFactory.getFactory(context).getMetricsFeatureProvider() .action(context, SettingsEnums.ACTION_CELL_DATA_TOGGLE, !mChecked); .action(context, SettingsEnums.ACTION_CELL_DATA_TOGGLE, !mChecked); final SubscriptionInfo currentSir = mSubscriptionManager.getActiveSubscriptionInfo( final SubscriptionInfo currentSir = mProxySubscriptionMgr.getActiveSubscriptionInfo( mSubId); mSubId); final SubscriptionInfo nextSir = mSubscriptionManager.getDefaultDataSubscriptionInfo(); final SubscriptionInfo nextSir = mProxySubscriptionMgr.getActiveSubscriptionInfo( SubscriptionManager.getDefaultDataSubscriptionId()); if (mChecked) { if (mChecked) { setMobileDataEnabled(false); setMobileDataEnabled(false); if (nextSir != null && currentSir != null if (nextSir != null && currentSir != null Loading @@ -153,7 +148,7 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements private void setMobileDataEnabled(boolean enabled) { private void setMobileDataEnabled(boolean enabled) { if (DataUsageSummary.LOGD) Log.d(TAG, "setMobileDataEnabled(" + enabled + "," if (DataUsageSummary.LOGD) Log.d(TAG, "setMobileDataEnabled(" + enabled + "," + mSubId + ")"); + mSubId + ")"); mTelephonyManager.setDataEnabled(mSubId, enabled); getContext().getSystemService(TelephonyManager.class).setDataEnabled(mSubId, enabled); setChecked(enabled); setChecked(enabled); } } Loading @@ -166,7 +161,7 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements @Override @Override public void onBindViewHolder(PreferenceViewHolder holder) { public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); super.onBindViewHolder(holder); View switchView = holder.findViewById(android.R.id.switch_widget); final View switchView = holder.findViewById(android.R.id.switch_widget); switchView.setClickable(false); switchView.setClickable(false); ((Checkable) switchView).setChecked(mChecked); ((Checkable) switchView).setChecked(mChecked); } } Loading @@ -191,8 +186,10 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements private void showMultiSimDialog(Builder builder, private void showMultiSimDialog(Builder builder, DialogInterface.OnClickListener listener) { DialogInterface.OnClickListener listener) { final SubscriptionInfo currentSir = mSubscriptionManager.getActiveSubscriptionInfo(mSubId); final SubscriptionInfo currentSir = mProxySubscriptionMgr.getActiveSubscriptionInfo( final SubscriptionInfo nextSir = mSubscriptionManager.getDefaultDataSubscriptionInfo(); mSubId); final SubscriptionInfo nextSir = mProxySubscriptionMgr.getActiveSubscriptionInfo( SubscriptionManager.getDefaultDataSubscriptionId()); final String previousName = (nextSir == null) final String previousName = (nextSir == null) ? getContext().getResources().getString(R.string.sim_selection_required_pref) ? getContext().getResources().getString(R.string.sim_selection_required_pref) Loading @@ -208,14 +205,10 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements } } private void disableDataForOtherSubscriptions(int subId) { private void disableDataForOtherSubscriptions(int subId) { List<SubscriptionInfo> subInfoList = mSubscriptionManager final SubscriptionInfo subInfo = mProxySubscriptionMgr.getActiveSubscriptionInfo( .getActiveSubscriptionInfoList(true); subId); if (subInfoList != null) { if (subInfo != null) { for (SubscriptionInfo subInfo : subInfoList) { getContext().getSystemService(TelephonyManager.class).setDataEnabled(subId, false); if (subInfo.getSubscriptionId() != subId) { mTelephonyManager.setDataEnabled(subInfo.getSubscriptionId(), false); } } } } } } Loading @@ -225,7 +218,7 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements return; return; } } if (mMultiSimDialog) { if (mMultiSimDialog) { mSubscriptionManager.setDefaultDataSubId(mSubId); mProxySubscriptionMgr.get().setDefaultDataSubId(mSubId); setMobileDataEnabled(true); setMobileDataEnabled(true); disableDataForOtherSubscriptions(mSubId); disableDataForOtherSubscriptions(mSubId); } else { } else { Loading @@ -235,10 +228,10 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements } } @VisibleForTesting @VisibleForTesting final SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangeListener final ProxySubscriptionManager.OnActiveSubscriptionChangedListener = new SubscriptionManager.OnSubscriptionsChangedListener() { mOnSubscriptionsChangeListener = @Override new ProxySubscriptionManager.OnActiveSubscriptionChangedListener() { public void onSubscriptionsChanged() { public void onChanged() { if (DataUsageSummary.LOGD) { if (DataUsageSummary.LOGD) { Log.d(TAG, "onSubscriptionsChanged"); Log.d(TAG, "onSubscriptionsChanged"); } } Loading @@ -246,30 +239,13 @@ public class CellDataPreference extends CustomDialogPreferenceCompat implements } } }; }; private final DataStateListener mDataStateListener = new DataStateListener() { /** @Override * Implementation of MobileDataEnabledListener.Client public void onChange(boolean selfChange) { */ @VisibleForTesting public void onMobileDataEnabledChange() { updateChecked(); updateChecked(); } } }; public abstract static class DataStateListener extends ContentObserver { public DataStateListener() { super(new Handler(Looper.getMainLooper())); } public void setListener(boolean listening, int subId, Context context) { if (listening) { Uri uri = Global.getUriFor(Global.MOBILE_DATA); if (TelephonyManager.getDefault().getSimCount() != 1) { uri = Global.getUriFor(Global.MOBILE_DATA + subId); } context.getContentResolver().registerContentObserver(uri, false, this); } else { context.getContentResolver().unregisterContentObserver(this); } } } public static class CellDataState extends BaseSavedState { public static class CellDataState extends BaseSavedState { public int mSubId; public int mSubId; Loading
src/com/android/settings/datausage/DataUsageList.java +20 −15 File changed.Preview size limit exceeded, changes collapsed. Show changes
src/com/android/settings/datausage/DataUsageSummary.java +7 −0 Original line number Original line Diff line number Diff line Loading @@ -33,6 +33,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.R; import com.android.settings.network.ProxySubscriptionManager; import com.android.settingslib.NetworkPolicyEditor; import com.android.settingslib.NetworkPolicyEditor; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; Loading Loading @@ -65,6 +66,7 @@ public class DataUsageSummary extends DataUsageBaseFragment implements DataUsage private DataUsageSummaryPreference mSummaryPreference; private DataUsageSummaryPreference mSummaryPreference; private DataUsageSummaryPreferenceController mSummaryController; private DataUsageSummaryPreferenceController mSummaryController; private NetworkTemplate mDefaultTemplate; private NetworkTemplate mDefaultTemplate; private ProxySubscriptionManager mProxySubscriptionMgr; @Override @Override public int getHelpResource() { public int getHelpResource() { Loading @@ -76,6 +78,11 @@ public class DataUsageSummary extends DataUsageBaseFragment implements DataUsage super.onCreate(icicle); super.onCreate(icicle); Context context = getContext(); Context context = getContext(); // enable ProxySubscriptionMgr with Lifecycle support for all controllers // live within this fragment mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(context); mProxySubscriptionMgr.setLifecycle(getLifecycle()); boolean hasMobileData = DataUsageUtils.hasMobileData(context); boolean hasMobileData = DataUsageUtils.hasMobileData(context); final int defaultSubId = SubscriptionManager.getDefaultDataSubscriptionId(); final int defaultSubId = SubscriptionManager.getDefaultDataSubscriptionId(); Loading