Loading res/values/strings.xml +4 −0 Original line number Diff line number Diff line Loading @@ -453,6 +453,10 @@ <string name="waiting_dialog_compressing_msg"><![CDATA[<b>File</b>]]> <xliff:g id="file">%1$s</xliff:g></string> <!-- Waiting dialog - Initializing the dialog --> <string name="waiting_dialog_analizing_msg"><![CDATA[<b>Analyzing\u2026</b>]]></string> <!-- Waiting dialog - Opening Storage Provider file title --> <string name="waiting_dialog_opening_storage_provider_title">Opening\u2026</string> <!-- Waiting dialog - Opening Storage Provider file message --> <string name="waiting_dialog_opening_storage_provider_message"><![CDATA[<b>Opening</b>]]> <xliff:g id="file">%1$s</xliff:g><![CDATA[<br/>]]> <![CDATA[<b>From</b>]]> <xliff:g id="name">%2$s</xliff:g></string> <!-- Extracting - Success message --> <string name="msgs_extracting_success">The extracting operation was completed successfully. The data was extracted to <xliff:g id="destination">%1$s</xliff:g>.</string> <!-- Compressing - Success message --> Loading src/com/cyanogenmod/filemanager/commands/storageapi/ListCommand.java +22 −24 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package com.cyanogenmod.filemanager.commands.storageapi; import android.text.TextUtils; import android.util.Log; import com.cyanogen.ambient.common.api.PendingResult; import com.cyanogen.ambient.common.api.ResultCallback; import com.cyanogen.ambient.storage.StorageApi; import com.cyanogen.ambient.storage.StorageApi.Document; Loading Loading @@ -104,9 +103,8 @@ public class ListCommand extends Program implements ListExecutable { return; } PendingResult<DocumentResult> pendingResult = storageApi.getMetadata(storageProviderInfo, mSrc, true); pendingResult.setResultCallback(new ResultCallback<DocumentResult>() { storageApi.getMetadata(storageProviderInfo, mSrc, true, new ResultCallback<DocumentResult>() { @Override public void onResult(DocumentResult documentResult) { if (documentResult == null) { Loading src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +117 −0 Original line number Diff line number Diff line Loading @@ -16,8 +16,10 @@ package com.cyanogenmod.filemanager.ui.policy; import android.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnDismissListener; import android.content.Intent; Loading @@ -26,12 +28,20 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.text.Html; import android.text.Spanned; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; import com.cyanogen.ambient.common.api.PendingResult; import com.cyanogen.ambient.common.api.ResultCallback; import com.cyanogen.ambient.storage.StorageApi; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.activities.ShortcutActivity; import com.cyanogenmod.filemanager.console.secure.SecureConsole; import com.cyanogenmod.filemanager.console.storageapi.StorageApiConsole; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.model.RegularFile; import com.cyanogenmod.filemanager.providers.SecureResourceProvider; Loading @@ -47,8 +57,11 @@ import com.cyanogenmod.filemanager.util.MediaHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; import com.cyanogenmod.filemanager.util.ResourcesHelper; import com.cyanogenmod.filemanager.util.StorageProviderUtils; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; Loading Loading @@ -162,6 +175,11 @@ public final class IntentsActionPolicy extends ActionsPolicy { })) .show(); return; } else if (!TextUtils.isEmpty(fso.getProviderPrefix())) { // Special handling for Storage Provider files copyAndOpenStorageProviderFile(ctx, fso, onCancelListener, onDismissListener, choose); return; } // Obtain the mime/type and passed it to intent Loading @@ -188,6 +206,105 @@ public final class IntentsActionPolicy extends ActionsPolicy { } } private static void copyAndOpenStorageProviderFile(final Context ctx, final FileSystemObject fso, final OnCancelListener onCancelListener, final OnDismissListener onDismissListener, final boolean choose) { String prefix = fso.getProviderPrefix(); if (TextUtils.isEmpty(prefix)) { return; } final String path = StorageApiConsole.getProviderPathFromFullPath(fso.getFullPath()); final String name = fso.getName(); final StorageApiConsole console = StorageApiConsole.getStorageApiConsoleForPath(prefix); BackgroundCallable callable = new BackgroundCallable() { private File file; private StorageApi.DocumentInfo documentInfo; @Override public int getDialogIcon() { return 0; } @Override public int getDialogTitle() { return R.string.waiting_dialog_opening_storage_provider_title; } @Override public boolean isDialogCancellable() { return false; } @Override public Spanned requestProgress() { String progress = ctx.getResources().getString( R.string.waiting_dialog_opening_storage_provider_message, fso.getName(), console.getName()); return Html.fromHtml(progress); } @Override public void doInBackground(Object... params) throws Throwable { OutputStream outputStream = null; try { File downloadDir = new File(ctx.getExternalCacheDir(), StorageProviderUtils.CACHE_DIR); if (downloadDir.exists() || downloadDir.mkdirs()) { file = new File(downloadDir.getPath() + File.separator + name); if (file.exists() || file.createNewFile()) { outputStream = new FileOutputStream(file); } } else { Log.e(TAG, "Cannot create cache directory"); //$NON-NLS-1$ } } catch (Exception e) { Log.e(TAG, "Cannot create temp file", e); //$NON-NLS-1$ } PendingResult<StorageApi.DocumentInfo.DocumentInfoResult> pendingResult = console.getStorageApi().getFile(console.getStorageProviderInfo(),path, outputStream, null); // Since we're downloading a file, this can take a while, so don't specify a timeout StorageApi.DocumentInfo.DocumentInfoResult result = pendingResult.await(); if (result == null || !result.getStatus().isSuccess()) { Log.e(TAG, "Cannot download file"); //$NON-NLS-1$ return; } documentInfo = result.getDocumentInfo(); } @Override public void onSuccess() { Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), documentInfo.getMimeType()); FileSystemObject cacheFso = FileHelper.createFileSystemObject(file); resolveIntent( ctx, intent, choose, createInternalIntents(ctx, cacheFso), 0, R.string.associations_dialog_openwith_title, R.string.associations_dialog_openwith_action, true, onCancelListener, onDismissListener); } @Override public void onCancel() { Toast.makeText(ctx, R.string.cancelled_message, Toast .LENGTH_SHORT).show(); } }; BackgroundAsyncTask task = new BackgroundAsyncTask(ctx, callable); task.execute(task); } /** * Method that sends a {@link FileSystemObject} with the default registered application * by the system, or ask the user for select a registered application. Loading src/com/cyanogenmod/filemanager/util/StorageProviderUtils.java +2 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.graphics.drawable.Drawable; */ public final class StorageProviderUtils { public static final String CACHE_DIR = ".storage-provider-files"; private static final String TAG = StorageProviderUtils.class.getSimpleName(); /** Loading Loading
res/values/strings.xml +4 −0 Original line number Diff line number Diff line Loading @@ -453,6 +453,10 @@ <string name="waiting_dialog_compressing_msg"><![CDATA[<b>File</b>]]> <xliff:g id="file">%1$s</xliff:g></string> <!-- Waiting dialog - Initializing the dialog --> <string name="waiting_dialog_analizing_msg"><![CDATA[<b>Analyzing\u2026</b>]]></string> <!-- Waiting dialog - Opening Storage Provider file title --> <string name="waiting_dialog_opening_storage_provider_title">Opening\u2026</string> <!-- Waiting dialog - Opening Storage Provider file message --> <string name="waiting_dialog_opening_storage_provider_message"><![CDATA[<b>Opening</b>]]> <xliff:g id="file">%1$s</xliff:g><![CDATA[<br/>]]> <![CDATA[<b>From</b>]]> <xliff:g id="name">%2$s</xliff:g></string> <!-- Extracting - Success message --> <string name="msgs_extracting_success">The extracting operation was completed successfully. The data was extracted to <xliff:g id="destination">%1$s</xliff:g>.</string> <!-- Compressing - Success message --> Loading
src/com/cyanogenmod/filemanager/commands/storageapi/ListCommand.java +22 −24 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package com.cyanogenmod.filemanager.commands.storageapi; import android.text.TextUtils; import android.util.Log; import com.cyanogen.ambient.common.api.PendingResult; import com.cyanogen.ambient.common.api.ResultCallback; import com.cyanogen.ambient.storage.StorageApi; import com.cyanogen.ambient.storage.StorageApi.Document; Loading Loading @@ -104,9 +103,8 @@ public class ListCommand extends Program implements ListExecutable { return; } PendingResult<DocumentResult> pendingResult = storageApi.getMetadata(storageProviderInfo, mSrc, true); pendingResult.setResultCallback(new ResultCallback<DocumentResult>() { storageApi.getMetadata(storageProviderInfo, mSrc, true, new ResultCallback<DocumentResult>() { @Override public void onResult(DocumentResult documentResult) { if (documentResult == null) { Loading
src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java +117 −0 Original line number Diff line number Diff line Loading @@ -16,8 +16,10 @@ package com.cyanogenmod.filemanager.ui.policy; import android.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnDismissListener; import android.content.Intent; Loading @@ -26,12 +28,20 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.text.Html; import android.text.Spanned; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; import com.cyanogen.ambient.common.api.PendingResult; import com.cyanogen.ambient.common.api.ResultCallback; import com.cyanogen.ambient.storage.StorageApi; import com.cyanogenmod.filemanager.R; import com.cyanogenmod.filemanager.activities.ShortcutActivity; import com.cyanogenmod.filemanager.console.secure.SecureConsole; import com.cyanogenmod.filemanager.console.storageapi.StorageApiConsole; import com.cyanogenmod.filemanager.model.FileSystemObject; import com.cyanogenmod.filemanager.model.RegularFile; import com.cyanogenmod.filemanager.providers.SecureResourceProvider; Loading @@ -47,8 +57,11 @@ import com.cyanogenmod.filemanager.util.MediaHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper; import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory; import com.cyanogenmod.filemanager.util.ResourcesHelper; import com.cyanogenmod.filemanager.util.StorageProviderUtils; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; Loading Loading @@ -162,6 +175,11 @@ public final class IntentsActionPolicy extends ActionsPolicy { })) .show(); return; } else if (!TextUtils.isEmpty(fso.getProviderPrefix())) { // Special handling for Storage Provider files copyAndOpenStorageProviderFile(ctx, fso, onCancelListener, onDismissListener, choose); return; } // Obtain the mime/type and passed it to intent Loading @@ -188,6 +206,105 @@ public final class IntentsActionPolicy extends ActionsPolicy { } } private static void copyAndOpenStorageProviderFile(final Context ctx, final FileSystemObject fso, final OnCancelListener onCancelListener, final OnDismissListener onDismissListener, final boolean choose) { String prefix = fso.getProviderPrefix(); if (TextUtils.isEmpty(prefix)) { return; } final String path = StorageApiConsole.getProviderPathFromFullPath(fso.getFullPath()); final String name = fso.getName(); final StorageApiConsole console = StorageApiConsole.getStorageApiConsoleForPath(prefix); BackgroundCallable callable = new BackgroundCallable() { private File file; private StorageApi.DocumentInfo documentInfo; @Override public int getDialogIcon() { return 0; } @Override public int getDialogTitle() { return R.string.waiting_dialog_opening_storage_provider_title; } @Override public boolean isDialogCancellable() { return false; } @Override public Spanned requestProgress() { String progress = ctx.getResources().getString( R.string.waiting_dialog_opening_storage_provider_message, fso.getName(), console.getName()); return Html.fromHtml(progress); } @Override public void doInBackground(Object... params) throws Throwable { OutputStream outputStream = null; try { File downloadDir = new File(ctx.getExternalCacheDir(), StorageProviderUtils.CACHE_DIR); if (downloadDir.exists() || downloadDir.mkdirs()) { file = new File(downloadDir.getPath() + File.separator + name); if (file.exists() || file.createNewFile()) { outputStream = new FileOutputStream(file); } } else { Log.e(TAG, "Cannot create cache directory"); //$NON-NLS-1$ } } catch (Exception e) { Log.e(TAG, "Cannot create temp file", e); //$NON-NLS-1$ } PendingResult<StorageApi.DocumentInfo.DocumentInfoResult> pendingResult = console.getStorageApi().getFile(console.getStorageProviderInfo(),path, outputStream, null); // Since we're downloading a file, this can take a while, so don't specify a timeout StorageApi.DocumentInfo.DocumentInfoResult result = pendingResult.await(); if (result == null || !result.getStatus().isSuccess()) { Log.e(TAG, "Cannot download file"); //$NON-NLS-1$ return; } documentInfo = result.getDocumentInfo(); } @Override public void onSuccess() { Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), documentInfo.getMimeType()); FileSystemObject cacheFso = FileHelper.createFileSystemObject(file); resolveIntent( ctx, intent, choose, createInternalIntents(ctx, cacheFso), 0, R.string.associations_dialog_openwith_title, R.string.associations_dialog_openwith_action, true, onCancelListener, onDismissListener); } @Override public void onCancel() { Toast.makeText(ctx, R.string.cancelled_message, Toast .LENGTH_SHORT).show(); } }; BackgroundAsyncTask task = new BackgroundAsyncTask(ctx, callable); task.execute(task); } /** * Method that sends a {@link FileSystemObject} with the default registered application * by the system, or ask the user for select a registered application. Loading
src/com/cyanogenmod/filemanager/util/StorageProviderUtils.java +2 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.graphics.drawable.Drawable; */ public final class StorageProviderUtils { public static final String CACHE_DIR = ".storage-provider-files"; private static final String TAG = StorageProviderUtils.class.getSimpleName(); /** Loading