Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7d9007cf authored by Raj Yengisetty's avatar Raj Yengisetty
Browse files

Download and open storage provider files

Change-Id: I34a8d6f9b5e2f923e7dc10e11c49681792fc50bc
parent 0dbf3d6c
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -453,6 +453,10 @@
    <string name="waiting_dialog_compressing_msg"><![CDATA[<b>File</b>]]> <xliff:g id="file">%1$s</xliff:g></string>
    <string name="waiting_dialog_compressing_msg"><![CDATA[<b>File</b>]]> <xliff:g id="file">%1$s</xliff:g></string>
    <!-- Waiting dialog - Initializing the dialog -->
    <!-- Waiting dialog - Initializing the dialog -->
    <string name="waiting_dialog_analizing_msg"><![CDATA[<b>Analyzing\u2026</b>]]></string>
    <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 -->
    <!-- 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>
    <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 -->
    <!-- Compressing - Success message -->
+22 −24
Original line number Original line Diff line number Diff line
@@ -19,7 +19,6 @@ package com.cyanogenmod.filemanager.commands.storageapi;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.Log;
import android.util.Log;


import com.cyanogen.ambient.common.api.PendingResult;
import com.cyanogen.ambient.common.api.ResultCallback;
import com.cyanogen.ambient.common.api.ResultCallback;
import com.cyanogen.ambient.storage.StorageApi;
import com.cyanogen.ambient.storage.StorageApi;
import com.cyanogen.ambient.storage.StorageApi.Document;
import com.cyanogen.ambient.storage.StorageApi.Document;
@@ -104,9 +103,8 @@ public class ListCommand extends Program implements ListExecutable {
            return;
            return;
        }
        }


        PendingResult<DocumentResult> pendingResult =
        storageApi.getMetadata(storageProviderInfo, mSrc, true,
                storageApi.getMetadata(storageProviderInfo, mSrc, true);
                new ResultCallback<DocumentResult>() {
        pendingResult.setResultCallback(new ResultCallback<DocumentResult>() {
                    @Override
                    @Override
                    public void onResult(DocumentResult documentResult) {
                    public void onResult(DocumentResult documentResult) {
                        if (documentResult == null) {
                        if (documentResult == null) {
+117 −0
Original line number Original line Diff line number Diff line
@@ -16,8 +16,10 @@


package com.cyanogenmod.filemanager.ui.policy;
package com.cyanogenmod.filemanager.ui.policy;


import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.ComponentName;
import android.content.Context;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.Intent;
@@ -26,12 +28,20 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.net.Uri;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore;
import android.text.Html;
import android.text.Spanned;
import android.text.TextUtils;
import android.util.Log;
import android.util.Log;
import android.widget.Toast;
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.R;
import com.cyanogenmod.filemanager.activities.ShortcutActivity;
import com.cyanogenmod.filemanager.activities.ShortcutActivity;
import com.cyanogenmod.filemanager.console.secure.SecureConsole;
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.FileSystemObject;
import com.cyanogenmod.filemanager.model.RegularFile;
import com.cyanogenmod.filemanager.model.RegularFile;
import com.cyanogenmod.filemanager.providers.SecureResourceProvider;
import com.cyanogenmod.filemanager.providers.SecureResourceProvider;
@@ -47,8 +57,11 @@ import com.cyanogenmod.filemanager.util.MediaHelper;
import com.cyanogenmod.filemanager.util.MimeTypeHelper;
import com.cyanogenmod.filemanager.util.MimeTypeHelper;
import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory;
import com.cyanogenmod.filemanager.util.MimeTypeHelper.MimeTypeCategory;
import com.cyanogenmod.filemanager.util.ResourcesHelper;
import com.cyanogenmod.filemanager.util.ResourcesHelper;
import com.cyanogenmod.filemanager.util.StorageProviderUtils;


import java.io.File;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Collections;
import java.util.Comparator;
import java.util.Comparator;
@@ -162,6 +175,11 @@ public final class IntentsActionPolicy extends ActionsPolicy {
                                }))
                                }))
                        .show();
                        .show();
                return;
                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
            // Obtain the mime/type and passed it to intent
@@ -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
     * Method that sends a {@link FileSystemObject} with the default registered application
     * by the system, or ask the user for select a registered application.
     * by the system, or ask the user for select a registered application.
+2 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,8 @@ import android.graphics.drawable.Drawable;
 */
 */
public final class StorageProviderUtils {
public final class StorageProviderUtils {


    public static final String CACHE_DIR = ".storage-provider-files";

    private static final String TAG = StorageProviderUtils.class.getSimpleName();
    private static final String TAG = StorageProviderUtils.class.getSimpleName();


    /**
    /**