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 static com.android.settings.Utils.SETTINGS_PACKAGE_NAME; 22 23 import static androidx.lifecycle.Lifecycle.Event; 24 25 import android.content.BroadcastReceiver; 26 import android.content.Context; 27 import android.content.Intent; 28 import android.content.IntentFilter; 29 import android.os.UserManager; 30 import android.provider.Settings; 31 import android.telephony.PhoneStateListener; 32 import android.telephony.ServiceState; 33 import android.telephony.TelephonyCallback; 34 import android.telephony.TelephonyManager; 35 36 import androidx.annotation.VisibleForTesting; 37 import androidx.lifecycle.LifecycleObserver; 38 import androidx.lifecycle.OnLifecycleEvent; 39 import androidx.preference.Preference; 40 import androidx.preference.PreferenceScreen; 41 42 import com.android.settings.core.PreferenceControllerMixin; 43 import com.android.settings.network.telephony.MobileNetworkUtils; 44 import com.android.settingslib.RestrictedLockUtilsInternal; 45 import com.android.settingslib.RestrictedPreference; 46 import com.android.settingslib.Utils; 47 import com.android.settingslib.core.AbstractPreferenceController; 48 49 public class MobileNetworkPreferenceController extends AbstractPreferenceController 50 implements PreferenceControllerMixin, LifecycleObserver { 51 52 @VisibleForTesting 53 static final String KEY_MOBILE_NETWORK_SETTINGS = "mobile_network_settings"; 54 55 private final boolean mIsSecondaryUser; 56 private final TelephonyManager mTelephonyManager; 57 private final UserManager mUserManager; 58 private Preference mPreference; 59 @VisibleForTesting 60 MobileNetworkTelephonyCallback mTelephonyCallback; 61 62 private BroadcastReceiver mAirplanModeChangedReceiver; 63 MobileNetworkPreferenceController(Context context)64 public MobileNetworkPreferenceController(Context context) { 65 super(context); 66 mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); 67 mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 68 mIsSecondaryUser = !mUserManager.isAdminUser(); 69 70 mAirplanModeChangedReceiver = new BroadcastReceiver() { 71 @Override 72 public void onReceive(Context context, Intent intent) { 73 updateState(mPreference); 74 } 75 }; 76 } 77 78 @Override isAvailable()79 public boolean isAvailable() { 80 return !isUserRestricted() && !Utils.isWifiOnly(mContext); 81 } 82 isUserRestricted()83 public boolean isUserRestricted() { 84 return mIsSecondaryUser || 85 RestrictedLockUtilsInternal.hasBaseUserRestriction( 86 mContext, 87 DISALLOW_CONFIG_MOBILE_NETWORKS, 88 myUserId()); 89 } 90 91 @Override displayPreference(PreferenceScreen screen)92 public void displayPreference(PreferenceScreen screen) { 93 super.displayPreference(screen); 94 mPreference = screen.findPreference(getPreferenceKey()); 95 } 96 97 @Override getPreferenceKey()98 public String getPreferenceKey() { 99 return KEY_MOBILE_NETWORK_SETTINGS; 100 } 101 102 class MobileNetworkTelephonyCallback extends TelephonyCallback implements 103 TelephonyCallback.ServiceStateListener { 104 @Override onServiceStateChanged(ServiceState serviceState)105 public void onServiceStateChanged(ServiceState serviceState) { 106 updateState(mPreference); 107 } 108 } 109 110 @OnLifecycleEvent(Event.ON_START) onStart()111 public void onStart() { 112 if (isAvailable()) { 113 if (mTelephonyCallback == null) { 114 mTelephonyCallback = new MobileNetworkTelephonyCallback(); 115 } 116 mTelephonyManager.registerTelephonyCallback( 117 mContext.getMainExecutor(), mTelephonyCallback); 118 } 119 if (mAirplanModeChangedReceiver != null) { 120 mContext.registerReceiver(mAirplanModeChangedReceiver, 121 new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); 122 } 123 } 124 125 @OnLifecycleEvent(Event.ON_STOP) onStop()126 public void onStop() { 127 if (mTelephonyCallback != null) { 128 mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); 129 } 130 if (mAirplanModeChangedReceiver != null) { 131 mContext.unregisterReceiver(mAirplanModeChangedReceiver); 132 } 133 } 134 135 @Override updateState(Preference preference)136 public void updateState(Preference preference) { 137 super.updateState(preference); 138 139 if (preference instanceof RestrictedPreference && 140 ((RestrictedPreference) preference).isDisabledByAdmin()) { 141 return; 142 } 143 preference.setEnabled(Settings.Global.getInt( 144 mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) == 0); 145 } 146 147 @Override handlePreferenceTreeClick(Preference preference)148 public boolean handlePreferenceTreeClick(Preference preference) { 149 if (KEY_MOBILE_NETWORK_SETTINGS.equals(preference.getKey())) { 150 final Intent intent = new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS); 151 intent.setPackage(SETTINGS_PACKAGE_NAME); 152 mContext.startActivity(intent); 153 return true; 154 } 155 return false; 156 } 157 158 @Override getSummary()159 public CharSequence getSummary() { 160 return MobileNetworkUtils.getCurrentCarrierNameForDisplay(mContext); 161 } 162 } 163