/* * Copyright (C) 2014 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.test; import com.android.ims.ImsConferenceState; import com.android.internal.util.XmlUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.os.Bundle; import android.util.Log; import android.util.Xml; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; /** * Implements a basic XML parser used to parse test IMS conference event packages which can be * injected into the IMS framework via the {@link com.android.internal.telephony.TelephonyTester}. *
 * {@code
 * 
 *     
 *         tel:+16505551212
 *         Joe Q. Public
 *         sip:+16505551212@ims-test-provider.com
 *         connected
 *     
 * 
 * }
 * 
*

* Note: This XML format is similar to the information stored in the * {@link com.android.ims.ImsConferenceState} parcelable. The {@code status} values expected in the * XML are those found in the {@code ImsConferenceState} class (e.g. * {@link com.android.ims.ImsConferenceState#STATUS_CONNECTED}). *

* Place a file formatted similar to above in /data/data/com.android.phone/files/ and invoke the * following command while you have an ongoing IMS call: *

 *     adb shell am broadcast
 *          -a com.android.internal.telephony.TestConferenceEventPackage
 *          -e filename test.xml
 * 
*/ public class TestConferenceEventPackageParser { private static final String LOG_TAG = "TestConferenceEventPackageParser"; private static final String PARTICIPANT_TAG = "participant"; /** * The XML input stream to parse. */ private InputStream mInputStream; /** * Constructs an input of the conference event package parser for the given input stream. * * @param inputStream The input stream. */ public TestConferenceEventPackageParser(InputStream inputStream) { mInputStream = inputStream; } /** * Parses the conference event package XML file and returns an * {@link com.android.ims.ImsConferenceState} instance containing the participants described in * the XML file. * * @return The {@link com.android.ims.ImsConferenceState} instance. */ public ImsConferenceState parse() { ImsConferenceState conferenceState = new ImsConferenceState(); XmlPullParser parser; try { parser = Xml.newPullParser(); parser.setInput(mInputStream, null); parser.nextTag(); int outerDepth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, outerDepth)) { if (parser.getName().equals(PARTICIPANT_TAG)) { Log.v(LOG_TAG, "Found participant."); Bundle participant = parseParticipant(parser); conferenceState.mParticipants.put(participant.getString( ImsConferenceState.ENDPOINT), participant); } } } catch (IOException | XmlPullParserException e) { Log.e(LOG_TAG, "Failed to read test conference event package from XML file", e); return null; } finally { try { mInputStream.close(); } catch (IOException e) { Log.e(LOG_TAG, "Failed to close test conference event package InputStream", e); return null; } } return conferenceState; } /** * Parses a participant record from a conference event package XML file. * * @param parser The XML parser. * @return {@link Bundle} containing the participant information. */ private Bundle parseParticipant(XmlPullParser parser) throws IOException, XmlPullParserException { Bundle bundle = new Bundle(); String user = ""; String displayText = ""; String endpoint = ""; String status = ""; int outerDepth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, outerDepth)) { if (parser.getName().equals(ImsConferenceState.USER)) { parser.next(); user = parser.getText(); } else if (parser.getName().equals(ImsConferenceState.DISPLAY_TEXT)) { parser.next(); displayText = parser.getText(); } else if (parser.getName().equals(ImsConferenceState.ENDPOINT)) { parser.next(); endpoint = parser.getText(); } else if (parser.getName().equals(ImsConferenceState.STATUS)) { parser.next(); status = parser.getText(); } } Log.v(LOG_TAG, "User: "+user); Log.v(LOG_TAG, "DisplayText: "+displayText); Log.v(LOG_TAG, "Endpoint: "+endpoint); Log.v(LOG_TAG, "Status: "+status); bundle.putString(ImsConferenceState.USER, user); bundle.putString(ImsConferenceState.DISPLAY_TEXT, displayText); bundle.putString(ImsConferenceState.ENDPOINT, endpoint); bundle.putString(ImsConferenceState.STATUS, status); return bundle; } }