1 /* 2 * Copyright (C) 2006 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.internal.telephony.mocks; 18 19 import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID; 20 import static android.telephony.SubscriptionManager.INVALID_PHONE_INDEX; 21 import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; 22 23 import android.content.Context; 24 import android.content.Intent; 25 import android.os.RemoteException; 26 import android.os.UserHandle; 27 import android.telephony.SubscriptionInfo; 28 29 import com.android.internal.telephony.CommandsInterface; 30 import com.android.internal.telephony.ITelephonyRegistry; 31 import com.android.internal.telephony.Phone; 32 import com.android.internal.telephony.PhoneConstants; 33 import com.android.internal.telephony.SubscriptionController; 34 import com.android.internal.telephony.TelephonyIntents; 35 36 import java.io.FileDescriptor; 37 import java.io.PrintWriter; 38 import java.util.List; 39 import java.util.concurrent.atomic.AtomicInteger; 40 41 // must extend SubscriptionController as some people use it directly within-process 42 public class SubscriptionControllerMock extends SubscriptionController { 43 final AtomicInteger mDefaultDataSubId = new AtomicInteger(INVALID_SUBSCRIPTION_ID); 44 final AtomicInteger mDefaultVoiceSubId = new AtomicInteger(INVALID_SUBSCRIPTION_ID); 45 final ITelephonyRegistry.Stub mTelephonyRegistry; 46 final int[][] mSlotIndexToSubId; 47 48 public static SubscriptionController init(Phone phone) { 49 throw new RuntimeException("not implemented"); 50 } 51 public static SubscriptionController init(Context c, CommandsInterface[] ci) { 52 throw new RuntimeException("not implemented"); 53 } 54 public static SubscriptionController getInstance() { 55 throw new RuntimeException("not implemented"); 56 } 57 58 public SubscriptionControllerMock(Context c, ITelephonyRegistry.Stub tr, int phoneCount) { 59 super(c); 60 mTelephonyRegistry = tr; 61 mSlotIndexToSubId = new int[phoneCount][]; 62 for (int i = 0; i < phoneCount; i++) { 63 mSlotIndexToSubId[i] = new int[1]; 64 mSlotIndexToSubId[i][0] = INVALID_SUBSCRIPTION_ID; 65 } 66 } 67 68 protected void init(Context c) { 69 mContext = c; 70 } 71 72 @Override 73 public int getDefaultDataSubId() { 74 return mDefaultDataSubId.get(); 75 } 76 77 @Override 78 public void setDefaultDataSubId(int subId) { 79 if (subId == DEFAULT_SUBSCRIPTION_ID) { 80 throw new RuntimeException("setDefaultDataSubId called with DEFAULT_SUB_ID"); 81 } 82 83 mDefaultDataSubId.set(subId); 84 broadcastDefaultDataSubIdChanged(subId); 85 } 86 87 private void broadcastDefaultDataSubIdChanged(int subId) { 88 // Broadcast an Intent for default data sub change 89 Intent intent = new Intent(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED); 90 intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 91 intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId); 92 mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 93 } 94 95 @Override 96 public int getSubIdUsingPhoneId(int phoneId) { 97 int[] subIds = getSubId(phoneId); 98 if (subIds == null || subIds.length == 0) { 99 return INVALID_SUBSCRIPTION_ID; 100 } 101 return subIds[0]; 102 } 103 104 @Override 105 public void notifySubscriptionInfoChanged() { 106 try { 107 mTelephonyRegistry.notifySubscriptionInfoChanged(); 108 } catch (RemoteException ex) {} 109 } 110 @Override 111 public SubscriptionInfo getActiveSubscriptionInfo(int subId, String callingPackage) { 112 throw new RuntimeException("not implemented"); 113 } 114 @Override 115 public SubscriptionInfo getActiveSubscriptionInfoForIccId(String iccId, String callingPackage) { 116 throw new RuntimeException("not implemented"); 117 } 118 @Override 119 public SubscriptionInfo getActiveSubscriptionInfoForSimSlotIndex(int slotIndex, String cp){ 120 throw new RuntimeException("not implemented"); 121 } 122 @Override 123 public List<SubscriptionInfo> getAllSubInfoList(String callingPackage) { 124 throw new RuntimeException("not implemented"); 125 } 126 @Override 127 public List<SubscriptionInfo> getActiveSubscriptionInfoList(String callingPackage) { 128 throw new RuntimeException("not implemented"); 129 } 130 @Override 131 public int getActiveSubInfoCount(String callingPackage) { 132 throw new RuntimeException("not implemented"); 133 } 134 @Override 135 public int getAllSubInfoCount(String callingPackage) { 136 throw new RuntimeException("not implemented"); 137 } 138 @Override 139 public int getActiveSubInfoCountMax() { 140 throw new RuntimeException("not implemented"); 141 } 142 @Override 143 public int addSubInfoRecord(String iccId, int slotIndex) { 144 throw new RuntimeException("not implemented"); 145 } 146 @Override 147 public boolean setPlmnSpn(int slotIndex, boolean showPlmn, String plmn, boolean showSpn, 148 String spn) { 149 throw new RuntimeException("not implemented"); 150 } 151 @Override 152 public int setIconTint(int tint, int subId) { 153 throw new RuntimeException("not implemented"); 154 } 155 @Override 156 public int setDisplayName(String displayName, int subId) { 157 throw new RuntimeException("not implemented"); 158 } 159 @Override 160 public int setDisplayNameUsingSrc(String displayName, int subId, long nameSource) { 161 throw new RuntimeException("not implemented"); 162 } 163 @Override 164 public int setDisplayNumber(String number, int subId) { 165 throw new RuntimeException("not implemented"); 166 } 167 @Override 168 public int setDataRoaming(int roaming, int subId) { 169 throw new RuntimeException("not implemented"); 170 } 171 @Override 172 public int setMccMnc(String mccMnc, int subId) { 173 throw new RuntimeException("not implemented"); 174 } 175 @Override 176 public int getSlotIndex(int subId) { 177 throw new RuntimeException("not implemented"); 178 } 179 180 private boolean isInvalidslotIndex(int slotIndex) { 181 if (slotIndex < 0 || slotIndex >= mSlotIndexToSubId.length) return true; 182 return false; 183 } 184 185 @Override 186 public int[] getSubId(int slotIndex) { 187 if (isInvalidslotIndex(slotIndex)) { 188 return null; 189 } 190 return mSlotIndexToSubId[slotIndex]; 191 } 192 public void setSlotSubId(int slotIndex, int subId) { 193 if (isInvalidslotIndex(slotIndex)) { 194 throw new RuntimeException("invalid slot specified" + slotIndex); 195 } 196 if (mSlotIndexToSubId[slotIndex][0] != subId) { 197 mSlotIndexToSubId[slotIndex][0] = subId; 198 try { 199 mTelephonyRegistry.notifySubscriptionInfoChanged(); 200 } catch (RemoteException ex) {} 201 } 202 } 203 @Override 204 public int getPhoneId(int subId) { 205 if (subId == DEFAULT_SUBSCRIPTION_ID) { 206 subId = getDefaultSubId(); 207 } 208 209 if (subId <= INVALID_SUBSCRIPTION_ID) return INVALID_PHONE_INDEX; 210 211 for (int i = 0; i < mSlotIndexToSubId.length; i++) { 212 if (mSlotIndexToSubId[i][0] == subId) return i; 213 } 214 return INVALID_PHONE_INDEX; 215 } 216 @Override 217 public int clearSubInfo() { 218 throw new RuntimeException("not implemented"); 219 } 220 @Override 221 public int getDefaultSubId() { 222 throw new RuntimeException("not implemented"); 223 } 224 @Override 225 public void setDefaultSmsSubId(int subId) { 226 throw new RuntimeException("not implemented"); 227 } 228 @Override 229 public int getDefaultSmsSubId() { 230 throw new RuntimeException("not implemented"); 231 } 232 @Override 233 public void setDefaultVoiceSubId(int subId) { 234 if (subId == DEFAULT_SUBSCRIPTION_ID) { 235 throw new RuntimeException("setDefaultDataSubId called with DEFAULT_SUB_ID"); 236 } 237 mDefaultVoiceSubId.set(subId); 238 broadcastDefaultVoiceSubIdChanged(subId); 239 } 240 @Override 241 public int getDefaultVoiceSubId() { 242 if (mDefaultVoiceSubId != null) { 243 return mDefaultVoiceSubId.get(); 244 } else { 245 return INVALID_SUBSCRIPTION_ID; 246 } 247 } 248 @Override 249 public void clearDefaultsForInactiveSubIds() { 250 throw new RuntimeException("not implemented"); 251 } 252 @Override 253 public void updatePhonesAvailability(Phone[] phones) { 254 throw new RuntimeException("not implemented"); 255 } 256 @Override 257 public int[] getActiveSubIdList() { 258 throw new RuntimeException("not implemented"); 259 } 260 @Override 261 public boolean isActiveSubId(int subId) { 262 throw new RuntimeException("not implemented"); 263 } 264 @Override 265 public int getSimStateForSlotIndex(int slotIndex) { 266 throw new RuntimeException("not implemented"); 267 } 268 @Override 269 public void setSubscriptionProperty(int subId, String propKey, String propValue) { 270 throw new RuntimeException("not implemented"); 271 } 272 @Override 273 public String getSubscriptionProperty(int subId, String propKey, String callingPackage) { 274 throw new RuntimeException("not implemented"); 275 } 276 @Override 277 public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 278 throw new RuntimeException("not implemented"); 279 } 280 } 281