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