Home | History | Annotate | Download | only in imsframework
      1 /*
      2  * Copyright (C) 2011 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.example.imsframework;
     18 
     19 import android.app.Application;
     20 import android.content.BroadcastReceiver;
     21 import android.content.Context;
     22 import android.content.Intent;
     23 import android.content.IntentFilter;
     24 import android.os.AsyncResult;
     25 import android.os.Handler;
     26 import android.os.Message;
     27 import android.telephony.ServiceState;
     28 import android.telephony.TelephonyManager;
     29 import android.util.Log;
     30 
     31 import com.android.internal.telephony.IccCard;
     32 import com.android.internal.telephony.Phone;
     33 import com.android.internal.telephony.PhoneFactory;
     34 import com.android.internal.telephony.TelephonyIntents;
     35 
     36 import java.util.Arrays;
     37 
     38 /**
     39  * Top-level Application class for the example IMS framework.
     40  */
     41 public class ImsFrameworkApp extends Application {
     42     private static final String TAG = "ImsFrameworkApp";
     43 
     44     // Broadcast receiver for telephony intent broadcasts
     45     private final BroadcastReceiver mReceiver = new ImsFrameworkBroadcastReceiver();
     46 
     47     // Handler for ISIM authentication callback
     48     private final IsimAuthenticationHandler mHandler = new IsimAuthenticationHandler();
     49 
     50     private static final int EVENT_ISIM_AUTHENTICATION_DONE = 100;
     51 
     52     @Override
     53     public void onCreate() {
     54         // Register for telephony intent broadcasts
     55         Log.d(TAG, "onCreate(): registering for telephony state change broadcasts");
     56         IntentFilter intentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
     57         intentFilter.addAction(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
     58         intentFilter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
     59         intentFilter.addAction(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
     60         intentFilter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
     61         registerReceiver(mReceiver, intentFilter);
     62     }
     63 
     64     /**
     65      * Receiver for telephony broadcasts that the IMS framework cares about.
     66      */
     67     private class ImsFrameworkBroadcastReceiver extends BroadcastReceiver {
     68         @Override
     69         public void onReceive(Context context, Intent intent) {
     70             String action = intent.getAction();
     71             Log.d(TAG, "mReceiver received action " + action);
     72             if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
     73                 Log.d(TAG, "mReceiver: ACTION_AIRPLANE_MODE_CHANGED");
     74                 Log.d(TAG, "- state: " + intent.getBooleanExtra(Phone.STATE_KEY, false));
     75             } else if (action.equals(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) {
     76                 Log.d(TAG, "mReceiver: ACTION_ANY_DATA_CONNECTION_STATE_CHANGED");
     77                 Log.d(TAG, "- apnName: " + intent.getStringExtra(Phone.DATA_APN_KEY));
     78                 Log.d(TAG, "- apnType: " + intent.getStringExtra(Phone.DATA_APN_TYPE_KEY));
     79                 Log.d(TAG, "- state: " + intent.getStringExtra(Phone.STATE_KEY));
     80                 Log.d(TAG, "- reason: " + intent.getStringExtra(Phone.STATE_CHANGE_REASON_KEY));
     81                 Log.d(TAG, "- network unavailable: " +
     82                         intent.getBooleanExtra(Phone.NETWORK_UNAVAILABLE_KEY, false));
     83                 // demonstrate calling ISIM authentication when data state changes
     84                 tryIsimAuthentication();
     85             } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
     86                 Log.d(TAG, "mReceiver: ACTION_SIM_STATE_CHANGED");
     87                 Log.d(TAG, "- phoneName: " + intent.getStringExtra(Phone.PHONE_NAME_KEY));
     88                 String state = intent.getStringExtra(IccCard.INTENT_KEY_ICC_STATE);
     89                 Log.d(TAG, "- state: " + state);
     90                 Log.d(TAG, "- reason: " + intent.getStringExtra(Phone.STATE_CHANGE_REASON_KEY));
     91                 if (IccCard.INTENT_VALUE_ICC_LOADED.equals(state)) {
     92                     // all ISIM records are loaded, query them through TelephonyManager
     93                     handleSimRecordsLoaded();
     94                 }
     95             } else if (action.equals(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED)) {
     96                 Log.d(TAG, "mReceiver: ACTION_RADIO_TECHNOLOGY_CHANGED");
     97                 Log.d(TAG, "- phoneName: " + intent.getStringExtra(Phone.PHONE_NAME_KEY));
     98             } else if (action.equals(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED)) {
     99                 Log.d(TAG, "mReceiver: ACTION_SERVICE_STATE_CHANGED");
    100                 ServiceState ss = ServiceState.newFromBundle(intent.getExtras());
    101                 Log.d(TAG, "- ServiceState: " + ss);
    102             }
    103         }
    104     }
    105 
    106     void handleSimRecordsLoaded() {
    107         TelephonyManager telephonyManager =
    108                 (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    109 
    110         Log.d(TAG, "ISIM IMPI: " + telephonyManager.getIsimImpi());
    111         Log.d(TAG, "ISIM Domain: " + telephonyManager.getIsimDomain());
    112         Log.d(TAG, "ISIM IMPU: " + Arrays.toString(telephonyManager.getIsimImpu()));
    113     }
    114 
    115     private final class IsimAuthenticationHandler extends Handler {
    116         @Override
    117         public void handleMessage(Message msg) {
    118             AsyncResult ar = (AsyncResult) msg.obj;
    119             if (ar.exception != null) {
    120                 Log.d(TAG, "requestIsimAuthentication exception: " + ar.exception);
    121             } else {
    122                 String response = (String) ar.result;
    123                 Log.d(TAG, "requestIsimAuthentication response: " + response);
    124             }
    125         }
    126     }
    127 
    128     void tryIsimAuthentication() {
    129         Message response = mHandler.obtainMessage(EVENT_ISIM_AUTHENTICATION_DONE);
    130         // Note: this only works when running inside the phone process
    131         Phone phone = PhoneFactory.getDefaultPhone();
    132         if (phone != null) {
    133             phone.requestIsimAuthentication("DUMMY-BASE64-NONCE", response);
    134         }
    135     }
    136 }
    137