13d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/*
23d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Copyright (C) 2014 The Android Open Source Project
33d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
43d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License");
53d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * you may not use this file except in compliance with the License.
63d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * You may obtain a copy of the License at
73d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
83d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *      http://www.apache.org/licenses/LICENSE-2.0
93d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Unless required by applicable law or agreed to in writing, software
113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS,
123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * See the License for the specific language governing permissions and
143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * limitations under the License.
153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby */
163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambypackage com.android.omadm.plugin.diagmon;
183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport android.content.Context;
203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport android.telephony.PhoneStateListener;
213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport android.telephony.ServiceState;
223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport android.telephony.TelephonyManager;
233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport android.util.Log;
243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport com.android.omadm.plugin.DmtBasePlugin;
263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport com.android.omadm.plugin.DmtData;
273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport com.android.omadm.plugin.DmtPathUtils;
283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport com.android.omadm.plugin.DmtPluginNode;
293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport com.android.omadm.plugin.ErrorCodes;
303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport java.lang.reflect.Method;
323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport java.util.HashMap;
333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyimport java.util.Map;
343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambypublic class DiagmonPlugin extends DmtBasePlugin {
363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    private static final String TAG = "DiagmonPlugin";
379de065bbc4c088bf1930abb85ccf07a2a0b0be7dAmit Mahajan    private static final boolean DBG = true;
383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    private String mRootPath;
403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    private Context mContext;
423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    private Map<String, DmtData> nodeValues;
443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    private boolean mHomeRoam = false;
463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    private RFPhoneStateListener mRFPhoneStateListener;
483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    public TelephonyManager mTelephonyManager;
503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    public static final String DIAGMON_ROOT = DmtPathUtils.ROOTNODE;
523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    public static final String DIAGMON_PATH = "./ManagedObjects/DiagMon";
543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    public DiagmonPlugin(Context ctx) {
573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        mContext = ctx;
583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        mTelephonyManager = (TelephonyManager) mContext
603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                .getSystemService(Context.TELEPHONY_SERVICE);
613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        mRFPhoneStateListener = new RFPhoneStateListener();
623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        mTelephonyManager.listen(mRFPhoneStateListener,
633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        mTelephonyManager.listen(mRFPhoneStateListener,
653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                PhoneStateListener.LISTEN_SERVICE_STATE);
663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    @SuppressWarnings("unchecked")
693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    public boolean init(String rootPath, Map parameters) {
703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (DiagmonPlugin.DBG) {
713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            Log.i(TAG, "Enter DiagmonPlugin.init");
723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        mRootPath = rootPath;
743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        nodeValues = new HashMap<String, DmtData>();
753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        String tmpPath = DIAGMON_ROOT;
763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtData tmpNodeData = new DmtData("RF", DmtData.NODE);
773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        nodeValues.put(tmpPath, tmpNodeData);
783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        tmpPath = "RF";
793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        tmpNodeData = new DmtData("CurrentSystem|HomeRoam", DmtData.NODE);
803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        nodeValues.put(tmpPath, tmpNodeData);
813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        tmpPath = "RF/CurrentSystem";
823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        tmpNodeData = new DmtData("Data|Voice", DmtData.NODE);
833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        nodeValues.put(tmpPath, tmpNodeData);
843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        tmpPath = "RF/CurrentSystem/Data";
853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        tmpNodeData = new DmtData(null, DmtData.STRING);
863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        nodeValues.put(tmpPath, tmpNodeData);
873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        tmpPath = "RF/CurrentSystem/Voice";
883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        tmpNodeData = new DmtData(null, DmtData.STRING);
893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        nodeValues.put(tmpPath, tmpNodeData);
903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        tmpPath = "RF/HomeRoam";
913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        tmpNodeData = new DmtData(null, DmtData.STRING);
923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        nodeValues.put(tmpPath, tmpNodeData);
933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return true;
953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    //@Override
983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    public DmtPluginNode getNode(String path) {
993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtPluginNode node = new DmtPluginNode("", new DmtData("abc"));
1003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        setOperationResult(ErrorCodes.SYNCML_DM_SUCCESS);
1013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return node;
1023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    //@Override
1053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    public DmtData getNodeValue(String path) {
1063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (DiagmonPlugin.DBG) {
1073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            Log.i(TAG, "rootPath=" + mRootPath);
1083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
1093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (DiagmonPlugin.DBG) {
1103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            Log.i(TAG, "path=" + path);
1113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
1123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        //mContext.enforceCallingPermission("com.android.permission.READ_OMADM_SETTINGS", "Insufficient Permissions");
1133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtData data = null;
1153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (path.equals("./ManagedObjects/DiagMon/RF/CurrentSystem/Data")) {
1173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            if (DiagmonPlugin.DBG) {
1183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                Log.d(TAG, "Get on CurrentSystem Value");
1193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
1203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            String mCurrentSystem;
1213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            try {
1223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                mCurrentSystem = getCurrentSystem();
1233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                if (DiagmonPlugin.DBG) {
1243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                    Log.d(TAG, "Current System Value: " + mCurrentSystem);
1253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                }
1263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            } catch (Exception e) {
1273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                mCurrentSystem = "Unknown";
1283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                if (DiagmonPlugin.DBG) {
1293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                    Log.d(TAG, "Get on Current System Value failed");
1303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                }
1313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                e.printStackTrace();
1323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
1333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            data = new DmtData(mCurrentSystem);
1343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            setOperationResult(ErrorCodes.SYNCML_DM_SUCCESS);
1353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } else if (path.equals("./ManagedObjects/DiagMon/RF/CurrentSystem/Voice")) {
1363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            if (DiagmonPlugin.DBG) {
1373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                Log.d(TAG, "Get on CurrentSystem Voice Value");
1383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
1393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            String mCurrentSystemVoice;
1403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            if (isVoiceCapable(mContext)) {
1413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                mCurrentSystemVoice = "1xRTT"; //As per VZW (36953) requirement value is 1xRTT
1423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            } else {
1433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                mCurrentSystemVoice = "Voice not available";
1443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
1453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            if (DiagmonPlugin.DBG) {
1463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                Log.d(TAG, "Current System Voice Value: " + mCurrentSystemVoice);
1473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
1483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            data = new DmtData(mCurrentSystemVoice);
1493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            setOperationResult(ErrorCodes.SYNCML_DM_SUCCESS);
1503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } else if (path.equals("./ManagedObjects/DiagMon/RF/HomeRoam")) {
1513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            if (DiagmonPlugin.DBG) {
1523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                Log.d(TAG, "Get on HomeRoam Value");
1533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
1543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            String sHomeRoam;
1553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            try {
1563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                sHomeRoam = getHomeRoam();
1573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                if (DiagmonPlugin.DBG) {
1583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                    Log.d(TAG, "HomeRoam Value: " + sHomeRoam);
1593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                }
1603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            } catch (Exception e) {
1613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                sHomeRoam = "Unknown";
1623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                if (DiagmonPlugin.DBG) {
1633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                    Log.d(TAG, "Get on HomeRoam Value failed");
1643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                }
1653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                e.printStackTrace();
1663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
1673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            data = new DmtData(sHomeRoam);
1683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            setOperationResult(ErrorCodes.SYNCML_DM_SUCCESS);
1693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } else {
1703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            setOperationResult(ErrorCodes.SYNCML_DM_FAIL);
1713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
1723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return data;
1743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
1753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    @SuppressWarnings("unchecked")
1773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    //@Override
1783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    public Map getNodes(String rootPath) {
1793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (DiagmonPlugin.DBG) {
1803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            Log.d(TAG, "Enter DiagmonPlugin::getNodes()");
1813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
1823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        Map<String, DmtPluginNode> hMap = new HashMap<String, DmtPluginNode>();
1833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        DmtPluginNode node;
1843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        Map<String, DmtData> nodes = getNodeMap(DmtPathUtils.toRelativePath(DIAGMON_PATH,
1863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                mRootPath));
1873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        for (String diagPath : nodes.keySet()) {
189a8e2fa040a362ece19771d8bb15fe6dc4fa67329Dawn Liu            DmtData data = nodes.get(diagPath);
1903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            if (diagPath.equals(DIAGMON_ROOT)) {
1913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                diagPath = "";
1923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
1933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            if (DiagmonPlugin.DBG) {
1943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                Log.i(TAG, "put node = '" + diagPath + "'");
1953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
196a8e2fa040a362ece19771d8bb15fe6dc4fa67329Dawn Liu            node = new DmtPluginNode(diagPath, data);
1973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            hMap.put(diagPath, node);
1983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
1993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (DiagmonPlugin.DBG) {
2013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            Log.i(TAG, "created the nodes.");
2023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
2033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (DiagmonPlugin.DBG) {
2043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            Log.d(TAG, "Leave DiagmonPlugin::getNodes()");
2053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
2063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return hMap;
2073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
2083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    public Map<String, DmtData> getNodeMap(String rootPath) {
2103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        Map<String, DmtData> nodeMap = new HashMap<String, DmtData>();
2123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (rootPath.equals(DIAGMON_ROOT)) {
2133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            nodeMap.putAll(nodeValues);
2143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } else {
2153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            for (String key : nodeValues.keySet()) {
2163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                if (key.startsWith(rootPath)) {
2173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                    if ((key.substring(rootPath.length(), (rootPath.length() + 1))).equals("/")) {
2183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                        nodeMap.put(key, nodeValues.get(key));
2193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                    }
2203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                }
2213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
2223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
2233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return nodeMap;
2243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
2253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    public boolean release() {
2273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        mTelephonyManager.listen(mRFPhoneStateListener, PhoneStateListener.LISTEN_NONE);
2283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return true;
2293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
2303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    private final class RFPhoneStateListener extends PhoneStateListener {
2323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        @Override
2343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        public void onServiceStateChanged(ServiceState serviceState) {
2353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            mHomeRoam = serviceState.getRoaming();
2363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            if (DiagmonPlugin.DBG) {
2373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                Log.v(TAG, "Service State intent received: " + mHomeRoam);
2383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            }
2393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
2403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
2413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    private String getCurrentSystem() {
2433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        int mNetworkType = mTelephonyManager.getNetworkType();
2443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (DiagmonPlugin.DBG) {
2453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            Log.d(TAG, "Network Type value : " + mNetworkType);
2463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
2473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (mNetworkType == TelephonyManager.NETWORK_TYPE_UNKNOWN) {
2483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return ("Unknown");
2493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } else if (mNetworkType == TelephonyManager.NETWORK_TYPE_1xRTT) {
2503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return ("1xRTT");
2513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } else if (mNetworkType == TelephonyManager.NETWORK_TYPE_EVDO_0
2523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                || mNetworkType == TelephonyManager.NETWORK_TYPE_EVDO_A) {
2533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return ("EVDO");
2543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } else if (mNetworkType == TelephonyManager.NETWORK_TYPE_LTE) {
2553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return ("LTE");
2563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } else if (mNetworkType == TelephonyManager.NETWORK_TYPE_EHRPD) {
2573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return ("eHRPD");
2583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } else {
2593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return ("Unknown");
2603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
2613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
2623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    private String getHomeRoam() {
2643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (mHomeRoam) {
2653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return ("Roam");
2663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } else {
2673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return ("Home");
2683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
2693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
2703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
2713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    private static boolean isVoiceCapable(Context context) {
2723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        TelephonyManager telephonyManager =
2733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby                (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
2743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        if (telephonyManager == null) {
2753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return false;
2763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
2773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        try {
2783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            Class partypes[] = new Class[0];
2793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            Method sIsVoiceCapable = TelephonyManager.class.getMethod("isVoiceCapable", partypes);
2803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            Object arglist[] = new Object[0];
2813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            Object retobj = sIsVoiceCapable.invoke(telephonyManager, arglist);
2823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            return (Boolean) retobj;
2833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } catch (java.lang.reflect.InvocationTargetException e) {
2843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            // Failure, must be another device.
2853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            // Assume that it is voice capable.
2863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            e.printStackTrace();
2873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } catch (IllegalAccessException e) {
2883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            // Failure, must be an other device.
2893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            // Assume that it is voice capable.
2903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            e.printStackTrace();
2913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        } catch (NoSuchMethodException e) {
2923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby            e.printStackTrace();
2933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        }
2943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        return true;
2953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    }
2963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
297