1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.settings.network; 17 18 import static android.os.UserHandle.myUserId; 19 import static android.os.UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS; 20 21 import android.content.BroadcastReceiver; 22 import android.content.ComponentName; 23 import android.content.Context; 24 import android.content.Intent; 25 import android.content.IntentFilter; 26 import android.os.UserManager; 27 import android.provider.Settings; 28 import android.telephony.PhoneStateListener; 29 import android.telephony.ServiceState; 30 import android.telephony.TelephonyManager; 31 import android.util.FeatureFlagUtils; 32 33 import androidx.annotation.VisibleForTesting; 34 import androidx.preference.Preference; 35 import androidx.preference.PreferenceScreen; 36 37 import com.android.settings.core.FeatureFlags; 38 import com.android.settings.core.PreferenceControllerMixin; 39 import com.android.settings.network.telephony.MobileNetworkActivity; 40 import com.android.settingslib.RestrictedLockUtilsInternal; 41 import com.android.settingslib.RestrictedPreference; 42 import com.android.settingslib.Utils; 43 import com.android.settingslib.core.AbstractPreferenceController; 44 import com.android.settingslib.core.lifecycle.LifecycleObserver; 45 import com.android.settingslib.core.lifecycle.events.OnStart; 46 import com.android.settingslib.core.lifecycle.events.OnStop; 47 48 public class MobileNetworkPreferenceController extends AbstractPreferenceController 49 implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop { 50 51 @VisibleForTesting 52 static final String KEY_MOBILE_NETWORK_SETTINGS = "mobile_network_settings"; 53 @VisibleForTesting 54 static final String MOBILE_NETWORK_PACKAGE = "com.android.phone"; 55 @VisibleForTesting 56 static final String MOBILE_NETWORK_CLASS = "com.android.phone.MobileNetworkSettings"; 57 58 private final boolean mIsSecondaryUser; 59 private final TelephonyManager mTelephonyManager; 60 private final UserManager mUserManager; 61 private Preference mPreference; 62 @VisibleForTesting 63 PhoneStateListener mPhoneStateListener; 64 65 private BroadcastReceiver mAirplanModeChangedReceiver; 66 MobileNetworkPreferenceController(Context context)67 public MobileNetworkPreferenceController(Context context) { 68 super(context); 69 mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); 70 mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 71 mIsSecondaryUser = !mUserManager.isAdminUser(); 72 73 mAirplanModeChangedReceiver = new BroadcastReceiver() { 74 @Override 75 public void onReceive(Context context, Intent intent) { 76 updateState(mPreference); 77 } 78 }; 79 } 80 81 @Override isAvailable()82 public boolean isAvailable() { 83 return !isUserRestricted() && !Utils.isWifiOnly(mContext); 84 } 85 isUserRestricted()86 public boolean isUserRestricted() { 87 return mIsSecondaryUser || 88 RestrictedLockUtilsInternal.hasBaseUserRestriction( 89 mContext, 90 DISALLOW_CONFIG_MOBILE_NETWORKS, 91 myUserId()); 92 } 93 94 @Override displayPreference(PreferenceScreen screen)95 public void displayPreference(PreferenceScreen screen) { 96 super.displayPreference(screen); 97 mPreference = screen.findPreference(getPreferenceKey()); 98 } 99 100 @Override getPreferenceKey()101 public String getPreferenceKey() { 102 return KEY_MOBILE_NETWORK_SETTINGS; 103 } 104 105 @Override onStart()106 public void onStart() { 107 if (isAvailable()) { 108 if (mPhoneStateListener == null) { 109 mPhoneStateListener = new PhoneStateListener() { 110 @Override 111 public void onServiceStateChanged(ServiceState serviceState) { 112 updateState(mPreference); 113 } 114 }; 115 } 116 mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE); 117 } 118 if (mAirplanModeChangedReceiver != null) { 119 mContext.registerReceiver(mAirplanModeChangedReceiver, 120 new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); 121 } 122 } 123 124 @Override onStop()125 public void onStop() { 126 if (mPhoneStateListener != null) { 127 mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); 128 } 129 if (mAirplanModeChangedReceiver != null) { 130 mContext.unregisterReceiver(mAirplanModeChangedReceiver); 131 } 132 } 133 134 @Override updateState(Preference preference)135 public void updateState(Preference preference) { 136 super.updateState(preference); 137 138 if (preference instanceof RestrictedPreference && 139 ((RestrictedPreference) preference).isDisabledByAdmin()) { 140 return; 141 } 142 preference.setEnabled(Settings.Global.getInt( 143 mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) == 0); 144 } 145 146 @Override handlePreferenceTreeClick(Preference preference)147 public boolean handlePreferenceTreeClick(Preference preference) { 148 if (KEY_MOBILE_NETWORK_SETTINGS.equals(preference.getKey())) { 149 if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.MOBILE_NETWORK_V2)) { 150 final Intent intent = new Intent(mContext, MobileNetworkActivity.class); 151 mContext.startActivity(intent); 152 } else { 153 final Intent intent = new Intent(Intent.ACTION_MAIN); 154 intent.setComponent( 155 new ComponentName(MOBILE_NETWORK_PACKAGE, MOBILE_NETWORK_CLASS)); 156 mContext.startActivity(intent); 157 } 158 return true; 159 } 160 return false; 161 } 162 163 @Override getSummary()164 public CharSequence getSummary() { 165 return mTelephonyManager.getNetworkOperatorName(); 166 } 167 } 168