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