/*
* 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}.
* <pre>
* {@code
* <xml>
* <participant>
* <user>tel:+16505551212</user>
* <display-text>Joe Q. Public</display-text>
* <endpoint>sip:+16505551212@ims-test-provider.com</endpoint>
* <status>connected</status>
* </participant>
* </xml>
* }
* </pre>
* <p>
* 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}).
* <p>
* 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:
* <pre>
* adb shell am broadcast
* -a com.android.internal.telephony.TestConferenceEventPackage
* -e filename test.xml
* </pre>
*/
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;
}
}