diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/ActivityLaunchAction.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/ActivityLaunchAction.java | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/ActivityLaunchAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/ActivityLaunchAction.java new file mode 100644 index 000000000..311b19aa7 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/ActivityLaunchAction.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.eclipse.org/org/documents/epl-v10.php + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.adt.internal.launch; + +import com.android.ddmlib.AdbCommandRejectedException; +import com.android.ddmlib.IDevice; +import com.android.ddmlib.ShellCommandUnresponsiveException; +import com.android.ddmlib.TimeoutException; +import com.android.ide.eclipse.adt.AdtPlugin; + +import java.io.IOException; +import java.util.Collection; + +/** + * Launches the given activity + */ +public class ActivityLaunchAction implements IAndroidLaunchAction { + + private final String mActivity; + private final ILaunchController mLaunchController; + + /** + * Creates a ActivityLaunchAction + * + * @param activity fully qualified activity name to launch + * @param controller the {@link ILaunchController} that performs launch + */ + public ActivityLaunchAction(String activity, ILaunchController controller) { + mActivity = activity; + mLaunchController = controller; + } + + public boolean doLaunchAction(DelayedLaunchInfo info, IDevice device) { + String command = "am start" //$NON-NLS-1$ + + (info.isDebugMode() ? " -D" //$NON-NLS-1$ + : "") //$NON-NLS-1$ + + " -n " //$NON-NLS-1$ + + info.getPackageName() + "/" //$NON-NLS-1$ + + mActivity.replaceAll("\\$", "\\\\\\$") //$NON-NLS-1$ //$NON-NLS-2$ + + " -a android.intent.action.MAIN" //$NON-NLS-1$ + + " -c android.intent.category.LAUNCHER"; + try { + String msg = String.format("Starting activity %1$s on device %2$s", mActivity, + device); + AdtPlugin.printToConsole(info.getProject(), msg); + + // In debug mode, we need to add the info to the list of application monitoring + // client changes. + // increment launch attempt count, to handle retries and timeouts + info.incrementAttemptCount(); + + // now we actually launch the app. + device.executeShellCommand(command, new AMReceiver(info, device, mLaunchController)); + + // if the app is not a debug app, we need to do some clean up, as + // the process is done! + if (info.isDebugMode() == false) { + // stop the launch object, since there's no debug, and it can't + // provide any control over the app + return false; + } + } catch (TimeoutException e) { + AdtPlugin.printErrorToConsole(info.getProject(), "Launch error: timeout"); + return false; + } catch (AdbCommandRejectedException e) { + AdtPlugin.printErrorToConsole(info.getProject(), String.format( + "Launch error: adb rejected command: %1$s", e.getMessage())); + return false; + } catch (ShellCommandUnresponsiveException e) { + // we didn't get the output but that's ok, just log it + AdtPlugin.log(e, "No command output when running: '%1$s' on device %2$s", command, + device); + } catch (IOException e) { + // something went wrong trying to launch the app. + // lets stop the Launch + AdtPlugin.printErrorToConsole(info.getProject(), + String.format("Launch error: %s", e.getMessage())); + return false; + } + return true; + } + + /** + * Launches the activity on targeted device + * + * @param info the {@link DelayedLaunchInfo} that contains launch details + * @param devices list of Android devices on which the activity will be launched + */ + @Override + public boolean doLaunchAction(DelayedLaunchInfo info, Collection<IDevice> devices) { + boolean result = true; + for (IDevice d : devices) { + // Note that this expression should not short circuit - even if an action fails + // on a device, it should still be performed on all other devices. + result = doLaunchAction(info, d) && result; + } + + return result; + } + + /** + * Returns a description of the activity being launched + * + * @see IAndroidLaunchAction#getLaunchDescription() + */ + @Override + public String getLaunchDescription() { + return String.format("%1$s activity launch", mActivity); + } +} |