1 /*
2  * Copyright (C) 2017 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.deviceinfo.simstatus;
18 
19 import android.content.Context;
20 import android.telephony.SubscriptionInfo;
21 import android.telephony.SubscriptionManager;
22 import android.telephony.TelephonyManager;
23 
24 import androidx.annotation.VisibleForTesting;
25 import androidx.fragment.app.Fragment;
26 import androidx.preference.Preference;
27 import androidx.preference.PreferenceCategory;
28 import androidx.preference.PreferenceScreen;
29 
30 import com.android.settings.R;
31 import com.android.settings.core.PreferenceControllerMixin;
32 import com.android.settingslib.deviceinfo.AbstractSimStatusImeiInfoPreferenceController;
33 
34 import java.util.ArrayList;
35 import java.util.List;
36 
37 public class SimStatusPreferenceController extends
38         AbstractSimStatusImeiInfoPreferenceController implements PreferenceControllerMixin {
39 
40     private static final String KEY_SIM_STATUS = "sim_status";
41     private static final String KEY_PREFERENCE_CATEGORY = "device_detail_category";
42 
43     private final TelephonyManager mTelephonyManager;
44     private final SubscriptionManager mSubscriptionManager;
45     private final Fragment mFragment;
46     private final List<Preference> mPreferenceList = new ArrayList<>();
47 
SimStatusPreferenceController(Context context, Fragment fragment)48     public SimStatusPreferenceController(Context context, Fragment fragment) {
49         super(context);
50 
51         mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
52         mSubscriptionManager = (SubscriptionManager) context.getSystemService(
53                 Context.TELEPHONY_SUBSCRIPTION_SERVICE);
54         mFragment = fragment;
55     }
56 
57     @Override
getPreferenceKey()58     public String getPreferenceKey() {
59         return KEY_SIM_STATUS;
60     }
61 
62     @Override
displayPreference(PreferenceScreen screen)63     public void displayPreference(PreferenceScreen screen) {
64         super.displayPreference(screen);
65         final Preference preference = screen.findPreference(getPreferenceKey());
66         if (!isAvailable() || preference == null || !preference.isVisible()) {
67             return;
68         }
69         final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY);
70 
71         mPreferenceList.add(preference);
72 
73         final int simStatusOrder = preference.getOrder();
74         // Add additional preferences for each sim in the device
75         for (int simSlotNumber = 1; simSlotNumber < mTelephonyManager.getPhoneCount();
76                 simSlotNumber++) {
77             final Preference multiSimPreference = createNewPreference(screen.getContext());
78             multiSimPreference.setOrder(simStatusOrder + simSlotNumber);
79             multiSimPreference.setKey(KEY_SIM_STATUS + simSlotNumber);
80             category.addPreference(multiSimPreference);
81             mPreferenceList.add(multiSimPreference);
82         }
83     }
84 
85     @Override
updateState(Preference preference)86     public void updateState(Preference preference) {
87         for (int simSlotNumber = 0; simSlotNumber < mPreferenceList.size(); simSlotNumber++) {
88             final Preference simStatusPreference = mPreferenceList.get(simSlotNumber);
89             simStatusPreference.setTitle(getPreferenceTitle(simSlotNumber /* sim slot */));
90             simStatusPreference.setSummary(getCarrierName(simSlotNumber /* sim slot */));
91         }
92     }
93 
94     @Override
handlePreferenceTreeClick(Preference preference)95     public boolean handlePreferenceTreeClick(Preference preference) {
96         final int simSlot = mPreferenceList.indexOf(preference);
97         if (simSlot == -1) {
98             return false;
99         }
100 
101         SimStatusDialogFragment.show(mFragment, simSlot, getPreferenceTitle(simSlot));
102         return true;
103     }
104 
getPreferenceTitle(int simSlot)105     private String getPreferenceTitle(int simSlot) {
106         return mTelephonyManager.getPhoneCount() > 1 ? mContext.getString(
107                 R.string.sim_status_title_sim_slot, simSlot + 1) : mContext.getString(
108                 R.string.sim_status_title);
109     }
110 
getCarrierName(int simSlot)111     private CharSequence getCarrierName(int simSlot) {
112         final List<SubscriptionInfo> subscriptionInfoList =
113                 mSubscriptionManager.getActiveSubscriptionInfoList();
114         if (subscriptionInfoList != null) {
115             for (SubscriptionInfo info : subscriptionInfoList) {
116                 if (info.getSimSlotIndex() == simSlot) {
117                     return info.getCarrierName();
118                 }
119             }
120         }
121         return mContext.getText(R.string.device_info_not_available);
122     }
123 
124     @VisibleForTesting
createNewPreference(Context context)125     Preference createNewPreference(Context context) {
126         return new Preference(context);
127     }
128 }
129