summaryrefslogtreecommitdiffstats
path: root/packages/ExternalStorageProvider/src
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2013-09-21 13:57:33 -0700
committerJeff Sharkey <jsharkey@android.com>2013-09-21 14:07:16 -0700
commit5545f56f7561810187545a1817b6001dd1f9931b (patch)
tree94cfb5e5a543575adaedbf75ec243a9bbbf765d7 /packages/ExternalStorageProvider/src
parent562ce888af21fc18d1610545ff6373ee2ecbbb13 (diff)
downloadframeworks_base-5545f56f7561810187545a1817b6001dd1f9931b.zip
frameworks_base-5545f56f7561810187545a1817b6001dd1f9931b.tar.gz
frameworks_base-5545f56f7561810187545a1817b6001dd1f9931b.tar.bz2
Create unique files, root ordering, UI bugs.
When a file already exists on disk, try adding a counter suffix to make a unique name. Move services near top of roots list, just below recents. Remove "Documents" root. Increase number of recents allowed from single provider, and add more logging to diagnose wedged loaders. When launching GET_CONTENT apps, wait for successful result before relaying result; canceled requests now return to DocumentsUI. Add CloseGuard to ContentProviderClients, since leaked instances can keep the remote process alive. Fix UI bug around trailing breadcrumbs. Fix bug that dropped Recents from roots list. Add up action to Settings activity. Give our activity a default icon while waiting for async roots to load. Bug: 10818683, 10819461, 10819461, 10819196, 10860199 Change-Id: I7b9e26b1cf8353dd3175458b23da2b4bda6c5831
Diffstat (limited to 'packages/ExternalStorageProvider/src')
-rw-r--r--packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java67
1 files changed, 34 insertions, 33 deletions
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index 3e2cd15..d6f477d 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -96,25 +96,6 @@ public class ExternalStorageProvider extends DocumentsProvider {
throw new IllegalStateException(e);
}
- try {
- final String rootId = "documents";
- final File path = Environment.getExternalStoragePublicDirectory(
- Environment.DIRECTORY_DOCUMENTS);
- mIdToPath.put(rootId, path);
-
- final RootInfo root = new RootInfo();
- root.rootId = rootId;
- root.rootType = Root.ROOT_TYPE_SHORTCUT;
- root.flags = Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY
- | Root.FLAG_SUPPORTS_SEARCH;
- root.title = getContext().getString(R.string.root_documents);
- root.docId = getDocIdForFile(path);
- mRoots.add(root);
- mIdToRoot.put(rootId, root);
- } catch (FileNotFoundException e) {
- throw new IllegalStateException(e);
- }
-
return true;
}
@@ -230,14 +211,23 @@ public class ExternalStorageProvider extends DocumentsProvider {
public String createDocument(String docId, String mimeType, String displayName)
throws FileNotFoundException {
final File parent = getFileForDocId(docId);
- displayName = validateDisplayName(mimeType, displayName);
+ File file;
- final File file = new File(parent, displayName);
if (Document.MIME_TYPE_DIR.equals(mimeType)) {
+ file = new File(parent, displayName);
if (!file.mkdir()) {
throw new IllegalStateException("Failed to mkdir " + file);
}
} else {
+ displayName = removeExtension(mimeType, displayName);
+ file = new File(parent, addExtension(mimeType, displayName));
+
+ // If conflicting file, try adding counter suffix
+ int n = 0;
+ while (file.exists() && n++ < 32) {
+ file = new File(parent, addExtension(mimeType, displayName + " (" + n + ")"));
+ }
+
try {
if (!file.createNewFile()) {
throw new IllegalStateException("Failed to touch " + file);
@@ -354,20 +344,31 @@ public class ExternalStorageProvider extends DocumentsProvider {
return "application/octet-stream";
}
- private static String validateDisplayName(String mimeType, String displayName) {
- if (Document.MIME_TYPE_DIR.equals(mimeType)) {
- return displayName;
- } else {
- // Try appending meaningful extension if needed
- if (!mimeType.equals(getTypeForName(displayName))) {
- final String extension = MimeTypeMap.getSingleton()
- .getExtensionFromMimeType(mimeType);
- if (extension != null) {
- displayName += "." + extension;
- }
+ /**
+ * Remove file extension from name, but only if exact MIME type mapping
+ * exists. This means we can reapply the extension later.
+ */
+ private static String removeExtension(String mimeType, String name) {
+ final int lastDot = name.lastIndexOf('.');
+ if (lastDot >= 0) {
+ final String extension = name.substring(lastDot + 1);
+ final String nameMime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
+ if (mimeType.equals(nameMime)) {
+ return name.substring(0, lastDot);
}
+ }
+ return name;
+ }
- return displayName;
+ /**
+ * Add file extension to name, but only if exact MIME type mapping exists.
+ */
+ private static String addExtension(String mimeType, String name) {
+ final String extension = MimeTypeMap.getSingleton()
+ .getExtensionFromMimeType(mimeType);
+ if (extension != null) {
+ return name + "." + extension;
}
+ return name;
}
}