Beispiel #1
0
        private String UseDevicePicker( )
        {
            var result = String.Empty;
            // if its not an extended backup, we need to get a device
            var devices = CommandRunner.Instance.GetDevices( ).Select(d => d.SerialNumber).ToList( );

            if (devices.Count != 1)
            {
                GenericDeviceSelectionForm selectDevice = new GenericDeviceSelectionForm( );
                if (selectDevice.ShowDialog( ) == DialogResult.OK)
                {
                    result = selectDevice.SelectedDevice;
                    CommandRunner.Instance.DefaultDevice = result;
                }
            }
            else
            {
                result = devices[0];
            }
            return(result);
        }
Beispiel #2
0
        static void Main(string[] arguments)
        {
            try {
                using (Stream stream = typeof(Program).Assembly.GetManifestResourceStream("DroidExplorer.Runner.DroidExplorer.Runner.log4net")) {
                    XmlConfigurator.Configure(stream);
                }
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                CommandRunner.Settings           = Settings.Instance;
                Settings.Instance.SystemSettings = RegistrySettings.Instance;

                string sdkPath = Settings.Instance.SystemSettings.SdkPath;
                if (String.IsNullOrEmpty(sdkPath))
                {
                    throw new ApplicationException("SDK was not successfully set during install.");
                }
                CommandRunner.Instance.SdkPath = sdkPath;
                CommandRunner.Instance.StartServer();

                if (!FolderManagement.VerifyAndroidSdkTools())
                {
                    throw new ApplicationException("Unable to locate the android SDK tools, please reinstall the application.");
                }


                Logger.LogDebug(typeof(RunnerPluginHost), "Launching Runner with args: {0}", string.Join(" ", arguments));
                Arguments args = new Arguments(arguments);

                // check if we need to know about a specific device
                var defDevice = String.Empty;

                if (!args.Contains("nodevice"))
                {
                    Logger.LogDebug(typeof(RunnerPluginHost), "Need Device");
                    var devices = CommandRunner.Instance.GetDevices().Select(d => d.SerialNumber).ToList();
                    if (devices.Count != 1)
                    {
                        GenericDeviceSelectionForm selectDevice = new GenericDeviceSelectionForm();
                        if (selectDevice.ShowDialog() == DialogResult.OK)
                        {
                            defDevice = selectDevice.SelectedDevice;
                            CommandRunner.Instance.DefaultDevice = defDevice;
                            Logger.LogDebug("Setting device to '{0}'", defDevice);
                        }
                        else
                        {
                            return;
                        }
                    }
                    else
                    {
                        defDevice = devices[0];
                        Logger.LogDebug("Setting device to '{0}'", defDevice);
                    }
                }
                var phost = new RunnerPluginHost(defDevice);

                string typeAssembly = string.Empty;
                if (!args.Contains("type", "t"))
                {
                    SelectPluginDialog spd = new SelectPluginDialog();
                    if (spd.ShowDialog() == DialogResult.OK)
                    {
                        typeAssembly = spd.SelectedPlugin.Replace(" ", string.Empty);
                        arguments    = spd.CommandlineArguments;
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    typeAssembly = args["type", "t"];
                }

                Logger.LogDebug(typeof(RunnerPluginHost), "Launching Plugin {0}", typeAssembly);
                var plugin = DroidExplorer.Configuration.Settings.Instance.PluginSettings.GetPlugins(phost)
                             .SingleOrDefault(m => String.Compare(typeAssembly, m.Id, true) == 0);
                if (plugin != null)
                {
                    try {
                        Logger.LogDebug(typeof(RunnerPluginHost), "Initializing plugin: {0}", plugin.Name);
                        plugin.Initialize(phost);
                        Logger.LogDebug(typeof(RunnerPluginHost), "running plugin: {0} with args: {1}", plugin.Name, String.Join(" ", arguments));
                        plugin.Execute(phost, arguments);
                    } catch (Exception ex) {
                        plugin.LogError(ex.Message, ex);
                    }
                }
                else
                {
                    Logger.LogDebug(typeof(RunnerPluginHost), "plugin '{0}' not found", typeAssembly);
                    throw new ApplicationException("Error executing plugin, check the name to ensure it exists");
                }
            } catch (Exception ex) {
                Logger.LogError(typeof(RunnerPluginHost), ex.Message, ex);
            }
        }
Beispiel #3
0
        static void Main(string[] arguments)
        {
            try {
                using (var stream = typeof(Program).Assembly.GetManifestResourceStream(DroidExplorer.Resources.Strings.Log4NetDroidExplorer)) {
                    XmlConfigurator.Configure(stream);
                }
                var errorMessages = new List <string>();

                var args = new Arguments(arguments);
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                Application.ThreadException +=
                    (sender, e) => DroidExplorer.Core.Logger.LogError(typeof(Program), e.Exception.Message, e.Exception);

                // show the splash dialog
                Program.SplashManager.ShowSplashDialog(StartUpStepCount);

                // load settings
                Logger.LogDebug(typeof(Program), "Loading Droid Explorer Settings");
                Program.SplashManager.SplashDialog.SetStepText("Loading Settings...");
                CommandRunner.Settings           = Settings.Instance;
                Settings.Instance.SystemSettings = RegistrySettings.Instance;
                Program.SplashManager.SplashDialog.IncrementLoadStep(1);


                // cleanup adb? should this be done?
                Application.ApplicationExit += delegate(object sender, EventArgs e) {
                    //CommandRunner.Instance.AdbProcessCleanUp ( );
                };

                // locate sdk tools
                Logger.LogDebug(typeof(Program), "Locating SDK Path");
                Program.SplashManager.SplashDialog.SetStepText(DroidExplorer.Resources.Strings.SplashLocatingSdk);
                var sdkPath = Settings.Instance.SystemSettings.SdkPath;
                Logger.LogDebug(typeof(Program), "SDK Path Set to {0}", sdkPath);

                if (string.IsNullOrEmpty(sdkPath))
                {
                    throw new ApplicationException("Unable to locate the android SDK tools, please reinstall the application.");
                }
                Program.SplashManager.SplashDialog.IncrementLoadStep(1);

                // verify the sdk tools
                Logger.LogDebug(typeof(Program), "Verifying SDK Tools");
                Program.SplashManager.SplashDialog.SetStepText("Verifying SDK Tools");

                // verify the sdk tools.
                var valid = FolderManagement.VerifyAndroidSdkTools();
                if (!valid)
                {
                    // if not valid - lets ask the user where it is.
                    Program.SplashManager.SplashDialog.HideExt();
                    Logger.LogWarn(typeof(Program), "Unable to verify the SDK tools");

                    var browser = new FolderBrowserDialog();
                    browser.Description         = "Unable to locate SDK tools path. Please select the location where you have the Android SDK installed.";
                    browser.ShowNewFolderButton = false;
                    var dResult = DialogResult.OK;
                    do
                    {
                        dResult = browser.ShowDialog();
                        if (dResult == DialogResult.OK)
                        {
                            Settings.Instance.SystemSettings.SdkPath = browser.SelectedPath;
                            valid = FolderManagement.VerifyAndroidSdkTools();
                        }
                        // keep asking until the user selects a valid location, or they cancel.
                    } while(!valid && dResult == DialogResult.OK);

                    if (!valid)
                    {
                        // they canceled. we are out of here.
                        throw new ApplicationException(DroidExplorer.Resources.Strings.SdkPathNotFoundMessage);
                    }

                    // bring it back.
                    Program.SplashManager.SplashDialog.AsyncShow();
                }


                Program.SplashManager.SplashDialog.IncrementLoadStep(1);

                // set the sdk path
                CommandRunner.Instance.SdkPath = sdkPath;
                Program.SplashManager.SplashDialog.SetStepText(DroidExplorer.Resources.Strings.SplashStartAdb);
                try {
                    // start the adb server
                    Logger.LogDebug(typeof(Program), "Starting ADB Server");

                    CommandRunner.Instance.StartServer();
                    Program.SplashManager.SplashDialog.IncrementLoadStep(1);
                } catch (AdbRootException arex) {
                    Logger.LogWarn(typeof(Program), arex.Message);
                }
                // get the attached devices
                Program.SplashManager.SplashDialog.SetStepText(DroidExplorer.Resources.Strings.SplashGetDevices);
                // BUG: 15695
                // fixed this. It was because adb root was disconnecting the device and restarting it.
                // adb root is now called when you connect to a device. Although, it can cause the device to
                // not be found... another bug...
                Logger.LogDebug(typeof(Program), "Getting connected devices");
                var devices = CommandRunner.Instance.GetDevices().ToList();
                Program.SplashManager.SplashDialog.IncrementLoadStep(1);

                new Thread(() => {
                    // process the devices and send them off to the cloud
                    Logger.LogDebug(typeof(Program), "Registering anonymous statistics for device types");
                    CloudStatistics.Instance.RegisterModels(devices);
                }).Start();
                // we will increment even though the process is on a new thread.
                Program.SplashManager.SplashDialog.IncrementLoadStep(1);

                // pass in the initial path?
                // TODO: Not yet implemented.
                //var initialPath = "/";
                //if ( args.Contains ( "p", "path" ) && !string.IsNullOrWhiteSpace ( args["p", "path"] ) ) {
                //	initialPath = args["p", "path"];
                //}


                // are we attaching to a specific device?
                if (args.Contains("d", "device"))
                {
                    CommandRunner.Instance.DefaultDevice = args["d", "device"];
                    Logger.LogDebug(typeof(Program), DroidExplorer.Resources.Strings.SplashConnectingDevice, CommandRunner.Instance.DefaultDevice);
                    Application.Run(new MainForm(  ));
                }
                else
                {
                    // get the attached devices
                    String selectedDevice = null;
                    if (devices.Count() != 1)
                    {
                        // we have 0 or > 1 so we need to display the "selection dialog"
                        var dsf = new GenericDeviceSelectionForm();
                        Program.SplashManager.SplashDialog.HideExt();
                        if (dsf.ShowDialog(null) == DialogResult.OK)
                        {
                            CommandRunner.Instance.DefaultDevice = dsf.SelectedDevice;
                            Logger.LogDebug(typeof(Program), DroidExplorer.Resources.Strings.SplashConnectingDevice, CommandRunner.Instance.DefaultDevice);
                            selectedDevice = dsf.SelectedDevice;
                        }
                        else
                        {
                            Program.SplashManager.CloseSplashDialog();
                            return;
                        }
                        Program.SplashManager.SplashDialog.AsyncShow();
                    }
                    else
                    {
                        selectedDevice = devices[0].SerialNumber;
                        CommandRunner.Instance.DefaultDevice = selectedDevice;
                    }

                    // try to run adb as root:
                    try {
                        Program.SplashManager.SplashDialog.SetStepText(DroidExplorer.Resources.Strings.SplashRunAdbAsRoot);
                        Logger.LogDebug(typeof(Program), DroidExplorer.Resources.Strings.SplashRunAdbAsRoot);
                        CommandRunner.Instance.StartAdbAsRoot(selectedDevice);
                        // sleep a half second to let it start up.
                        Thread.Sleep(500);
                    } catch (AdbRootException are) {
                        Logger.LogDebug(typeof(Program), "Unable to launch ADB as root");

                        // if we are unable to run as adb root
                        if (Settings.Instance.WarnWhenNoAdbRoot)
                        {
                            SplashManager.SplashDialog.Invoke((Action)(() => {
                                SplashManager.SplashDialog.Visible = false;
                            }));
                            //NoAdbRootCommands	Continue|Show more information|Exit

                            var result = TaskDialog.ShowCommandBox(
                                DroidExplorer.Resources.Strings.NoAdbRootTitle,
                                are.Message,
                                DroidExplorer.Resources.Strings.NoAdbRootMessage,
                                string.Empty,
                                string.Empty,
                                DroidExplorer.Resources.Strings.NoAdbRootCheckboxText,
                                DroidExplorer.Resources.Strings.NoAdbRootCommands,
                                false, SysIcons.Warning, SysIcons.Warning);
                            switch (TaskDialog.CommandButtonResult)
                            {
                            case 0:                                     // Continue
                                                                        // continue
                                if (TaskDialog.VerificationChecked)
                                {
                                    // do not warn again.
                                    Settings.Instance.WarnWhenNoAdbRoot = false;
                                }
                                break;

                            case 1:                                     // continue and get more info : http://android.stackexchange.com/a/96066/1951
                                                                        // android enthusiasts
                                CommandRunner.Instance.LaunchProcessWindow(DroidExplorer.Resources.Strings.AdbRootQAUrl, string.Empty, true);
                                if (TaskDialog.VerificationChecked)
                                {
                                    // do not warn again.
                                    Settings.Instance.WarnWhenNoAdbRoot = false;
                                }
                                break;

                            case 2:                                     // link to adbd insecure by chainfire on google play
                                CommandRunner.Instance.LaunchProcessWindow(DroidExplorer.Resources.Strings.AdbdInsecureAppUrl, string.Empty, true);
                                Application.Exit();
                                return;

                            default:                                     // 3
                                Application.Exit();
                                return;
                            }
                            SplashManager.SplashDialog.Invoke((Action)(() => {
                                SplashManager.SplashDialog.Visible = true;
                            }));
                        }
                    }
                    // increment for adb root
                    Program.SplashManager.SplashDialog.IncrementLoadStep(1);

                    // minor hackory for getting the device for cloud stats
                    var d = new Core.Adb.Device(selectedDevice, Core.Adb.DeviceState.Online);
                    // get the device properties for registration
                    foreach (var i in CommandRunner.Instance.GetProperties(selectedDevice))
                    {
                        d.Properties.Add(i.Key, i.Value);
                    }
                    if (!Settings.Instance.SystemSettings.RecordDeviceInformationToCloud)
                    {
                        Program.SplashManager.SplashDialog.SetStepText(
                            String.Format(DroidExplorer.Resources.Strings.SplashRegisterDevice,
                                          KnownDeviceManager.Instance.GetDeviceFriendlyName(selectedDevice)
                                          )
                            );
                        // register the device
                        CloudStatistics.Instance.RegisterDevice(d, devices.Single(x => x.SerialNumber == d.SerialNumber));
                        Program.SplashManager.SplashDialog.IncrementLoadStep(1);
                    }
                    else
                    {
                        // we have to increment but nothing else here
                        Program.SplashManager.SplashDialog.IncrementLoadStep(1);
                    }

                    Logger.LogDebug(typeof(Program), "Launching Main UI");
                    // connect to device
                    Program.SplashManager.SplashDialog.SetStepText(string.Format(DroidExplorer.Resources.Strings.SplashConnectingDevice, KnownDeviceManager.Instance.GetDeviceFriendlyName(CommandRunner.Instance.DefaultDevice)));

                    Application.Run(new MainForm( ));
                }
            } catch (Exception ex) {
                var result = TaskDialog.ShowCommandBox(DroidExplorer.Resources.Strings.ErrorUncaughtTitle, ex.Message,
                                                       DroidExplorer.Resources.Strings.ErrorUncaughtMessage, ex.ToString(),
                                                       string.Empty, string.Empty, DroidExplorer.Resources.Strings.ErrorUncaughtCommands,
                                                       false, SysIcons.Error, SysIcons.Error);
                switch (TaskDialog.CommandButtonResult)
                {
                case 1:
                    // continue
                    break;

                case 2:
                    // android enthusiasts
                    CommandRunner.Instance.LaunchProcessWindow(DroidExplorer.Resources.Strings.SupportUrl, string.Empty, true);
                    break;

                case 3:
                    // report bug
                    CommandRunner.Instance.LaunchProcessWindow(DroidExplorer.Resources.Strings.IssueTrackerCreateUrl, string.Empty, true);
                    break;

                default:                         // 0
                    Application.Restart();
                    break;
                }
            }
        }