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