blob: 8e60b06fee2cf3b964f37a2708b41d5d0e090d2c [file] [log] [blame]
jeffreyhuangba76fbe2017-11-09 12:15:05 -08001/*
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
17package com.android.settings.deviceinfo;
18
19import android.content.Context;
jeffreyhuangba76fbe2017-11-09 12:15:05 -080020import android.telephony.SubscriptionInfo;
21import android.telephony.SubscriptionManager;
22import android.telephony.TelephonyManager;
Wu Qiang4d8f5152017-07-07 18:18:16 +080023import android.text.BidiFormatter;
24import android.text.TextDirectionHeuristics;
jeffreyhuangba76fbe2017-11-09 12:15:05 -080025import android.text.TextUtils;
26
Fan Zhangde117042018-09-04 13:52:15 -070027import androidx.annotation.VisibleForTesting;
28import androidx.preference.Preference;
29import androidx.preference.PreferenceScreen;
30
jeffreyhuangba76fbe2017-11-09 12:15:05 -080031import com.android.settings.R;
jeffreyhuang4e087a32017-11-15 15:35:53 -080032import com.android.settings.core.PreferenceControllerMixin;
jeffreyhuangba76fbe2017-11-09 12:15:05 -080033import com.android.settingslib.DeviceInfoUtils;
34import com.android.settingslib.core.AbstractPreferenceController;
35
36import java.util.ArrayList;
37import java.util.List;
38
jeffreyhuang4e087a32017-11-15 15:35:53 -080039public class PhoneNumberPreferenceController extends AbstractPreferenceController implements
40 PreferenceControllerMixin {
jeffreyhuangba76fbe2017-11-09 12:15:05 -080041
42 private final static String KEY_PHONE_NUMBER = "phone_number";
43
44 private final TelephonyManager mTelephonyManager;
45 private final SubscriptionManager mSubscriptionManager;
46 private final List<Preference> mPreferenceList = new ArrayList<>();
47
48 public PhoneNumberPreferenceController(Context context) {
49 super(context);
50 mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
51 mSubscriptionManager = (SubscriptionManager) context.getSystemService(
52 Context.TELEPHONY_SUBSCRIPTION_SERVICE);
53 }
54
55 @Override
56 public String getPreferenceKey() {
57 return KEY_PHONE_NUMBER;
58 }
59
60 @Override
61 public boolean isAvailable() {
Ben Lin9703a972018-01-30 15:39:18 -080062 return mTelephonyManager.isVoiceCapable();
jeffreyhuangba76fbe2017-11-09 12:15:05 -080063 }
64
65 @Override
66 public void displayPreference(PreferenceScreen screen) {
67 super.displayPreference(screen);
68 final Preference preference = screen.findPreference(getPreferenceKey());
69 mPreferenceList.add(preference);
70
71 final int phonePreferenceOrder = preference.getOrder();
72 // Add additional preferences for each sim in the device
73 for (int simSlotNumber = 1; simSlotNumber < mTelephonyManager.getPhoneCount();
74 simSlotNumber++) {
75 final Preference multiSimPreference = createNewPreference(screen.getContext());
76 multiSimPreference.setOrder(phonePreferenceOrder + simSlotNumber);
77 multiSimPreference.setKey(KEY_PHONE_NUMBER + simSlotNumber);
78 screen.addPreference(multiSimPreference);
79 mPreferenceList.add(multiSimPreference);
80 }
81 }
82
83 @Override
84 public void updateState(Preference preference) {
85 for (int simSlotNumber = 0; simSlotNumber < mPreferenceList.size(); simSlotNumber++) {
86 final Preference simStatusPreference = mPreferenceList.get(simSlotNumber);
87 simStatusPreference.setTitle(getPreferenceTitle(simSlotNumber));
88 simStatusPreference.setSummary(getPhoneNumber(simSlotNumber));
89 }
90 }
91
92 private CharSequence getPhoneNumber(int simSlot) {
93 final SubscriptionInfo subscriptionInfo = getSubscriptionInfo(simSlot);
94 if (subscriptionInfo == null) {
95 return mContext.getString(R.string.device_info_default);
96 }
97
98 return getFormattedPhoneNumber(subscriptionInfo);
99 }
100
101 private CharSequence getPreferenceTitle(int simSlot) {
102 return mTelephonyManager.getPhoneCount() > 1 ? mContext.getString(
103 R.string.status_number_sim_slot, simSlot + 1) : mContext.getString(
104 R.string.status_number);
105 }
106
107 @VisibleForTesting
108 SubscriptionInfo getSubscriptionInfo(int simSlot) {
109 final List<SubscriptionInfo> subscriptionInfoList =
110 mSubscriptionManager.getActiveSubscriptionInfoList();
111 if (subscriptionInfoList != null) {
112 for (SubscriptionInfo info : subscriptionInfoList) {
113 if (info.getSimSlotIndex() == simSlot) {
114 return info;
115 }
116 }
117 }
118 return null;
119 }
120
121 @VisibleForTesting
122 CharSequence getFormattedPhoneNumber(SubscriptionInfo subscriptionInfo) {
123 final String phoneNumber = DeviceInfoUtils.getFormattedPhoneNumber(mContext,
124 subscriptionInfo);
125 return TextUtils.isEmpty(phoneNumber) ? mContext.getString(R.string.device_info_default)
Wu Qiang4d8f5152017-07-07 18:18:16 +0800126 : BidiFormatter.getInstance().unicodeWrap(phoneNumber, TextDirectionHeuristics.LTR);
jeffreyhuangba76fbe2017-11-09 12:15:05 -0800127 }
128
129 @VisibleForTesting
130 Preference createNewPreference(Context context) {
131 return new Preference(context);
132 }
133}