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

Commit be1e0799 authored by Garfield Tan's avatar Garfield Tan
Browse files

Use BroadcastReceiver to notify root changes.

Starting Android O system doesn't allow posting notifications to
ContentResolver w/o a ContentProvider.

Bug: 35766186
Change-Id: Iad20c06219da3a08f0dcfcf298977a8a97b7699f
parent 2fc1baa8
Loading
Loading
Loading
Loading
+12 −11
Original line number Diff line number Diff line
@@ -17,11 +17,12 @@
package com.android.documentsui;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.content.LocalBroadcastManager;

import com.android.documentsui.AbstractActionHandler.CommonAddons;
import com.android.documentsui.base.DocumentInfo;
@@ -39,8 +40,8 @@ import java.util.Collection;
 */
final class RootsMonitor<T extends Activity & CommonAddons> {

    private final ContentResolver mResolver;
    private final ContentObserver mObserver;
    private final LocalBroadcastManager mManager;
    private final BroadcastReceiver mReceiver;

    RootsMonitor(
            final T activity,
@@ -49,11 +50,11 @@ final class RootsMonitor<T extends Activity & CommonAddons> {
            final DocumentsAccess docs,
            final State state,
            final SearchViewManager searchMgr) {
        mResolver = activity.getContentResolver();
        mManager = LocalBroadcastManager.getInstance(activity);

        mObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
        mReceiver = new BroadcastReceiver() {
            @Override
            public void onChange(boolean selfChange) {
            public void onReceive(Context context, Intent intent) {
                new HandleRootsChangedTask<T>(
                        activity,
                        actions,
@@ -66,11 +67,11 @@ final class RootsMonitor<T extends Activity & CommonAddons> {
    }

    void start() {
        mResolver.registerContentObserver(RootsAccess.NOTIFICATION_URI, false, mObserver);
        mManager.registerReceiver(mReceiver, new IntentFilter(RootsAccess.BROADCAST_ACTION));
    }

    void stop() {
        mResolver.unregisterContentObserver(mObserver);
        mManager.unregisterReceiver(mReceiver);
    }

    private static class HandleRootsChangedTask<T extends Activity & CommonAddons>
+1 −2
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.documentsui.roots;
import static com.android.documentsui.base.Shared.DEBUG;
import static com.android.documentsui.base.Shared.VERBOSE;

import android.net.Uri;
import android.util.Log;

import com.android.documentsui.base.MimeTypes;
@@ -36,7 +35,7 @@ import java.util.List;
 */
public interface RootsAccess {

    Uri NOTIFICATION_URI = Uri.parse("content://com.android.documentsui.roots/");
    String BROADCAST_ACTION = "com.android.documentsui.action.ROOT_CHANGED";

    /**
     * Return the requested {@link RootInfo}, but only loading the roots for the
+2 −2
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.os.Handler;
import android.os.SystemClock;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Root;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

import com.android.documentsui.DocumentsApplication;
@@ -411,7 +412,6 @@ public class RootsCache implements RootsAccess {

            mTaskRoots.put(mRecentsRoot.authority, mRecentsRoot);

            final ContentResolver resolver = mContext.getContentResolver();
            final PackageManager pm = mContext.getPackageManager();

            // Pick up provider with action string
@@ -434,7 +434,7 @@ public class RootsCache implements RootsAccess {
                mStoppedAuthorities = mTaskStoppedAuthorities;
            }
            mFirstLoad.countDown();
            resolver.notifyChange(NOTIFICATION_URI, null, false);
            LocalBroadcastManager.getInstance(mContext).sendBroadcast(new Intent(BROADCAST_ACTION));
            return null;
        }

+13 −4
Original line number Diff line number Diff line
@@ -17,7 +17,11 @@
package com.android.documentsui.roots;

import android.content.AsyncTaskLoader;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;

import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.State;
@@ -25,7 +29,12 @@ import com.android.documentsui.base.State;
import java.util.Collection;

public class RootsLoader extends AsyncTaskLoader<Collection<RootInfo>> {
    private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            onContentChanged();
        }
    };

    private final RootsCache mRoots;
    private final State mState;
@@ -37,8 +46,8 @@ public class RootsLoader extends AsyncTaskLoader<Collection<RootInfo>> {
        mRoots = roots;
        mState = state;

        context.getContentResolver().registerContentObserver(
                RootsAccess.NOTIFICATION_URI, false, mObserver);
        LocalBroadcastManager.getInstance(context).registerReceiver(
                mReceiver, new IntentFilter(RootsAccess.BROADCAST_ACTION));
    }

    @Override
@@ -83,6 +92,6 @@ public class RootsLoader extends AsyncTaskLoader<Collection<RootInfo>> {

        mResult = null;

        getContext().getContentResolver().unregisterContentObserver(mObserver);
        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mReceiver);
    }
}