• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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 
17 package com.android.settings.homepage.contextualcards.conditional;
18 
19 import android.app.settings.SettingsEnums;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.net.ConnectivityManager;
23 import android.telephony.PhoneStateListener;
24 import android.telephony.PreciseDataConnectionState;
25 import android.telephony.SubscriptionManager;
26 import android.telephony.TelephonyManager;
27 
28 import com.android.settings.R;
29 import com.android.settings.Settings;
30 import com.android.settings.homepage.contextualcards.ContextualCard;
31 import com.android.settings.network.GlobalSettingsChangeListener;
32 
33 import java.util.Objects;
34 
35 public class CellularDataConditionController implements ConditionalCardController {
36 
37     static final int ID = Objects.hash("CellularDataConditionController");
38 
39     private final Context mAppContext;
40     private final ConditionManager mConditionManager;
41     private final GlobalSettingsChangeListener mDefaultDataSubscriptionIdListener;
42     private final ConnectivityManager mConnectivityManager;
43 
44     private int mSubId;
45     private TelephonyManager mTelephonyManager;
46     private boolean mIsListeningConnectionChange;
47 
CellularDataConditionController(Context appContext, ConditionManager conditionManager)48     public CellularDataConditionController(Context appContext, ConditionManager conditionManager) {
49         mAppContext = appContext;
50         mConditionManager = conditionManager;
51         mSubId = getDefaultDataSubscriptionId(appContext);
52         mTelephonyManager = getTelephonyManager(appContext, mSubId);
53         mDefaultDataSubscriptionIdListener = new GlobalSettingsChangeListener(appContext,
54                 android.provider.Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION) {
55             public void onChanged(String field) {
56                 final int subId = getDefaultDataSubscriptionId(mAppContext);
57                 if (subId == mSubId) {
58                     return;
59                 }
60                 mSubId = subId;
61                 if (mIsListeningConnectionChange) {
62                     restartPhoneStateListener(mAppContext, subId);
63                 }
64             }
65         };
66         mConnectivityManager = appContext.getSystemService(
67                 ConnectivityManager.class);
68     }
69 
70     @Override
getId()71     public long getId() {
72         return ID;
73     }
74 
75     @Override
isDisplayable()76     public boolean isDisplayable() {
77         if (!mConnectivityManager.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)
78                 || mTelephonyManager.getSimState() != TelephonyManager.SIM_STATE_READY) {
79             return false;
80         }
81         return !mTelephonyManager.isDataEnabled();
82     }
83 
84     @Override
onPrimaryClick(Context context)85     public void onPrimaryClick(Context context) {
86         context.startActivity(new Intent(context,
87                 Settings.DataUsageSummaryActivity.class));
88     }
89 
90     @Override
onActionClick()91     public void onActionClick() {
92         mTelephonyManager.setDataEnabled(true);
93     }
94 
95     @Override
buildContextualCard()96     public ContextualCard buildContextualCard() {
97         return new ConditionalContextualCard.Builder()
98                 .setConditionId(ID)
99                 .setMetricsConstant(SettingsEnums.SETTINGS_CONDITION_CELLULAR_DATA)
100                 .setActionText(mAppContext.getText(R.string.condition_turn_on))
101                 .setName(mAppContext.getPackageName() + "/"
102                         + mAppContext.getText(R.string.condition_cellular_title))
103                 .setTitleText(mAppContext.getText(R.string.condition_cellular_title).toString())
104                 .setSummaryText(mAppContext.getText(R.string.condition_cellular_summary).toString())
105                 .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_cellular_off))
106                 .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)
107                 .build();
108     }
109 
110     @Override
startMonitoringStateChange()111     public void startMonitoringStateChange() {
112         restartPhoneStateListener(mAppContext, mSubId);
113     }
114 
115     @Override
stopMonitoringStateChange()116     public void stopMonitoringStateChange() {
117         stopPhoneStateListener();
118     }
119 
getDefaultDataSubscriptionId(Context context)120     private int getDefaultDataSubscriptionId(Context context) {
121         final SubscriptionManager subscriptionManager =
122                 context.getSystemService(SubscriptionManager.class);
123         return subscriptionManager.getDefaultDataSubscriptionId();
124     }
125 
getTelephonyManager(Context context, int subId)126     private TelephonyManager getTelephonyManager(Context context, int subId) {
127         final TelephonyManager telephonyManager =
128                 context.getSystemService(TelephonyManager.class);
129         return telephonyManager.createForSubscriptionId(subId);
130     }
131 
132     private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
133         @Override
134         public void onPreciseDataConnectionStateChanged(
135                 PreciseDataConnectionState dataConnectionState) {
136             mConditionManager.onConditionChanged();
137         }
138     };
139 
stopPhoneStateListener()140     private void stopPhoneStateListener() {
141         mIsListeningConnectionChange = false;
142         mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
143     }
144 
145     // restart monitoring when subscription has been changed
restartPhoneStateListener(Context context, int subId)146     private void restartPhoneStateListener(Context context, int subId) {
147         stopPhoneStateListener();
148         mIsListeningConnectionChange = true;
149 
150         // switch mTelephonyManager only when subscription been updated to valid ones
151         if (SubscriptionManager.isValidSubscriptionId(subId)) {
152             mTelephonyManager = getTelephonyManager(context, subId);
153         }
154 
155         mTelephonyManager.listen(mPhoneStateListener,
156                 PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE);
157     }
158 }
159