| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.internal.telephony.uicc; |
| |
| import android.content.Context; |
| import android.content.Intent; |
| import android.os.Handler; |
| import android.os.Message; |
| import android.telephony.TelephonyManager; |
| import android.util.Log; |
| |
| import com.android.internal.R; |
| import com.android.internal.telephony.TelephonyIntents; |
| import com.android.internal.telephony.uicc.IccCardStatus.CardState; |
| |
| /** |
| * This class launches its logic on Uicc cards state changes to / from a |
| * {@link #CARDSTATE_RESTRICTED} to notify a device provisioning package {@link |
| * com.android.internal.R.string.config_deviceProvisioningPackage}, which manages user notifications |
| * that inserted SIM is not supported on the device. |
| * |
| * @see #CARDSTATE_RESTRICTED |
| * |
| * {@hide} |
| */ |
| public class UiccStateChangedLauncher extends Handler { |
| private static final String TAG = UiccStateChangedLauncher.class.getName(); |
| private static final int EVENT_ICC_CHANGED = 1; |
| |
| private static String sDeviceProvisioningPackage = null; |
| private Context mContext; |
| private UiccController mUiccController; |
| private boolean[] mIsRestricted = null; |
| |
| public UiccStateChangedLauncher(Context context, UiccController controller) { |
| sDeviceProvisioningPackage = context.getResources().getString( |
| R.string.config_deviceProvisioningPackage); |
| if (sDeviceProvisioningPackage != null && !sDeviceProvisioningPackage.isEmpty()) { |
| mContext = context; |
| mUiccController = controller; |
| mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null); |
| } |
| } |
| |
| @Override |
| public void handleMessage(Message msg) { |
| switch(msg.what) { |
| case (EVENT_ICC_CHANGED): |
| boolean shouldNotify = false; |
| if (mIsRestricted == null) { |
| mIsRestricted = new boolean[TelephonyManager.getDefault().getPhoneCount()]; |
| shouldNotify = true; |
| } |
| UiccCard[] cards = mUiccController.getUiccCards(); |
| for (int i = 0; cards != null && i < cards.length; ++i) { |
| // Update only if restricted state changes. |
| if ((cards[i] == null |
| || cards[i].getCardState() != CardState.CARDSTATE_RESTRICTED) |
| != mIsRestricted[i]) { |
| mIsRestricted[i] = !mIsRestricted[i]; |
| shouldNotify = true; |
| } |
| } |
| if (shouldNotify) { |
| notifyStateChanged(); |
| } |
| break; |
| default: |
| throw new RuntimeException("unexpected event not handled"); |
| } |
| } |
| |
| /** |
| * Send an explicit intent to device provisioning package. |
| */ |
| private void notifyStateChanged() { |
| Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); |
| intent.setPackage(sDeviceProvisioningPackage); |
| try { |
| mContext.sendBroadcast(intent); |
| } catch (Exception e) { |
| Log.e(TAG, e.toString()); |
| } |
| } |
| } |