package com.iwedia.service.system; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.util.Log; import com.iwedia.comm.ISourceDeviceCallback; import com.iwedia.comm.devices.SourceDevice; import com.iwedia.comm.system.IInputSettings; public class InputSettings extends IInputSettings.Stub { public static final boolean DEBUG = true; public static final String LOG_TAG = "InputSettings"; private static Object lock = new Object(); final static RemoteCallbackList<ISourceDeviceCallback> mSourceDeviceCallback = new RemoteCallbackList<ISourceDeviceCallback>(); // XML Parsing Data private static final String INPUT_FILE = "/system/etc/input_config.xml"; private static final String INPUT = "inputs"; private static final String INPUT_TAG = "inputs"; private static final String INPUT_TYPE_TAG = "type"; private static final String INPUT_PORT_TAG = "port"; private static final String INPUT_NAME_TAG = "name"; // public static final String INPUT_SCHEME_TAG = "scheme"; // SharedPreference private static final String LAST_INPUT_DEVICE_URI = "last_input_device_uri"; private List<SourceDevice> deviceList = new ArrayList<SourceDevice>(); public InputSettings() { } public static void callSwitchSourceDevice(SourceDevice device) { synchronized (lock) { int i = mSourceDeviceCallback.beginBroadcast(); if (i > 1) { Log.e("ActionControl", "More than one callback (" + i + ")"); } while (i > 0) { i--; try { mSourceDeviceCallback.getBroadcastItem(i) .switchSourceDevice(device); } catch (RemoteException e) { e.printStackTrace(); } catch (RuntimeException e) { e.printStackTrace(); mSourceDeviceCallback.unregister(mSourceDeviceCallback .getBroadcastItem(i)); } } mSourceDeviceCallback.finishBroadcast(); } } public void scanAvailableDevices() throws RemoteException { if (deviceList.isEmpty()) { parseInputs(); } } private List<SourceDevice> parseInputs() { SourceDevice device; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new File(INPUT_FILE)); NodeList nodelist = doc.getElementsByTagName(INPUT_TAG); int size = nodelist.getLength(); for (int i = 0; i < size; i++) { for (Node child = nodelist.item(i).getFirstChild(); child != null; child = child .getNextSibling()) { if (child instanceof Element) { Element element = (Element) child; // if ("true".equals(child.getTextContent())) { device = new SourceDevice( element.getAttribute(INPUT_TYPE_TAG), Integer.parseInt(element .getAttribute(INPUT_PORT_TAG)), element.getAttribute(INPUT_NAME_TAG)); deviceList.add(device); // } } } } } catch (ParserConfigurationException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } catch (SAXException ex) { ex.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } return deviceList; } }