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.imei; 18 19 import static android.telephony.TelephonyManager.PHONE_TYPE_CDMA; 20 21 import android.app.Fragment; 22 import android.content.Context; 23 import android.support.annotation.VisibleForTesting; 24 import android.support.v7.preference.Preference; 25 import android.support.v7.preference.PreferenceScreen; 26 import android.telephony.TelephonyManager; 27 28 import com.android.settings.R; 29 import com.android.settings.core.PreferenceControllerMixin; 30 import com.android.settingslib.deviceinfo.AbstractSimStatusImeiInfoPreferenceController; 31 32 import java.util.ArrayList; 33 import java.util.List; 34 35 /** 36 * Controller that manages preference for single and multi sim devices. 37 */ 38 public class ImeiInfoPreferenceController extends 39 AbstractSimStatusImeiInfoPreferenceController implements PreferenceControllerMixin { 40 41 private static final String KEY_IMEI_INFO = "imei_info"; 42 43 private final boolean mIsMultiSim; 44 private final TelephonyManager mTelephonyManager; 45 private final List<Preference> mPreferenceList = new ArrayList<>(); 46 private final Fragment mFragment; 47 ImeiInfoPreferenceController(Context context, Fragment fragment)48 public ImeiInfoPreferenceController(Context context, Fragment fragment) { 49 super(context); 50 51 mFragment = fragment; 52 mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 53 mIsMultiSim = mTelephonyManager.getPhoneCount() > 1; 54 } 55 56 @Override getPreferenceKey()57 public String getPreferenceKey() { 58 return KEY_IMEI_INFO; 59 } 60 61 @Override displayPreference(PreferenceScreen screen)62 public void displayPreference(PreferenceScreen screen) { 63 super.displayPreference(screen); 64 final Preference preference = screen.findPreference(getPreferenceKey()); 65 if (!isAvailable() || preference == null || !preference.isVisible()) { 66 return; 67 } 68 69 mPreferenceList.add(preference); 70 updatePreference(preference, 0 /* sim slot */); 71 72 final int imeiPreferenceOrder = preference.getOrder(); 73 // Add additional preferences for each sim in the device 74 for (int simSlotNumber = 1; simSlotNumber < mTelephonyManager.getPhoneCount(); 75 simSlotNumber++) { 76 final Preference multiSimPreference = createNewPreference(screen.getContext()); 77 multiSimPreference.setOrder(imeiPreferenceOrder + simSlotNumber); 78 multiSimPreference.setKey(KEY_IMEI_INFO + simSlotNumber); 79 screen.addPreference(multiSimPreference); 80 mPreferenceList.add(multiSimPreference); 81 updatePreference(multiSimPreference, simSlotNumber); 82 } 83 } 84 85 @Override handlePreferenceTreeClick(Preference preference)86 public boolean handlePreferenceTreeClick(Preference preference) { 87 final int simSlot = mPreferenceList.indexOf(preference); 88 if (simSlot == -1) { 89 return false; 90 } 91 92 ImeiInfoDialogFragment.show(mFragment, simSlot, preference.getTitle().toString()); 93 return true; 94 } 95 updatePreference(Preference preference, int simSlot)96 private void updatePreference(Preference preference, int simSlot) { 97 final int phoneType = mTelephonyManager.getPhoneType(); 98 if (phoneType == PHONE_TYPE_CDMA) { 99 preference.setTitle(getTitleForCdmaPhone(simSlot)); 100 preference.setSummary(getMeid(simSlot)); 101 } else { 102 // GSM phone 103 preference.setTitle(getTitleForGsmPhone(simSlot)); 104 preference.setSummary(mTelephonyManager.getImei(simSlot)); 105 } 106 } 107 getTitleForGsmPhone(int simSlot)108 private CharSequence getTitleForGsmPhone(int simSlot) { 109 return mIsMultiSim ? mContext.getString(R.string.imei_multi_sim, simSlot + 1) 110 : mContext.getString(R.string.status_imei); 111 } 112 getTitleForCdmaPhone(int simSlot)113 private CharSequence getTitleForCdmaPhone(int simSlot) { 114 return mIsMultiSim ? mContext.getString(R.string.meid_multi_sim, simSlot + 1) 115 : mContext.getString(R.string.status_meid_number); 116 } 117 118 @VisibleForTesting getMeid(int simSlot)119 String getMeid(int simSlot) { 120 return mTelephonyManager.getMeid(simSlot); 121 } 122 123 @VisibleForTesting createNewPreference(Context context)124 Preference createNewPreference(Context context) { 125 return new Preference(context); 126 } 127 } 128