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;
18 
19 import static android.content.Context.CLIPBOARD_SERVICE;
20 
21 import android.content.ClipData;
22 import android.content.ClipboardManager;
23 import android.content.Context;
24 import android.telephony.SubscriptionInfo;
25 import android.telephony.SubscriptionManager;
26 import android.telephony.TelephonyManager;
27 import android.text.TextUtils;
28 import android.widget.Toast;
29 
30 import androidx.annotation.VisibleForTesting;
31 import androidx.preference.Preference;
32 import androidx.preference.PreferenceCategory;
33 import androidx.preference.PreferenceScreen;
34 
35 import com.android.settings.R;
36 import com.android.settings.core.BasePreferenceController;
37 import com.android.settingslib.DeviceInfoUtils;
38 
39 import java.util.ArrayList;
40 import java.util.List;
41 
42 public class PhoneNumberPreferenceController extends BasePreferenceController {
43 
44     private static final String KEY_PHONE_NUMBER = "phone_number";
45     private static final String KEY_PREFERENCE_CATEGORY = "basic_info_category";
46 
47     private final TelephonyManager mTelephonyManager;
48     private final SubscriptionManager mSubscriptionManager;
49     private final List<Preference> mPreferenceList = new ArrayList<>();
50 
PhoneNumberPreferenceController(Context context, String key)51     public PhoneNumberPreferenceController(Context context, String key) {
52         super(context, key);
53         mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
54         mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
55     }
56 
57     @Override
getAvailabilityStatus()58     public int getAvailabilityStatus() {
59         return mTelephonyManager.isVoiceCapable() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
60     }
61 
62     @Override
getSummary()63     public CharSequence getSummary() {
64         return getFirstPhoneNumber();
65     }
66 
67     @Override
displayPreference(PreferenceScreen screen)68     public void displayPreference(PreferenceScreen screen) {
69         super.displayPreference(screen);
70         final Preference preference = screen.findPreference(getPreferenceKey());
71         final PreferenceCategory category = screen.findPreference(KEY_PREFERENCE_CATEGORY);
72         mPreferenceList.add(preference);
73 
74         final int phonePreferenceOrder = preference.getOrder();
75         // Add additional preferences for each sim in the device
76         for (int simSlotNumber = 1; simSlotNumber < mTelephonyManager.getPhoneCount();
77                 simSlotNumber++) {
78             final Preference multiSimPreference = createNewPreference(screen.getContext());
79             multiSimPreference.setOrder(phonePreferenceOrder + simSlotNumber);
80             multiSimPreference.setKey(KEY_PHONE_NUMBER + simSlotNumber);
81             multiSimPreference.setSelectable(false);
82             category.addPreference(multiSimPreference);
83             mPreferenceList.add(multiSimPreference);
84         }
85     }
86 
87     @Override
updateState(Preference preference)88     public void updateState(Preference preference) {
89         for (int simSlotNumber = 0; simSlotNumber < mPreferenceList.size(); simSlotNumber++) {
90             final Preference simStatusPreference = mPreferenceList.get(simSlotNumber);
91             simStatusPreference.setTitle(getPreferenceTitle(simSlotNumber));
92             simStatusPreference.setSummary(getPhoneNumber(simSlotNumber));
93         }
94     }
95 
96     @Override
useDynamicSliceSummary()97     public boolean useDynamicSliceSummary() {
98         return true;
99     }
100 
101     @Override
copy()102     public void copy() {
103         final ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(
104                 CLIPBOARD_SERVICE);
105         clipboard.setPrimaryClip(ClipData.newPlainText("text", getFirstPhoneNumber()));
106 
107         final String toast = mContext.getString(R.string.copyable_slice_toast,
108                 mContext.getText(R.string.status_number));
109         Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
110     }
111 
getFirstPhoneNumber()112     private CharSequence getFirstPhoneNumber() {
113         final List<SubscriptionInfo> subscriptionInfoList =
114                 mSubscriptionManager.getActiveSubscriptionInfoList();
115         if (subscriptionInfoList == null || subscriptionInfoList.isEmpty()) {
116             return mContext.getText(R.string.device_info_default);
117         }
118 
119         // For now, We only return first result for slice view.
120         return getFormattedPhoneNumber(subscriptionInfoList.get(0));
121     }
122 
getPhoneNumber(int simSlot)123     private CharSequence getPhoneNumber(int simSlot) {
124         final SubscriptionInfo subscriptionInfo = getSubscriptionInfo(simSlot);
125         if (subscriptionInfo == null) {
126             return mContext.getText(R.string.device_info_default);
127         }
128 
129         return getFormattedPhoneNumber(subscriptionInfo);
130     }
131 
getPreferenceTitle(int simSlot)132     private CharSequence getPreferenceTitle(int simSlot) {
133         return mTelephonyManager.getPhoneCount() > 1 ? mContext.getString(
134                 R.string.status_number_sim_slot, simSlot + 1) : mContext.getString(
135                 R.string.status_number);
136     }
137 
138     @VisibleForTesting
getSubscriptionInfo(int simSlot)139     SubscriptionInfo getSubscriptionInfo(int simSlot) {
140         final List<SubscriptionInfo> subscriptionInfoList =
141                 mSubscriptionManager.getActiveSubscriptionInfoList();
142         if (subscriptionInfoList != null) {
143             for (SubscriptionInfo info : subscriptionInfoList) {
144                 if (info.getSimSlotIndex() == simSlot) {
145                     return info;
146                 }
147             }
148         }
149         return null;
150     }
151 
152     @VisibleForTesting
getFormattedPhoneNumber(SubscriptionInfo subscriptionInfo)153     CharSequence getFormattedPhoneNumber(SubscriptionInfo subscriptionInfo) {
154         final String phoneNumber = DeviceInfoUtils.getBidiFormattedPhoneNumber(mContext,
155                 subscriptionInfo);
156         return TextUtils.isEmpty(phoneNumber) ? mContext.getString(R.string.device_info_default)
157                 : phoneNumber;
158     }
159 
160     @VisibleForTesting
createNewPreference(Context context)161     protected Preference createNewPreference(Context context) {
162         return new PhoneNumberSummaryPreference(context);
163     }
164 }
165