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

Commit 437513d5 authored by Samuel Fufa's avatar Samuel Fufa
Browse files

Federate SliveLiveData for Search results

Instead of every slice result creating its own live data, we should manage a single SliceLiveData per url that SliceViews can observe.

Bug: 173022319
Test: Manual
Change-Id: Ieaf599aadfac40450be4f39657d3cefb70644e0c
parent 9ee4e86c
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -23,9 +23,14 @@ import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;

import androidx.lifecycle.LiveData;
import androidx.slice.Slice;
import androidx.slice.widget.SliceLiveData;

import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherAppWidgetProviderInfo;
import com.android.launcher3.util.ComponentKey;
@@ -42,7 +47,9 @@ public class LiveSearchManager {

    private final Launcher mLauncher;
    private final AppWidgetManager mAppWidgetManger;
    private HashMap<ComponentKey, SearchWidgetInfoContainer> mWidgetPlaceholders = new HashMap<>();
    private final HashMap<ComponentKey, SearchWidgetInfoContainer> mWidgetPlaceholders =
            new HashMap<>();
    private final HashMap<Uri, LiveData<Slice>> mUriSliceMap = new HashMap<>();
    private SearchWidgetHost mSearchWidgetHost;

    public LiveSearchManager(Launcher launcher) {
@@ -87,6 +94,20 @@ public class LiveSearchManager {
        return view;
    }

    /**
     * Creates {@link LiveData<Slice>} from Slice Uri. Caches created live data to be reused
     * within the same search session. Removes previous observers when new SliceView request a
     * live data for observation.
     */
    public LiveData<Slice> getSliceForUri(Uri sliceUri) {
        LiveData<Slice> sliceLiveData = mUriSliceMap.getOrDefault(sliceUri, null);
        if (sliceLiveData == null) {
            sliceLiveData = SliceLiveData.fromUri(mLauncher, sliceUri);
            mUriSliceMap.put(sliceUri, sliceLiveData);
        }
        return sliceLiveData;
    }

    /**
     * Start search session
     */
@@ -109,6 +130,10 @@ public class LiveSearchManager {
            mWidgetPlaceholders.clear();
            mSearchWidgetHost = null;
        }
        for (LiveData<Slice> liveData : mUriSliceMap.values()) {
            liveData.removeObservers(mLauncher);
        }
        mUriSliceMap.clear();
    }

    static class SearchWidgetHost extends AppWidgetHost {
+2 −3
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ import androidx.lifecycle.LiveData;
import androidx.slice.Slice;
import androidx.slice.SliceItem;
import androidx.slice.widget.EventInfo;
import androidx.slice.widget.SliceLiveData;
import androidx.slice.widget.SliceView;

import com.android.launcher3.Launcher;
@@ -54,7 +53,7 @@ public class SearchResultSettingsSlice extends LinearLayout implements
    private View mIcon;
    private LiveData<Slice> mSliceLiveData;
    private SearchTarget mSearchTarget;
    private Launcher mLauncher;
    private final Launcher mLauncher;

    public SearchResultSettingsSlice(Context context) {
        this(context, null, 0);
@@ -84,7 +83,7 @@ public class SearchResultSettingsSlice extends LinearLayout implements
        reset();
        mSearchTarget = searchTarget;
        try {
            mSliceLiveData = SliceLiveData.fromUri(mLauncher, getSliceUri());
            mSliceLiveData = mLauncher.getLiveSearchManager().getSliceForUri(getSliceUri());
            mSliceLiveData.observe(mLauncher, mSliceView);
        } catch (Exception ex) {
            Log.e(TAG, "unable to bind slice", ex);