Merge "Run all downloads through trampoline." into nyc-dev

This commit is contained in:
Steve McKay
2016-03-12 00:43:44 +00:00
committed by Android (Google) Code Review
4 changed files with 59 additions and 4 deletions

View File

@@ -283,10 +283,16 @@ public class FilesActivity extends BaseActivity {
*/
private void openDocument(DocumentInfo doc, Model model) {
// Provide specialized handling of downloaded APKs This sends the APK
// details off to get extra security information added, and finally
// to be handled by the package manager.
if (MimePredicate.isApkType(doc.mimeType)) {
// Anything on downloads goes through the back through downloads manager
// (that's the MANAGE_DOCUMENT bit).
// This is done for two reasons:
// 1) The file in question might be a failed/queued or otherwise have some
// specialized download handling.
// 2) For APKs, the download manager will add on some important security stuff
// like origin URL.
// All other files not on downloads, event APKs, would get no benefit from this
// treatment, thusly the "isDownloads" check.
if (getCurrentRoot().isDownloads()) {
// First try managing the document; we expect manager to filter
// based on authority, so we don't grant.
final Intent manage = new Intent(DocumentsContract.ACTION_MANAGE_DOCUMENT);

View File

@@ -2,6 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.documentsui.tests">
<uses-permission android:name="android.permission.INTERNET" />
<application>
<uses-library android:name="android.test.runner" />
<provider

View File

@@ -19,10 +19,17 @@ package com.android.documentsui;
import static com.android.documentsui.StubProvider.ROOT_0_ID;
import static com.android.documentsui.StubProvider.ROOT_1_ID;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.content.Context;
import android.net.Uri;
import android.os.RemoteException;
import android.support.test.uiautomator.Configurator;
import android.support.test.uiautomator.UiObject;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.Suppress;
import android.view.KeyEvent;
import android.view.MotionEvent;
import com.android.documentsui.model.RootInfo;
@@ -173,4 +180,37 @@ public class FilesActivityUiTest extends ActivityTest<FilesActivity> {
bots.roots.assertHasFocus();
}
}
// We don't really need to test the entirety of download support
// since downloads is (almost) just another provider.
public void testDownload_Queued() throws Exception {
DownloadManager dm = (DownloadManager) context.getSystemService(
Context.DOWNLOAD_SERVICE);
// This downloads ends up being queued (because DNS can't be resolved).
// We'll still see an entry in the downloads UI with a "Queued" label.
dm.enqueue(new Request(Uri.parse("http://hammychamp.toodles")));
bots.roots.openRoot("Downloads");
bots.directory.assertDocumentsPresent("Queued");
}
public void testDownload_RetryUnsuccessful() throws Exception {
DownloadManager dm = (DownloadManager) context.getSystemService(
Context.DOWNLOAD_SERVICE);
// This downloads fails! But it'll still show up.
dm.enqueue(new Request(Uri.parse("http://www.google.com/hamfancy")));
bots.roots.openRoot("Downloads");
UiObject doc = bots.directory.findDocument("Unsuccessful");
doc.waitForExists(TIMEOUT);
int toolType = Configurator.getInstance().getToolType();
Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_FINGER);
doc.click();
Configurator.getInstance().setToolType(toolType);
assertTrue(bots.main.findDownloadRetryDialog().exists());
device.pressBack(); // to clear the dialog.
}
}

View File

@@ -173,6 +173,13 @@ public class UiBot extends BaseBot {
return findObject("android:id/content", "android:id/text1");
}
public UiObject findDownloadRetryDialog() {
UiSelector selector = new UiSelector().text("Couldn't download");
UiObject title = mDevice.findObject(selector);
title.waitForExists(mTimeout);
return title;
}
public UiObject findDialogOkButton() {
UiObject object = findObject("android:id/content", "android:id/button1");
object.waitForExists(mTimeout);