150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby/* 250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Copyright (C) 2011 The Android Open Source Project 350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License"); 550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * you may not use this file except in compliance with the License. 650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * You may obtain a copy of the License at 750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * http://www.apache.org/licenses/LICENSE-2.0 950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 1050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Unless required by applicable law or agreed to in writing, software 1150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS, 1250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * See the License for the specific language governing permissions and 1450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * limitations under the License. 1550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 1650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 1750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypackage com.android.cellbroadcastreceiver; 1850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 1950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.BroadcastReceiver; 2050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.Context; 2150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.Intent; 2250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.os.RemoteException; 2350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.os.ServiceManager; 2450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.provider.Telephony; 2550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.telephony.TelephonyManager; 2650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.util.Log; 2750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 2850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.ITelephony; 2950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 3050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypublic class CellBroadcastReceiver extends BroadcastReceiver { 3150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby private static final String TAG = "CellBroadcastReceiver"; 3250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby static final boolean DBG = true; // TODO: change to false before ship 3350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 3450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby @Override 3550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby public void onReceive(Context context, Intent intent) { 3650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby onReceiveWithPrivilege(context, intent, false); 3750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 3850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 3950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby protected void onReceiveWithPrivilege(Context context, Intent intent, boolean privileged) { 4050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (DBG) Log.d(TAG, "onReceive " + intent); 4150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 4250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby String action = intent.getAction(); 4350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 4450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (Intent.ACTION_BOOT_COMPLETED.equals(action)) { 4550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby startConfigService(context); 4650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) { 4750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby boolean airplaneModeOn = intent.getBooleanExtra("state", false); 4850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (!airplaneModeOn) { 4950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby startConfigService(context); 5050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 5150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } else if (Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION.equals(action) || 5250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION.equals(action)) { 5350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // If 'privileged' is false, it means that the intent was delivered to the base 5450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // no-permissions receiver class. If we get an SMS_CB_RECEIVED message that way, it 5550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // means someone has tried to spoof the message by delivering it outside the normal 5650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // permission-checked route, so we just ignore it. 5750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (privileged) { 5850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby intent.setClass(context, CellBroadcastAlertService.class); 5950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby context.startService(intent); 6050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } else { 6150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Log.e(TAG, "ignoring unprivileged action received " + action); 6250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 6350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } else { 6450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Log.w(TAG, "onReceive() unexpected action " + action); 6550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 6650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 6750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 6850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby /** 6950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Tell {@link CellBroadcastConfigService} to enable the CB channels. 7050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * @param context the broadcast receiver context 7150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 7250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby static void startConfigService(Context context) { 7350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (phoneIsCdma()) { 7450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Log.d(TAG, "CDMA phone detected; doing nothing"); 7550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } else { 7650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Intent serviceIntent = new Intent(CellBroadcastConfigService.ACTION_ENABLE_CHANNELS, 7750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby null, context, CellBroadcastConfigService.class); 7850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby context.startService(serviceIntent); 7950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 8050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 8150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 8250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby /** 8350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * @return true if the phone is a CDMA phone type 8450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 8550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby private static boolean phoneIsCdma() { 8650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby boolean isCdma = false; 8750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby try { 8850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone")); 8950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (phone != null) { 9050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby isCdma = (phone.getActivePhoneType() == TelephonyManager.PHONE_TYPE_CDMA); 9150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 9250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } catch (RemoteException e) { 9350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Log.w(TAG, "phone.getActivePhoneType() failed", e); 9450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 9550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby return isCdma; 9650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 9750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby} 98