package com.thibaudperso.sonycamera.sdk.model; import android.content.SharedPreferences; import android.content.res.XmlResourceParser; import android.preference.PreferenceManager; import com.thibaudperso.sonycamera.R; import com.thibaudperso.sonycamera.timelapse.TimelapseApplication; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class DeviceManager { private static final String ns = null; private static final String CAMERA_ID_PREFERENCE = "pref_camera_id"; private TimelapseApplication mApplication; private List<Device> mDevicesList; private Device mSelectedDevice; public DeviceManager(TimelapseApplication application) { this.mApplication = application; mDevicesList = new ArrayList<>(); final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(application); int currentCameraId = preferences.getInt(CAMERA_ID_PREFERENCE, -1); parseCameraModels(application.getResources().getXml(R.xml.devices)); for(Device device : mDevicesList) { if(device.getId() == currentCameraId) { mSelectedDevice = device; mApplication.getCameraAPI().setDevice(device); } } } public List<Device> getDevices() { return mDevicesList; } public Device getSelectedDevice() { return mSelectedDevice; } public void setSelectedDevice(Device selectedDevice) { // Be sure it's not a copy for(Device device : mDevicesList) { if(device.equals(selectedDevice)) { final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mApplication); preferences.edit().putInt(CAMERA_ID_PREFERENCE, device.getId()).apply(); mSelectedDevice = device; mApplication.getCameraAPI().setDevice(device); return; } } } /* * XML parser */ private List<Device> parseCameraModels(XmlResourceParser parser) { mDevicesList.clear(); try { //parser.require(XmlPullParser.START_TAG, ns, "cameras"); while (parser.next() != XmlPullParser.END_DOCUMENT) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); if (name.equals("camera")) { mDevicesList.add(readCamera(parser)); } } } catch (Exception e) { e.printStackTrace(); } return mDevicesList; } private Device readCamera(XmlPullParser parser) throws XmlPullParserException, IOException { parser.require(XmlPullParser.START_TAG, ns, "camera"); int id = -1; String deviceModel = null; String webService = null; String needInitString = parser.getAttributeValue(ns, "needInit"); boolean needInit = needInitString != null && "true".equals(needInitString); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); switch (name) { case "id": id = readId(parser); break; case "model": deviceModel = readModel(parser); break; case "webservice": webService = readWebService(parser); break; default: skip(parser); break; } } return new Device(id, deviceModel, webService, needInit); } private int readId(XmlPullParser parser) throws IOException, XmlPullParserException { int id = -1; parser.require(XmlPullParser.START_TAG, ns, "id"); try { id = Integer.parseInt(readText(parser)); } catch(Exception ignored) {} parser.require(XmlPullParser.END_TAG, ns, "id"); return id; } private String readModel(XmlPullParser parser) throws IOException, XmlPullParserException { parser.require(XmlPullParser.START_TAG, ns, "model"); String model = readText(parser); parser.require(XmlPullParser.END_TAG, ns, "model"); return model; } private String readWebService(XmlPullParser parser) throws IOException, XmlPullParserException { parser.require(XmlPullParser.START_TAG, ns, "webservice"); String webService = readText(parser); parser.require(XmlPullParser.END_TAG, ns, "webservice"); return webService; } private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { String result = ""; if (parser.next() == XmlPullParser.TEXT) { result = parser.getText(); parser.nextTag(); } return result; } private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { if (parser.getEventType() != XmlPullParser.START_TAG) { throw new IllegalStateException(); } int depth = 1; while (depth != 0) { switch (parser.next()) { case XmlPullParser.END_TAG: depth--; break; case XmlPullParser.START_TAG: depth++; break; } } } }