• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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.sim;
18 
19 import static android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING;
20 
21 import android.app.Activity;
22 import android.app.Dialog;
23 import android.app.settings.SettingsEnums;
24 import android.content.Context;
25 import android.content.DialogInterface;
26 import android.os.Bundle;
27 import android.telephony.SubscriptionInfo;
28 import android.telephony.SubscriptionManager;
29 import android.telephony.TelephonyManager;
30 import android.util.Log;
31 
32 import androidx.annotation.NonNull;
33 import androidx.annotation.Nullable;
34 import androidx.annotation.VisibleForTesting;
35 import androidx.appcompat.app.AlertDialog;
36 
37 import com.android.settings.R;
38 import com.android.settings.network.SubscriptionUtil;
39 
40 /**
41  * After androidV, presents a dialog asking the user if they want to update the mobile data.
42  * Typically this would be used in a case where a device goes from having multiple SIMs down to
43  * only one.
44  */
45 public class PreferredSimDialogFragment extends SimDialogFragment implements
46         DialogInterface.OnClickListener {
47     private static final String TAG = "PreferredSimDialogFrag";
48 
newInstance()49     public static PreferredSimDialogFragment newInstance() {
50         final PreferredSimDialogFragment fragment = new PreferredSimDialogFragment();
51         final Bundle args = initArguments(SimDialogActivity.PREFERRED_PICK,
52                 R.string.select_specific_sim_for_data_title);
53         fragment.setArguments(args);
54         return fragment;
55     }
56 
57     @NonNull
58     @Override
onCreateDialog(@ullable Bundle savedInstanceState)59     public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
60         final AlertDialog dialog = new AlertDialog.Builder(getContext())
61                 .setPositiveButton(R.string.yes, this)
62                 .setNegativeButton(R.string.no, null)
63                 .create();
64         updateDialog(dialog);
65         return dialog;
66     }
67 
68     @Override
onClick(DialogInterface dialog, int buttonClicked)69     public void onClick(DialogInterface dialog, int buttonClicked) {
70         if (buttonClicked != DialogInterface.BUTTON_POSITIVE) {
71             return;
72         }
73         final SimDialogActivity activity = (SimDialogActivity) getActivity();
74         final SubscriptionInfo info = getPreferredSubscription();
75         if (info != null) {
76             activity.onSubscriptionSelected(getDialogType(), info.getSubscriptionId());
77         }
78     }
79 
getPreferredSubscription()80     public SubscriptionInfo getPreferredSubscription() {
81         final Activity activity = getActivity();
82         final int slotId = activity.getIntent().getIntExtra(SimDialogActivity.PREFERRED_SIM,
83                 SubscriptionManager.INVALID_SUBSCRIPTION_ID);
84         return getSubscriptionManager().getActiveSubscriptionInfoForSimSlotIndex(slotId);
85     }
86 
updateDialog(AlertDialog dialog)87     private void updateDialog(AlertDialog dialog) {
88         Log.d(TAG, "Dialog updated, dismiss status: " + mWasDismissed);
89 
90         if (mWasDismissed) {
91             return;
92         }
93 
94         if (dialog == null) {
95             dismiss("Dialog is null.");
96             return;
97         }
98         Context context = getContext();
99         if (context == null) {
100             dismiss("getContext is null.");
101             return;
102         }
103 
104         final SubscriptionInfo info = getPreferredSubscription();
105         if (info == null || (info.isEmbedded()
106             && (info.getProfileClass() == PROFILE_CLASS_PROVISIONING
107                 || info.isOnlyNonTerrestrialNetwork()))) {
108             dismiss("SubscriptionInfo is null or other esim's cases.");
109             return;
110         }
111         Log.d(TAG, "SubscriptionInfo: " + info);
112         TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
113         if (telephonyManager == null) {
114             dismiss("TelephonyManager is null.");
115             return;
116         }
117         telephonyManager = telephonyManager.createForSubscriptionId(info.getSubscriptionId());
118         if (telephonyManager.isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER)) {
119             dismiss("mobile data is on.");
120             final SimDialogActivity activity = (SimDialogActivity) getActivity();
121             if (activity != null) {
122                 activity.finish();
123             }
124             return;
125         }
126 
127         final CharSequence simName =
128                 SubscriptionUtil.getUniqueSubscriptionDisplayName(info, context);
129         final String title =
130                 context.getString(
131                         getTitleResId(),
132                         simName);
133         final String message =
134                 context.getString(
135                         R.string.sim_preferred_message,
136                         simName);
137         dialog.setTitle(title);
138         dialog.setMessage(message);
139     }
140 
dismiss(String log)141     private void dismiss(String log) {
142         Log.d(TAG, log);
143         dismiss();
144     }
145 
146     @Override
updateDialog()147     public void updateDialog() {
148         updateDialog((AlertDialog) getDialog());
149     }
150 
151     @VisibleForTesting
getSubscriptionManager()152     protected SubscriptionManager getSubscriptionManager() {
153         return getContext().getSystemService(SubscriptionManager.class);
154     }
155 
156     @Override
getMetricsCategory()157     public int getMetricsCategory() {
158         return SettingsEnums.DIALOG_PREFERRED_SIM_PICKER;
159     }
160 }
161