AndroidPlusPlus.Common.AndroidAdb.Refresh C# (CSharp) Method

Refresh() public static method

public static Refresh ( ) : void
return void
        public static void Refresh()
        {
            LoggingUtils.PrintFunction ();

              lock (m_updateLockMutex)
              {
            //
            // Start an ADB instance, if required.
            //

            using (SyncRedirectProcess adbStartServer = new SyncRedirectProcess (AndroidSettings.SdkRoot + @"\platform-tools\adb.exe", "start-server"))
            {
              adbStartServer.StartAndWaitForExit (30000);
            }

            using (SyncRedirectProcess adbDevices = new SyncRedirectProcess (AndroidSettings.SdkRoot + @"\platform-tools\adb.exe", "devices"))
            {
              adbDevices.StartAndWaitForExit (30000);

              //
              // Parse 'devices' output, skipping headers and potential 'start-server' output.
              //

              Dictionary<string, string> currentAdbDevices = new Dictionary<string, string> ();

              LoggingUtils.Print (string.Concat ("[AndroidAdb] Devices output: ", adbDevices.StandardOutput));

              if (!String.IsNullOrEmpty (adbDevices.StandardOutput))
              {
            string [] deviceOutputLines = adbDevices.StandardOutput.Replace ("\r", "").Split (new char [] { '\n' });

            foreach (string line in deviceOutputLines)
            {
              if (Regex.IsMatch (line, "^[A-Za-z0-9.:\\-]+[\t][A-Za-z]+$"))
              {
                string [] segments = line.Split (new char [] { '\t' });

                string deviceName = segments [0];

                string deviceType = segments [1];

                currentAdbDevices.Add (deviceName, deviceType);
              }
            }
              }

              //
              // First identify any previously tracked devices which aren't in 'devices' output.
              //

              HashSet<string> disconnectedDevices = new HashSet<string> ();

              foreach (string key in m_connectedDevices.Keys)
              {
            string deviceName = (string) key;

            if (!currentAdbDevices.ContainsKey (deviceName))
            {
              disconnectedDevices.Add (deviceName);
            }
              }

              //
              // Identify whether any devices have changed state; connected/persisted/disconnected.
              //

              foreach (KeyValuePair <string, string> devicePair in currentAdbDevices)
              {
            string deviceName = devicePair.Key;

            string deviceType = devicePair.Value;

            if (deviceType.Equals ("offline", StringComparison.InvariantCultureIgnoreCase))
            {
              disconnectedDevices.Add (deviceName);
            }
            else if (deviceType.Equals ("unauthorized", StringComparison.InvariantCultureIgnoreCase))
            {
              // User needs to allow USB debugging.
            }
            else
            {
              AndroidDevice connectedDevice;

              if (m_connectedDevices.TryGetValue (deviceName, out connectedDevice))
              {
                //
                // Device is pervasive. Refresh internal properties.
                //

                LoggingUtils.Print (string.Format ("[AndroidAdb] Device pervaded: {0} - {1}", deviceName, deviceType));

                connectedDevice.Refresh ();

                foreach (IStateListener deviceListener in m_registeredDeviceStateListeners)
                {
                  deviceListener.DevicePervasive (connectedDevice);
                }
              }
              else
              {
                //
                // Device connected.
                //

                LoggingUtils.Print (string.Format ("[AndroidAdb] Device connected: {0} - {1}", deviceName, deviceType));

                connectedDevice = new AndroidDevice (deviceName);

                connectedDevice.Refresh ();

                m_connectedDevices.Add (deviceName, connectedDevice);

                foreach (IStateListener deviceListener in m_registeredDeviceStateListeners)
                {
                  deviceListener.DeviceConnected (connectedDevice);
                }
              }
            }
              }

              //
              // Finally, handle device disconnection.
              //

              foreach (string deviceName in disconnectedDevices)
              {
            AndroidDevice disconnectedDevice;

            if (m_connectedDevices.TryGetValue (deviceName, out disconnectedDevice))
            {
              LoggingUtils.Print (string.Concat ("[AndroidAdb] Device disconnected: ", deviceName));

              m_connectedDevices.Remove (deviceName);

              foreach (IStateListener deviceListener in m_registeredDeviceStateListeners)
              {
                deviceListener.DeviceDisconnected (disconnectedDevice);
              }
            }
              }
            }
              }
        }