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

Commit 957be8c3 authored by Tony Huang's avatar Tony Huang
Browse files

Refactor LoadRootTask for backup behavior when root doesn't exist.

When root doesn't exist then run LoadRootTask, it will always finish
activity directly. It is very bad user experience.
Refactor LoadRootTask and handle callback on ActionHandler.

Fix: 137053586
Test: manual
Test: atest DocumentsUIGoogleTests
Change-Id: Ib6536f2f7678f1e9aa0c29a65433e78cab86082f
parent 3b617862
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -482,13 +482,13 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA

    @Override
    public final void loadRoot(Uri uri) {
        new LoadRootTask<>(mActivity, mProviders, mState, uri)
        new LoadRootTask<>(mActivity, mProviders, uri, this::onRootLoaded)
                .executeOnExecutor(mExecutors.lookup(uri.getAuthority()));
    }

    @Override
    public final void loadFirstRoot(Uri uri) {
        new LoadFirstRootTask<>(mActivity, mProviders, mState, uri)
        new LoadFirstRootTask<>(mActivity, mProviders, uri, this::onRootLoaded)
                .executeOnExecutor(mExecutors.lookup(uri.getAuthority()));
    }

@@ -537,6 +537,14 @@ public abstract class AbstractActionHandler<T extends FragmentActivity & CommonA
        }
    }

    private void onRootLoaded(@Nullable RootInfo root) {
        if (root != null) {
            mActivity.onRootPicked(root);
        } else {
            launchToDefaultLocation();
        }
    }

    protected abstract void launchToDefaultLocation();

    protected void restoreRootAndDirectory() {
+6 −3
Original line number Diff line number Diff line
@@ -21,15 +21,18 @@ import android.net.Uri;

import com.android.documentsui.AbstractActionHandler.CommonAddons;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.State;

import java.util.Collection;

public final class LoadFirstRootTask<T extends Activity & CommonAddons>
        extends LoadRootTask<T> {

    public LoadFirstRootTask(T activity, ProvidersAccess providers, State state, Uri rootUri) {
        super(activity, providers, state, rootUri);
    public LoadFirstRootTask(
            T activity,
            ProvidersAccess providers,
            Uri rootUri,
            LoadRootCallback callback) {
        super(activity, providers, rootUri, callback);
    }

    @Override
+22 −7
Original line number Diff line number Diff line
@@ -23,25 +23,29 @@ import android.net.Uri;
import android.provider.DocumentsContract;
import android.util.Log;

import androidx.annotation.Nullable;

import com.android.documentsui.AbstractActionHandler.CommonAddons;
import com.android.documentsui.base.PairedTask;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.State;

public class LoadRootTask<T extends Activity & CommonAddons>
        extends PairedTask<T, Void, RootInfo> {
    private static final String TAG = "LoadRootTask";

    protected final ProvidersAccess mProviders;

    private final State mState;
    private final Uri mRootUri;
    private final LoadRootCallback mCallback;

    public LoadRootTask(T activity, ProvidersAccess providers, State state, Uri rootUri) {
    public LoadRootTask(
            T activity,
            ProvidersAccess providers,
            Uri rootUri,
            LoadRootCallback callback) {
        super(activity);
        mState = state;
        mProviders = providers;
        mRootUri = rootUri;
        mCallback = callback;
    }

    @Override
@@ -59,14 +63,25 @@ public class LoadRootTask<T extends Activity & CommonAddons>
            if (DEBUG) {
                Log.d(TAG, "Loaded root: " + root);
            }
            mOwner.onRootPicked(root);
        } else {
            Log.w(TAG, "Failed to find root: " + mRootUri);
            mOwner.finish();
        }

        mCallback.onRootLoaded(root);
    }

    protected String getRootId(Uri rootUri) {
        return DocumentsContract.getRootId(rootUri);
    }

    /**
     * Callback for task finished.
     */
    @FunctionalInterface
    public interface LoadRootCallback {
        /**
         * Return the RootInfo of input uri, null if the uri is invalid.
         */
        void onRootLoaded(@Nullable RootInfo root);
    }
}