Loading src/com/android/launcher3/allapps/search/DefaultSearchAdapterProvider.java +6 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.launcher3.allapps.search; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; Loading @@ -36,6 +37,11 @@ public class DefaultSearchAdapterProvider extends SearchAdapterProvider { } @Override public void onSliceStatusUpdate(Uri sliceUri) { } @Override public boolean isSearchView(int viewType) { return false; Loading src/com/android/launcher3/allapps/search/LiveSearchManager.java +42 −3 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import androidx.slice.Slice; import androidx.slice.SliceViewManager; import androidx.slice.SliceViewManager.SliceCallback; import com.android.launcher3.Alarm; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.statemanager.StateManager.StateListener; Loading @@ -52,6 +53,7 @@ import com.android.launcher3.widget.PendingAddWidgetInfo; import java.util.ArrayList; import java.util.HashMap; import java.util.function.Consumer; /** * Manages Lifecycle for Live search results Loading @@ -60,6 +62,7 @@ public class LiveSearchManager implements StateListener<LauncherState> { private static final String TAG = "LiveSearchManager"; private static final long SLICE_TIMEOUT_MS = 50; public static final int SEARCH_APPWIDGET_HOST_ID = 2048; private final Launcher mLauncher; Loading Loading @@ -144,16 +147,50 @@ public class LiveSearchManager implements StateListener<LauncherState> { /** * Adds a new observer for the provided uri and returns a callback to cancel this observer */ public SafeCloseable addObserver(Uri uri, Observer<Slice> listener) { public SafeCloseable addObserver(Uri uri, Observer<Slice> listener, Consumer<Uri> timeoutConsumer) { SliceLifeCycle slc = mUriSliceMap.get(uri); if (slc == null) { slc = new SliceLifeCycle(uri, mLauncher); mUriSliceMap.put(uri, slc); } slc.addListener(listener); if (slc.mLastValue != null) { listener.onChanged(slc.mLastValue); } // Use a listener wrapper to handle error timeout. Observer<Slice> listenerWrapper = new Observer<Slice>() { final Alarm mErrorTimeout = new Alarm(); { mErrorTimeout.setOnAlarmListener(alarm -> { alarm.cancelAlarm(); timeoutConsumer.accept(uri); }); mErrorTimeout.setAlarm(SLICE_TIMEOUT_MS); } @Override public void onChanged(Slice slice) { if (slice == null) { return; } if (mErrorTimeout.alarmPending()) { mErrorTimeout.cancelAlarm(); } if (mUriSliceMap.get(uri) != null) { mUriSliceMap.get(uri).mLastValue = slice; } listener.onChanged(slice); } }; slc.addListener(listenerWrapper); final SliceLifeCycle sliceLifeCycle = slc; return () -> sliceLifeCycle.removeListener(listener); return () -> sliceLifeCycle.removeListener(listenerWrapper); } static class SearchWidgetHost extends AppWidgetHost { Loading Loading @@ -184,6 +221,8 @@ public class LiveSearchManager implements StateListener<LauncherState> { private boolean mDestroyed = false; private boolean mWasListening = false; Slice mLastValue; SliceLifeCycle(Uri uri, Launcher launcher) { mUri = uri; mLauncher = launcher; Loading src/com/android/launcher3/allapps/search/SearchAdapterProvider.java +6 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.launcher3.allapps.search; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; Loading @@ -39,6 +40,11 @@ public abstract class SearchAdapterProvider { */ public abstract void onBindView(AllAppsGridAdapter.ViewHolder holder, int position); /** * Called from LiveSearchManager to notify slice status updates. */ public abstract void onSliceStatusUpdate(Uri sliceUri); /** * Returns whether or not viewType can be handled by searchProvider */ Loading Loading
src/com/android/launcher3/allapps/search/DefaultSearchAdapterProvider.java +6 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.launcher3.allapps.search; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; Loading @@ -36,6 +37,11 @@ public class DefaultSearchAdapterProvider extends SearchAdapterProvider { } @Override public void onSliceStatusUpdate(Uri sliceUri) { } @Override public boolean isSearchView(int viewType) { return false; Loading
src/com/android/launcher3/allapps/search/LiveSearchManager.java +42 −3 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import androidx.slice.Slice; import androidx.slice.SliceViewManager; import androidx.slice.SliceViewManager.SliceCallback; import com.android.launcher3.Alarm; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.statemanager.StateManager.StateListener; Loading @@ -52,6 +53,7 @@ import com.android.launcher3.widget.PendingAddWidgetInfo; import java.util.ArrayList; import java.util.HashMap; import java.util.function.Consumer; /** * Manages Lifecycle for Live search results Loading @@ -60,6 +62,7 @@ public class LiveSearchManager implements StateListener<LauncherState> { private static final String TAG = "LiveSearchManager"; private static final long SLICE_TIMEOUT_MS = 50; public static final int SEARCH_APPWIDGET_HOST_ID = 2048; private final Launcher mLauncher; Loading Loading @@ -144,16 +147,50 @@ public class LiveSearchManager implements StateListener<LauncherState> { /** * Adds a new observer for the provided uri and returns a callback to cancel this observer */ public SafeCloseable addObserver(Uri uri, Observer<Slice> listener) { public SafeCloseable addObserver(Uri uri, Observer<Slice> listener, Consumer<Uri> timeoutConsumer) { SliceLifeCycle slc = mUriSliceMap.get(uri); if (slc == null) { slc = new SliceLifeCycle(uri, mLauncher); mUriSliceMap.put(uri, slc); } slc.addListener(listener); if (slc.mLastValue != null) { listener.onChanged(slc.mLastValue); } // Use a listener wrapper to handle error timeout. Observer<Slice> listenerWrapper = new Observer<Slice>() { final Alarm mErrorTimeout = new Alarm(); { mErrorTimeout.setOnAlarmListener(alarm -> { alarm.cancelAlarm(); timeoutConsumer.accept(uri); }); mErrorTimeout.setAlarm(SLICE_TIMEOUT_MS); } @Override public void onChanged(Slice slice) { if (slice == null) { return; } if (mErrorTimeout.alarmPending()) { mErrorTimeout.cancelAlarm(); } if (mUriSliceMap.get(uri) != null) { mUriSliceMap.get(uri).mLastValue = slice; } listener.onChanged(slice); } }; slc.addListener(listenerWrapper); final SliceLifeCycle sliceLifeCycle = slc; return () -> sliceLifeCycle.removeListener(listener); return () -> sliceLifeCycle.removeListener(listenerWrapper); } static class SearchWidgetHost extends AppWidgetHost { Loading Loading @@ -184,6 +221,8 @@ public class LiveSearchManager implements StateListener<LauncherState> { private boolean mDestroyed = false; private boolean mWasListening = false; Slice mLastValue; SliceLifeCycle(Uri uri, Launcher launcher) { mUri = uri; mLauncher = launcher; Loading
src/com/android/launcher3/allapps/search/SearchAdapterProvider.java +6 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.launcher3.allapps.search; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; Loading @@ -39,6 +40,11 @@ public abstract class SearchAdapterProvider { */ public abstract void onBindView(AllAppsGridAdapter.ViewHolder holder, int position); /** * Called from LiveSearchManager to notify slice status updates. */ public abstract void onSliceStatusUpdate(Uri sliceUri); /** * Returns whether or not viewType can be handled by searchProvider */ Loading