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

Commit ef95774e authored by Mangesh Ghiware's avatar Mangesh Ghiware Committed by Android (Google) Code Review
Browse files

Merge "Fix for blank Gallery widgets on a DB upgrade" into gb-ub-photos-bryce

parents 2b247c58 ba0c994c
Loading
Loading
Loading
Loading
+171 −52
Original line number Diff line number Diff line
@@ -22,18 +22,109 @@ import android.os.Binder;

import com.android.gallery3d.common.Utils;
import com.android.gallery3d.data.ContentListener;
import com.android.gallery3d.data.DataManager;
import com.android.gallery3d.data.MediaItem;
import com.android.gallery3d.data.MediaObject;
import com.android.gallery3d.data.MediaSet;
import com.android.gallery3d.data.Path;

import java.util.ArrayList;
import java.util.Arrays;

public class MediaSetSource implements WidgetSource, ContentListener {
    private static final String TAG = "MediaSetSource";

    private DataManager mDataManager;
    private Path mAlbumPath;

    private WidgetSource mSource;

    private MediaSet mRootSet;
    private ContentListener mListener;

    public MediaSetSource(DataManager manager, String albumPath) {
        MediaSet mediaSet = (MediaSet) manager.getMediaObject(albumPath);
        if (mediaSet != null) {
            mSource = new CheckedMediaSetSource(mediaSet);
            return;
        }

        // Initialize source to an empty source until the album path can be resolved
        mDataManager = Utils.checkNotNull(manager);
        mAlbumPath = Path.fromString(albumPath);
        mSource = new EmptySource();
        monitorRootPath();
    }

    @Override
    public int size() {
        return mSource.size();
    }

    @Override
    public Bitmap getImage(int index) {
        return mSource.getImage(index);
    }

    @Override
    public Uri getContentUri(int index) {
        return mSource.getContentUri(index);
    }

    @Override
    public synchronized void setContentListener(ContentListener listener) {
        if (mRootSet != null) {
            mListener = listener;
        } else {
            mSource.setContentListener(listener);
        }
    }

    @Override
    public void reload() {
        mSource.reload();
    }

    @Override
    public void close() {
        mSource.close();
    }

    @Override
    public void onContentDirty() {
        resolveAlbumPath();
    }

    private void monitorRootPath() {
        String rootPath = mDataManager.getTopSetPath(DataManager.INCLUDE_ALL);
        mRootSet = (MediaSet) mDataManager.getMediaObject(rootPath);
        mRootSet.addContentListener(this);
    }

    private synchronized void resolveAlbumPath() {
        if (mDataManager == null) return;
        MediaSet mediaSet = (MediaSet) mDataManager.getMediaObject(mAlbumPath);
        if (mediaSet != null) {
            // Clear the reference instead of removing the listener
            // to get around a concurrent modification exception.
            mRootSet = null;

            mSource = new CheckedMediaSetSource(mediaSet);
            if (mListener != null) {
                mListener.onContentDirty();
                mSource.setContentListener(mListener);
                mListener = null;
            }
            mDataManager = null;
            mAlbumPath = null;
        }
    }

    private static class CheckedMediaSetSource implements WidgetSource, ContentListener {
        private static final int CACHE_SIZE = 32;

        @SuppressWarnings("unused")
    private static final String TAG = "MediaSetSource";
        private static final String TAG = "CheckedMediaSetSource";

        private MediaSet mSource;
        private MediaItem mCache[] = new MediaItem[CACHE_SIZE];
@@ -43,7 +134,7 @@ public class MediaSetSource implements WidgetSource, ContentListener {

        private ContentListener mContentListener;

    public MediaSetSource(MediaSet source) {
        public CheckedMediaSetSource(MediaSet source) {
            mSource = Utils.checkNotNull(source);
            mSource.addContentListener(this);
        }
@@ -112,3 +203,31 @@ public class MediaSetSource implements WidgetSource, ContentListener {
            if (mContentListener != null) mContentListener.onContentDirty();
        }
    }

    private static class EmptySource implements WidgetSource {

        @Override
        public int size() {
            return 0;
        }

        @Override
        public Bitmap getImage(int index) {
            throw new UnsupportedOperationException();
        }

        @Override
        public Uri getContentUri(int index) {
            throw new UnsupportedOperationException();
        }

        @Override
        public void setContentListener(ContentListener listener) {}

        @Override
        public void reload() {}

        @Override
        public void close() {}
    }
}
+1 −36
Original line number Diff line number Diff line
@@ -28,9 +28,6 @@ import com.android.gallery3d.R;
import com.android.gallery3d.app.GalleryApp;
import com.android.gallery3d.common.ApiHelper;
import com.android.gallery3d.data.ContentListener;
import com.android.gallery3d.data.DataManager;
import com.android.gallery3d.data.MediaSet;
import com.android.gallery3d.data.Path;

@TargetApi(ApiHelper.VERSION_CODES.HONEYCOMB)
public class WidgetService extends RemoteViewsService {
@@ -52,33 +49,6 @@ public class WidgetService extends RemoteViewsService {
                id, type, albumPath);
    }

    private static class EmptySource implements WidgetSource {

        @Override
        public int size() {
            return 0;
        }

        @Override
        public Bitmap getImage(int index) {
            throw new UnsupportedOperationException();
        }

        @Override
        public Uri getContentUri(int index) {
            throw new UnsupportedOperationException();
        }

        @Override
        public void setContentListener(ContentListener listener) {}

        @Override
        public void reload() {}

        @Override
        public void close() {}
    }

    private static class PhotoRVFactory implements
            RemoteViewsService.RemoteViewsFactory, ContentListener {

@@ -99,12 +69,7 @@ public class WidgetService extends RemoteViewsService {
        @Override
        public void onCreate() {
            if (mType == WidgetDatabaseHelper.TYPE_ALBUM) {
                Path path = Path.fromString(mAlbumPath);
                DataManager manager = mApp.getDataManager();
                MediaSet mediaSet = (MediaSet) manager.getMediaObject(path);
                mSource = mediaSet == null
                        ? new EmptySource()
                        : new MediaSetSource(mediaSet);
                mSource = new MediaSetSource(mApp.getDataManager(), mAlbumPath);
            } else {
                mSource = new LocalPhotoSource(mApp.getAndroidContext());
            }