diff options
3 files changed, 66 insertions, 9 deletions
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 6bc4df71fc5c..5a69b0ceaaae 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -17,6 +17,7 @@ package com.android.shell; import static android.os.Process.THREAD_PRIORITY_BACKGROUND; + import static com.android.shell.BugreportPrefs.STATE_HIDE; import static com.android.shell.BugreportPrefs.STATE_UNKNOWN; import static com.android.shell.BugreportPrefs.getWarningState; @@ -44,6 +45,7 @@ import libcore.io.Streams; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; + import com.google.android.collect.Lists; import android.accounts.Account; @@ -78,6 +80,7 @@ import android.text.format.DateUtils; import android.util.Log; import android.util.Patterns; import android.util.SparseArray; +import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; import android.view.View.OnFocusChangeListener; @@ -543,6 +546,7 @@ public class BugreportProgressService extends Service { deleteScreenshots(info); } stopProgress(id); + mInfoDialog.cancel(); } /** @@ -1404,7 +1408,7 @@ public class BugreportProgressService extends Service { /** * Sets its internal state and displays the dialog. */ - private void initialize(final Context context, BugreportInfo info) { + void initialize(final Context context, BugreportInfo info) { final String dialogTitle = context.getString(R.string.bugreport_info_dialog_title, info.id); // First initializes singleton. @@ -1450,6 +1454,7 @@ public class BugreportProgressService extends Service { } }) .create(); + mDialog.setCancelable(true); mDialog.getWindow().setAttributes( new WindowManager.LayoutParams( @@ -1545,13 +1550,18 @@ public class BugreportProgressService extends Service { * <p>Once the bugreport is finished dumpstate has already generated the final files, so * changing the name would have no effect. */ - private void onBugreportFinished(int id) { + void onBugreportFinished(int id) { if (mInfoName != null) { mInfoName.setEnabled(false); mInfoName.setText(mSavedName); } } + void cancel() { + if (mDialog != null) { + mDialog.cancel(); + } + } } /** diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java index 44e956abeb02..ad66dfc992d0 100644 --- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java +++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java @@ -153,7 +153,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { Log.i(TAG, "#### setup() on " + getName()); Instrumentation instrumentation = getInstrumentation(); mContext = instrumentation.getTargetContext(); - mUiBot = new UiBot(UiDevice.getInstance(instrumentation), TIMEOUT); + mUiBot = new UiBot(instrumentation, TIMEOUT); mListener = ActionSendMultipleConsumerActivity.getListener(mContext); cancelExistingNotifications(); @@ -233,10 +233,7 @@ public class BugreportReceiverTest extends InstrumentationTestCase { assertProgressNotification(NAME, 00.00f); - openProgressNotification(ID); - UiObject cancelButton = mUiBot.getVisibleObject(mContext.getString( - com.android.internal.R.string.cancel).toUpperCase()); - mUiBot.click(cancelButton, "cancel_button"); + cancelFromNotification(); waitForService(false); } @@ -323,6 +320,21 @@ public class BugreportReceiverTest extends InstrumentationTestCase { assertServiceNotRunning(); } + public void testProgress_cancelBugClosesDetailsDialog() throws Exception { + resetProperties(); + sendBugreportStarted(1000); + waitForScreenshotButtonEnabled(true); + + DetailsUi detailsUi = new DetailsUi(mUiBot, ID); + detailsUi.assertName(NAME); // Sanity check + + cancelFromNotification(); + mUiBot.closeNotifications(); + + assertDetailsUiClosed(); + assertServiceNotRunning(); + } + public void testProgress_changeDetailsPlainBugreport() throws Exception { changeDetailsTest(true); } @@ -579,6 +591,13 @@ public class BugreportReceiverTest extends InstrumentationTestCase { } } + private void cancelFromNotification() { + openProgressNotification(ID); + UiObject cancelButton = mUiBot.getVisibleObject(mContext.getString( + com.android.internal.R.string.cancel).toUpperCase()); + mUiBot.click(cancelButton, "cancel_button"); + } + private void assertProgressNotification(String name, float percent) { // TODO: it currently looks for 3 distinct objects, without taking advantage of their // relationship. @@ -929,6 +948,11 @@ public class BugreportReceiverTest extends InstrumentationTestCase { screenshotButton.isEnabled()); } + private void assertDetailsUiClosed() { + // TODO: unhardcode resource ids + mUiBot.assertNotVisibleById("android:id/alertTitle"); + } + /** * Helper class containing the UiObjects present in the bugreport info dialog. */ diff --git a/packages/Shell/tests/src/com/android/shell/UiBot.java b/packages/Shell/tests/src/com/android/shell/UiBot.java index 30f16928ba52..ef24791aac72 100644 --- a/packages/Shell/tests/src/com/android/shell/UiBot.java +++ b/packages/Shell/tests/src/com/android/shell/UiBot.java @@ -16,6 +16,8 @@ package com.android.shell; +import android.app.Instrumentation; +import android.app.StatusBarManager; import android.support.test.uiautomator.By; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject; @@ -24,6 +26,8 @@ import android.support.test.uiautomator.UiScrollable; import android.support.test.uiautomator.UiSelector; import android.support.test.uiautomator.Until; import android.util.Log; + +import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; /** @@ -34,11 +38,13 @@ final class UiBot { private static final String TAG = "UiBot"; private static final String SYSTEMUI_PACKAGE = "com.android.systemui"; + private final Instrumentation mInstrumentation; private final UiDevice mDevice; private final int mTimeout; - public UiBot(UiDevice device, int timeout) { - mDevice = device; + public UiBot(Instrumentation instrumentation, int timeout) { + mInstrumentation = instrumentation; + mDevice = UiDevice.getInstance(instrumentation); mTimeout = timeout; } @@ -57,6 +63,13 @@ final class UiBot { return getObject(text); } + public void closeNotifications() throws Exception { + // TODO: mDevice should provide such method.. + StatusBarManager sbm = + (StatusBarManager) mInstrumentation.getContext().getSystemService("statusbar"); + sbm.collapsePanels(); + } + /** * Opens the system notification and clicks a given notification. * @@ -111,6 +124,16 @@ final class UiBot { return uiObject; } + /** + * Asserts an object is not visible. + */ + public void assertNotVisibleById(String id) { + // TODO: not working when the bugreport dialog is shown, it hangs until the dialog is + // dismissed and hence always work. + boolean hasIt = mDevice.hasObject(By.res(id)); + assertFalse("should not have found object with id '" + id+ "'", hasIt); + } + /** * Clicks on a UI element. |