From 3c12a7c6d727fd5cd7cccbf999bdb380a95cde79 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Thu, 1 Oct 2015 15:14:57 -0700 Subject: Hold wake-lock during copy operations. If the CPU goes to sleep during the copy, certain devices will collapse the USB OTG power domain, which can cause user data loss. Bug: 24574575 Change-Id: I8e26caac8784490d2dee324b38e6085cd55eb8bb --- packages/DocumentsUI/AndroidManifest.xml | 1 + .../DocumentsUI/src/com/android/documentsui/CopyService.java | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'packages/DocumentsUI') diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml index 382b2d0..ff14f94 100644 --- a/packages/DocumentsUI/AndroidManifest.xml +++ b/packages/DocumentsUI/AndroidManifest.xml @@ -3,6 +3,7 @@ + srcs = intent.getParcelableArrayListExtra(EXTRA_SRC_LIST); final DocumentStack stack = intent.getParcelableExtra(EXTRA_STACK); try { + wakeLock.acquire(); + // Acquire content providers. mSrcClient = DocumentsApplication.acquireUnstableProviderOrThrow(getContentResolver(), srcs.get(0).authority); @@ -151,6 +158,8 @@ public class CopyService extends IntentService { ContentProviderClient.releaseQuietly(mSrcClient); ContentProviderClient.releaseQuietly(mDstClient); + wakeLock.release(); + // Dismiss the ongoing copy notification when the copy is done. mNotificationManager.cancel(mJobId, 0); @@ -179,7 +188,8 @@ public class CopyService extends IntentService { @Override public void onCreate() { super.onCreate(); - mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + mPowerManager = getSystemService(PowerManager.class); + mNotificationManager = getSystemService(NotificationManager.class); } /** -- cgit v1.1 From a11234794acbc94e4808b7dd57f8337b1aa51f1f Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 19 Oct 2015 17:46:04 -0700 Subject: Add locking when mutating RecentTasks. Otherwise there is a really rare race condition where we try tearing down the tasks while we're still setting them up. Bug: 25078914 Change-Id: Icf89241f9abec3fadc8606cfb4fbc029bbe91515 --- .../src/com/android/documentsui/RecentLoader.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'packages/DocumentsUI') diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java index f5908c5..407838a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java @@ -36,6 +36,7 @@ import android.util.Log; import com.android.documentsui.BaseActivity.State; import com.android.documentsui.model.RootInfo; +import com.android.internal.annotations.GuardedBy; import com.google.android.collect.Maps; import com.google.common.collect.Lists; import com.google.common.util.concurrent.AbstractFuture; @@ -81,6 +82,7 @@ public class RecentLoader extends AsyncTaskLoader { private final RootsCache mRoots; private final State mState; + @GuardedBy("mTasks") private final HashMap mTasks = Maps.newHashMap(); private final int mSortOrder = State.SORT_ORDER_LAST_MODIFIED; @@ -167,6 +169,12 @@ public class RecentLoader extends AsyncTaskLoader { @Override public DirectoryResult loadInBackground() { + synchronized (mTasks) { + return loadInBackgroundLocked(); + } + } + + private DirectoryResult loadInBackgroundLocked() { if (mFirstPassLatch == null) { // First time through we kick off all the recent tasks, and wait // around to see if everyone finishes quickly. @@ -304,8 +312,10 @@ public class RecentLoader extends AsyncTaskLoader { // Ensure the loader is stopped onStopLoading(); - for (RecentTask task : mTasks.values()) { - IoUtils.closeQuietly(task); + synchronized (mTasks) { + for (RecentTask task : mTasks.values()) { + IoUtils.closeQuietly(task); + } } IoUtils.closeQuietly(mResult); -- cgit v1.1 From 49eddaad7cb5a6e83943064d27d5cf9f86f0fcf1 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 6 Nov 2015 09:16:22 -0800 Subject: Block directory selection in openable modes. When picking documents to return to apps requesting CATEGORY_OPENABLE we can't let the user select directories. Bug: 25455200 Change-Id: I8076883ee5b019eab4d2adb841952865f21e413e --- .../src/com/android/documentsui/DirectoryFragment.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'packages/DocumentsUI') diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java index 006f6e9..0d326ec 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java @@ -19,7 +19,10 @@ package com.android.documentsui; import static com.android.documentsui.BaseActivity.State.ACTION_BROWSE; import static com.android.documentsui.BaseActivity.State.ACTION_BROWSE_ALL; import static com.android.documentsui.BaseActivity.State.ACTION_CREATE; +import static com.android.documentsui.BaseActivity.State.ACTION_GET_CONTENT; import static com.android.documentsui.BaseActivity.State.ACTION_MANAGE; +import static com.android.documentsui.BaseActivity.State.ACTION_OPEN; +import static com.android.documentsui.BaseActivity.State.ACTION_OPEN_TREE; import static com.android.documentsui.BaseActivity.State.MODE_GRID; import static com.android.documentsui.BaseActivity.State.MODE_LIST; import static com.android.documentsui.BaseActivity.State.MODE_UNKNOWN; @@ -578,11 +581,23 @@ public class DirectoryFragment extends Fragment { // Directories and footer items cannot be checked boolean valid = false; + final State state = getDisplayState(DirectoryFragment.this); final Cursor cursor = mAdapter.getItem(position); if (cursor != null) { final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); - valid = isDocumentEnabled(docMimeType, docFlags); + switch (state.action) { + case ACTION_OPEN: + case ACTION_CREATE: + case ACTION_GET_CONTENT: + case ACTION_OPEN_TREE: + valid = isDocumentEnabled(docMimeType, docFlags) + && !Document.MIME_TYPE_DIR.equals(docMimeType); + break; + default: + valid = isDocumentEnabled(docMimeType, docFlags); + break; + } } if (!valid) { -- cgit v1.1