internal void SaveStates()
        {
            m_JsonSerialization = new AndroidLogcatJsonSerialization();
            m_JsonSerialization.m_SelectedDeviceId = m_SelectedDeviceId;
            m_JsonSerialization.m_SelectedPackage  = m_SelectedPackage;
            m_JsonSerialization.m_SelectedPriority = m_SelectedPriority;
            m_JsonSerialization.m_TagControl       = m_TagControl;

            // Convert Dictionary to List for serialization.
            var packagesForSerialization = new List <PackageInformation>();

            foreach (var p in m_PackagesForAllDevices)
            {
                packagesForSerialization.AddRange(p.Value);
            }
            m_JsonSerialization.m_PackagesForSerialization = packagesForSerialization;

            var jsonString = JsonUtility.ToJson(m_JsonSerialization);

            m_JsonSerialization = null;
            if (string.IsNullOrEmpty(jsonString))
            {
                return;
            }

            var jsonFilePath = Path.Combine(Application.persistentDataPath, kJsonFileName);

            if (File.Exists(jsonFilePath))
            {
                File.Delete(jsonFilePath);
            }
            File.WriteAllText(jsonFilePath, jsonString);

            EditorPrefs.SetString(kJsonFileEditorPrefKey, jsonFilePath);
        }
        internal void LoadStates()
        {
            if (!EditorPrefs.HasKey(kJsonFileEditorPrefKey))
            {
                return;
            }

            var jsonFile = EditorPrefs.GetString(kJsonFileEditorPrefKey);

            if (string.IsNullOrEmpty(jsonFile) || !File.Exists(jsonFile))
            {
                return;
            }

            var jsonString = File.ReadAllText(jsonFile);

            if (string.IsNullOrEmpty(jsonString))
            {
                return;
            }

            try
            {
                m_JsonSerialization = JsonUtility.FromJson <AndroidLogcatJsonSerialization>(jsonString);
            }
            catch (Exception ex)
            {
                AndroidLogcatInternalLog.Log("Load Preferences from Json failed: " + ex.Message);
                m_JsonSerialization = null;
                return;
            }

            // We can only restore Priority, TagControl & PackageForSerialization here.
            // For selected device & package, we have to delay it when we first launch the window.
            m_SelectedPriority        = m_JsonSerialization.m_SelectedPriority;
            m_TagControl.TagNames     = m_JsonSerialization.m_TagControl.TagNames;
            m_TagControl.SelectedTags = m_JsonSerialization.m_TagControl.SelectedTags;

            m_PackagesForAllDevices = new Dictionary <string, List <PackageInformation> >();
            foreach (var p in m_JsonSerialization.m_PackagesForSerialization)
            {
                List <PackageInformation> packages;
                if (!m_PackagesForAllDevices.TryGetValue(p.deviceId, out packages))
                {
                    packages = new List <PackageInformation>();
                    m_PackagesForAllDevices[p.deviceId] = packages;
                }
                packages.Add(p);
            }
        }
        private void GetSelectedDeviceIndex(out int selectedDeviceIndex, out PackageInformation selectedPackage)
        {
            if (m_JsonSerialization == null || string.IsNullOrEmpty(m_JsonSerialization.m_SelectedDeviceId) || m_DeviceIds.IndexOf(m_JsonSerialization.m_SelectedDeviceId) < 0)
            {
                selectedDeviceIndex = 0;
                selectedPackage     = null;
                m_JsonSerialization = null;
                return;
            }

            selectedDeviceIndex = m_DeviceIds.IndexOf(m_JsonSerialization.m_SelectedDeviceId);
            selectedPackage     = m_JsonSerialization.m_SelectedPackage;

            // We should only restore from AndroidLogcatJsonSerialization once during first launching.
            m_JsonSerialization = null;
        }