Don't use ShellCommandLauncher in AppIndexingResultPanel

We can directly call device.executeShellCommand

+ we wrongly used AndroidProcessHandler. We created an instance only for the sake of passing to ShellCommandLauncher

Fixes: n/a
Test: n/a
Change-Id: I948b5f8b0ffb4cec60785c483138bdb2fdd99f34
diff --git a/BUILD b/BUILD
index 28de5c3..b82bbcf 100644
--- a/BUILD
+++ b/BUILD
@@ -32,5 +32,6 @@
         "//tools/adt/idea/project-system:intellij.android.projectSystem[module]",
         "//tools/adt/idea/project-system-gradle:intellij.android.projectSystem.gradle[module]",
         "//tools/adt/idea/project-system-gradle-models:intellij.android.projectSystem.gradle.models[module]",
+        "//tools/adt/idea/execution/common:intellij.android.execution.common[module]",
     ],
 )
diff --git a/google-appindexing.iml b/google-appindexing.iml
index 2a6d1ea..46315c9 100644
--- a/google-appindexing.iml
+++ b/google-appindexing.iml
@@ -37,5 +37,6 @@
     <orderEntry type="module" module-name="intellij.android.projectSystem" />
     <orderEntry type="module" module-name="intellij.android.projectSystem.gradle" />
     <orderEntry type="module" module-name="intellij.android.projectSystem.gradle.models" />
+    <orderEntry type="module" module-name="intellij.android.execution.common" />
   </component>
 </module>
\ No newline at end of file
diff --git a/src/com/google/appindexing/ui/AppIndexingResultPanel.java b/src/com/google/appindexing/ui/AppIndexingResultPanel.java
index 9beffe8..cd5bedc 100644
--- a/src/com/google/appindexing/ui/AppIndexingResultPanel.java
+++ b/src/com/google/appindexing/ui/AppIndexingResultPanel.java
@@ -15,17 +15,17 @@
  */
 package com.google.appindexing.ui;
 
+import com.android.ddmlib.AdbCommandRejectedException;
 import com.android.ddmlib.AndroidDebugBridge;
 import com.android.ddmlib.IDevice;
+import com.android.ddmlib.ShellCommandUnresponsiveException;
+import com.android.ddmlib.TimeoutException;
 import com.android.tools.idea.adb.AdbService;
 import com.android.tools.idea.concurrency.FutureCallbackExecutor;
-import com.android.tools.idea.run.AndroidProcessHandler;
+import com.android.tools.idea.execution.common.adb.shell.ErrorMatchingReceiver;
 import com.android.tools.idea.run.DeviceCount;
 import com.android.tools.idea.run.DeviceSelectionUtils;
-import com.android.tools.idea.run.ProcessHandlerConsolePrinter;
 import com.android.tools.idea.run.TargetDeviceFilter;
-import com.android.tools.idea.run.tasks.ShellCommandLauncher;
-import com.android.tools.idea.run.util.ProcessHandlerLaunchStatus;
 import com.google.api.services.fetchasgoogle_pa.model.AppIndexingStats;
 import com.google.appindexing.fetchasgoogle.FetchAsGoogleTask;
 import com.google.appindexing.util.AppIndexingBundle;
@@ -33,12 +33,14 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.intellij.icons.AllIcons;
+import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.ui.HyperlinkLabel;
 import com.intellij.ui.components.JBLabel;
 import com.intellij.util.concurrency.EdtExecutorService;
 import java.awt.BorderLayout;
 import java.io.File;
+import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.Executors;
@@ -64,7 +66,7 @@
   private JBLabel myPackageLabel;
   private JBLabel myUrlTitle;
   private JPanel myDetailPanel;
-  private FetchAsGoogleTask myTask;
+  private final FetchAsGoogleTask myTask;
 
   private AppIndexingResultPanel(@NotNull FetchAsGoogleTask task, @NotNull String deepLink) {
     super(new BorderLayout());
@@ -76,11 +78,6 @@
     fillPanelContent();
   }
 
-  @NotNull
-  public static AppIndexingResultPanel buildPanelFromFetchTask(@NotNull FetchAsGoogleTask task, @NotNull String deepLink) {
-    return new AppIndexingResultPanel(task, deepLink);
-  }
-
   private void initializeTitle(@NotNull FetchAsGoogleTask task, @NotNull String deepLink) {
     myPackageLabel.setText(task.getPackageId());
     myDateLabel.setText(task.getCreatedTime().toString());
@@ -247,25 +244,23 @@
     }
     IDevice device = collection.iterator().next();
 
-    AndroidProcessHandler androidProcessHandler = new AndroidProcessHandler(facet.getModule().getProject(), myTask.getPackageId());
-    androidProcessHandler.addTargetDevice(device);
     FutureCallbackExecutor f = FutureCallbackExecutor.wrap(Executors.newSingleThreadExecutor());
-    ListenableFuture<Boolean> launchResult =
-      f.executeAsync(() -> ShellCommandLauncher.execute("am start -a \"com.google.android.gms.icing.APP_INDEXING_DEBUG\"", device,
-                                                        new ProcessHandlerLaunchStatus(androidProcessHandler),
-                                                        new ProcessHandlerConsolePrinter(androidProcessHandler), 10,
-                                                        TimeUnit.SECONDS));
-    Futures.addCallback(launchResult, new FutureCallback<Boolean>() {
-      @Override
-      public void onSuccess(Boolean result) {
-        setOpenDeveloperToolResult(result, collapsablePanel);
-      }
 
-      @Override
-      public void onFailure(@NotNull Throwable t) {
-        setOpenDeveloperToolResult(false, collapsablePanel);
+
+    ApplicationManager.getApplication().executeOnPooledThread(() -> {
+      ErrorMatchingReceiver receiver = new ErrorMatchingReceiver();
+      try {
+        device.executeShellCommand("am start -a \"com.google.android.gms.icing.APP_INDEXING_DEBUG\"",
+                                   receiver,
+                                   10,
+                                   TimeUnit.SECONDS);
       }
-    }, EdtExecutorService.getInstance());
+      catch (TimeoutException | AdbCommandRejectedException | ShellCommandUnresponsiveException | IOException e) {
+        setOpenDeveloperToolResult(false, collapsablePanel);
+        return;
+      }
+      setOpenDeveloperToolResult(!receiver.hasError(), collapsablePanel);
+    });
   }
 
   private void setOpenDeveloperToolResult(@Nullable Boolean succeeded, @NotNull CollapsablePanel collapsablePanel) {
@@ -276,4 +271,9 @@
     collapsablePanel.setActionErrorMessage(
       (succeeded != null && succeeded) ? "" : AppIndexingBundle.message("app.indexing.open.developer.tool.fail.message"));
   }
+
+  @NotNull
+  public static AppIndexingResultPanel buildPanelFromFetchTask(@NotNull FetchAsGoogleTask task, @NotNull String deepLink) {
+    return new AppIndexingResultPanel(task, deepLink);
+  }
 }