1ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville/* 2ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Copyright (C) 2013 The Android Open Source Project 3ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 4ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * you may not use this file except in compliance with the License. 6ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * You may obtain a copy of the License at 7ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 8ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 10ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Unless required by applicable law or agreed to in writing, software 11ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * See the License for the specific language governing permissions and 14ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * limitations under the License. 15ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 16ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 17ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepackage com.android.internal.telephony; 18ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 19ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.content.BroadcastReceiver; 20ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.content.Context; 21ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.content.Intent; 22ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.content.IntentFilter; 232cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Savilleimport android.os.Build; 24ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savilleimport android.telephony.Rlog; 25ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 260d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunnimport com.android.ims.ImsCall; 270d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunnimport com.android.ims.ImsConferenceState; 280d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunnimport com.android.internal.telephony.imsphone.ImsPhone; 290d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunnimport com.android.internal.telephony.imsphone.ImsPhoneCall; 300d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunnimport com.android.internal.telephony.test.TestConferenceEventPackageParser; 310d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn 320d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunnimport java.io.File; 330d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunnimport java.io.FileInputStream; 340d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunnimport java.io.FileNotFoundException; 35ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 36ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville/** 37ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * Telephony tester receives the following intents where {name} is the phone name 38ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * 39ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * adb shell am broadcast -a com.android.internal.telephony.{name}.action_detached 40ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville * adb shell am broadcast -a com.android.internal.telephony.{name}.action_attached 410d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * adb shell am broadcast -a com.android.internal.telephony.TestConferenceEventPackage -e filename 420d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * test_filename.xml 43ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville */ 44ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Savillepublic class TelephonyTester { 45ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final String LOG_TAG = "TelephonyTester"; 46ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static final boolean DBG = true; 47ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 480d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn /** 490d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * Test-only intent used to send a test conference event package to the IMS framework. 500d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn */ 510d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn private static final String ACTION_TEST_CONFERENCE_EVENT_PACKAGE = 520d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn "com.android.internal.telephony.TestConferenceEventPackage"; 530d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn private static final String EXTRA_FILENAME = "filename"; 540d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn 55ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private PhoneBase mPhone; 56ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 57ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // The static intent receiver one for all instances and we assume this 58ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville // is running on the same thread as Dcc. 59ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville protected BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 60ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville @Override 61ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville public void onReceive(Context context, Intent intent) { 62ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville String action = intent.getAction(); 63ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("sIntentReceiver.onReceive: action=" + action); 64ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (action.equals(mPhone.getActionDetached())) { 65ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("simulate detaching"); 66ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.getServiceStateTracker().mDetachedRegistrants.notifyRegistrants(); 67ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else if (action.equals(mPhone.getActionAttached())) { 68ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("simulate attaching"); 69ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone.getServiceStateTracker().mAttachedRegistrants.notifyRegistrants(); 700d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn } else if (action.equals(ACTION_TEST_CONFERENCE_EVENT_PACKAGE)) { 710d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn log("inject simulated conference event package"); 720d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn handleTestConferenceEventPackage(context, intent.getStringExtra(EXTRA_FILENAME)); 73ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } else { 74ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville if (DBG) log("onReceive: unknown action=" + action); 75ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 76ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 77ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville }; 78ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 79ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville TelephonyTester(PhoneBase phone) { 80ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville mPhone = phone; 81ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 822cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Saville if (Build.IS_DEBUGGABLE) { 83ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville IntentFilter filter = new IntentFilter(); 84ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 85ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville filter.addAction(mPhone.getActionDetached()); 86ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("register for intent action=" + mPhone.getActionDetached()); 87ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 88ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville filter.addAction(mPhone.getActionAttached()); 89ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville log("register for intent action=" + mPhone.getActionAttached()); 90ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 910d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS) { 920d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn log("register for intent action=" + ACTION_TEST_CONFERENCE_EVENT_PACKAGE); 930d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn filter.addAction(ACTION_TEST_CONFERENCE_EVENT_PACKAGE); 940d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn } 950d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn 96ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville phone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone.getHandler()); 97ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 98ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 99ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 100ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville void dispose() { 10157da4aa945252ebed6b505387145f99be8ad5d72Wink Saville if (Build.IS_DEBUGGABLE) { 10257da4aa945252ebed6b505387145f99be8ad5d72Wink Saville mPhone.getContext().unregisterReceiver(mIntentReceiver); 10357da4aa945252ebed6b505387145f99be8ad5d72Wink Saville } 104ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 105ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville 106ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville private static void log(String s) { 107ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville Rlog.d(LOG_TAG, s); 108ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville } 1090d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn 1100d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn /** 1110d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * Handles request to send a test conference event package to the active Ims call. 1120d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * 1130d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * @see com.android.internal.telephony.test.TestConferenceEventPackageParser 1140d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * @param context The context. 1150d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn * @param fileName The name of the test conference event package file to read. 1160d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn */ 1170d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn private void handleTestConferenceEventPackage(Context context, String fileName) { 1180d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn // Attempt to get the active IMS call before parsing the test XML file. 119fdca22cc56b0e1ef1504e36a5aacb2ebbc4d146cTyler Gunn ImsPhone imsPhone = (ImsPhone) mPhone; 1200d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn if (imsPhone == null) { 1210d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn return; 1220d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn } 1230d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn 1240d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn ImsPhoneCall imsPhoneCall = imsPhone.getForegroundCall(); 1250d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn if (imsPhoneCall == null) { 1260d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn return; 1270d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn } 1280d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn 1290d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn ImsCall imsCall = imsPhoneCall.getImsCall(); 1300d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn if (imsCall == null) { 1310d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn return; 1320d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn } 1330d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn 1340d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn File packageFile = new File(context.getFilesDir(), fileName); 1350d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn final FileInputStream is; 1360d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn try { 1370d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn is = new FileInputStream(packageFile); 1380d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn } catch (FileNotFoundException ex) { 1390d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn log("Test conference event package file not found: " + packageFile.getAbsolutePath()); 1400d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn return; 1410d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn } 1420d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn 1430d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn TestConferenceEventPackageParser parser = new TestConferenceEventPackageParser(is); 1440d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn ImsConferenceState imsConferenceState = parser.parse(); 1450d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn if (imsConferenceState == null) { 1460d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn return; 1470d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn } 1480d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn 1490d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn imsCall.conferenceStateUpdated(imsConferenceState); 1500d4f1fe3137cc4a76fc2bb0dac80c68220e53550Tyler Gunn } 151ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville} 152