• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.BidiFormatter;
28 import android.text.TextDirectionHeuristics;
29 import android.text.TextUtils;
30 import android.widget.Toast;
31 
32 import androidx.annotation.VisibleForTesting;
33 import androidx.preference.Preference;
34 import androidx.preference.PreferenceScreen;
35 
36 import com.android.settings.R;
37 import com.android.settings.core.BasePreferenceController;
38 import com.android.settingslib.DeviceInfoUtils;
39 
40 import java.util.ArrayList;
41 import java.util.List;
42 
43 public class PhoneNumberPreferenceController extends BasePreferenceController {
44 
45     private final static String KEY_PHONE_NUMBER = "phone_number";
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         mPreferenceList.add(preference);
72 
73         final int phonePreferenceOrder = 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(phonePreferenceOrder + simSlotNumber);
79             multiSimPreference.setKey(KEY_PHONE_NUMBER + simSlotNumber);
80             screen.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));
90             simStatusPreference.setSummary(getPhoneNumber(simSlotNumber));
91         }
92     }
93 
94     @Override
isSliceable()95     public boolean isSliceable() {
96         return true;
97     }
98 
99     @Override
isCopyableSlice()100     public boolean isCopyableSlice() {
101         return true;
102     }
103 
104     @Override
useDynamicSliceSummary()105     public boolean useDynamicSliceSummary() {
106         return true;
107     }
108 
109     @Override
copy()110     public void copy() {
111         final ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(
112                 CLIPBOARD_SERVICE);
113         clipboard.setPrimaryClip(ClipData.newPlainText("text", getFirstPhoneNumber()));
114 
115         final String toast = mContext.getString(R.string.copyable_slice_toast,
116                 mContext.getText(R.string.status_number));
117         Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
118     }
119 
getFirstPhoneNumber()120     private CharSequence getFirstPhoneNumber() {
121         final List<SubscriptionInfo> subscriptionInfoList =
122                 mSubscriptionManager.getActiveSubscriptionInfoList(true);
123         if (subscriptionInfoList == null || subscriptionInfoList.isEmpty()) {
124             return mContext.getText(R.string.device_info_default);
125         }
126 
127         // For now, We only return first result for slice view.
128         return getFormattedPhoneNumber(subscriptionInfoList.get(0));
129     }
130 
getPhoneNumber(int simSlot)131     private CharSequence getPhoneNumber(int simSlot) {
132         final SubscriptionInfo subscriptionInfo = getSubscriptionInfo(simSlot);
133         if (subscriptionInfo == null) {
134             return mContext.getText(R.string.device_info_default);
135         }
136 
137         return getFormattedPhoneNumber(subscriptionInfo);
138     }
139 
getPreferenceTitle(int simSlot)140     private CharSequence getPreferenceTitle(int simSlot) {
141         return mTelephonyManager.getPhoneCount() > 1 ? mContext.getString(
142                 R.string.status_number_sim_slot, simSlot + 1) : mContext.getString(
143                 R.string.status_number);
144     }
145 
146     @VisibleForTesting
getSubscriptionInfo(int simSlot)147     SubscriptionInfo getSubscriptionInfo(int simSlot) {
148         final List<SubscriptionInfo> subscriptionInfoList =
149                 mSubscriptionManager.getActiveSubscriptionInfoList(true);
150         if (subscriptionInfoList != null) {
151             for (SubscriptionInfo info : subscriptionInfoList) {
152                 if (info.getSimSlotIndex() == simSlot) {
153                     return info;
154                 }
155             }
156         }
157         return null;
158     }
159 
160     @VisibleForTesting
getFormattedPhoneNumber(SubscriptionInfo subscriptionInfo)161     CharSequence getFormattedPhoneNumber(SubscriptionInfo subscriptionInfo) {
162         final String phoneNumber = DeviceInfoUtils.getFormattedPhoneNumber(mContext,
163                 subscriptionInfo);
164         return TextUtils.isEmpty(phoneNumber) ? mContext.getString(R.string.device_info_default)
165                 : BidiFormatter.getInstance().unicodeWrap(phoneNumber, TextDirectionHeuristics.LTR);
166     }
167 
168     @VisibleForTesting
createNewPreference(Context context)169     Preference createNewPreference(Context context) {
170         return new Preference(context);
171     }
172 }
173