Loading src/com/android/launcher3/qsb/QsbContainerView.java +57 −11 Original line number Original line Diff line number Diff line Loading @@ -32,12 +32,15 @@ import android.content.Context; import android.content.Intent; import android.content.Intent; import android.graphics.Rect; import android.graphics.Rect; import android.os.Bundle; import android.os.Bundle; import android.provider.Settings; import android.util.AttributeSet; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.View; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.FrameLayout; import androidx.annotation.Nullable; import com.android.launcher3.AppWidgetResizeFrame; import com.android.launcher3.AppWidgetResizeFrame; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppState; Loading @@ -55,6 +58,8 @@ import com.android.launcher3.graphics.FragmentWithPreview; */ */ public class QsbContainerView extends FrameLayout { public class QsbContainerView extends FrameLayout { public static final String SEARCH_PROVIDER_SETTINGS_KEY = "SEARCH_PROVIDER_PACKAGE_NAME"; public QsbContainerView(Context context) { public QsbContainerView(Context context) { super(context); super(context); } } Loading Loading @@ -101,7 +106,7 @@ public class QsbContainerView extends FrameLayout { protected QsbWidgetHost createHost() { protected QsbWidgetHost createHost() { return new QsbWidgetHost(getContext(), QSB_WIDGET_HOST_ID, return new QsbWidgetHost(getContext(), QSB_WIDGET_HOST_ID, (c) -> new QsbWidgetHostView(c)); (c) -> new QsbWidgetHostView(c), this::rebindFragment); } } private FrameLayout mWrapper; private FrameLayout mWrapper; Loading @@ -111,7 +116,6 @@ public class QsbContainerView extends FrameLayout { LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mWrapper = new FrameLayout(getContext()); mWrapper = new FrameLayout(getContext()); // Only add the view when enabled // Only add the view when enabled if (isQsbEnabled()) { if (isQsbEnabled()) { mWrapper.addView(createQsb(mWrapper)); mWrapper.addView(createQsb(mWrapper)); Loading Loading @@ -246,21 +250,37 @@ public class QsbContainerView extends FrameLayout { return v; return v; } } /** * returns the package name string from global settings or from system search service. * * @return String (package name) or null if neither exist */ @Nullable protected String getSearchProviderPackageName() { String providerPkg = Settings.Global.getString(getContext().getContentResolver(), SEARCH_PROVIDER_SETTINGS_KEY); if (providerPkg == null) { SearchManager searchManager = getContext().getSystemService(SearchManager.class); ComponentName componentName = searchManager.getGlobalSearchActivity(); if (componentName != null) { providerPkg = searchManager.getGlobalSearchActivity().getPackageName(); } } return providerPkg; } /** /** * Returns a widget with category {@link AppWidgetProviderInfo#WIDGET_CATEGORY_SEARCHBOX} * Returns a widget with category {@link AppWidgetProviderInfo#WIDGET_CATEGORY_SEARCHBOX} * provided by the same package which is set to be global search activity. * provided by the package from getSearchProviderPackageName * If widgetCategory is not supported, or no such widget is found, returns the first widget * If widgetCategory is not supported, or no such widget is found, returns the first widget * provided by the package. * provided by the package. */ */ protected AppWidgetProviderInfo getSearchWidgetProvider() { protected AppWidgetProviderInfo getSearchWidgetProvider() { SearchManager searchManager = String providerPkg = getSearchProviderPackageName(); (SearchManager) getContext().getSystemService(Context.SEARCH_SERVICE); if (providerPkg == null) { ComponentName searchComponent = searchManager.getGlobalSearchActivity(); return null; if (searchComponent == null) return null; } String providerPkg = searchComponent.getPackageName(); AppWidgetProviderInfo defaultWidgetForSearchPackage = null; AppWidgetProviderInfo defaultWidgetForSearchPackage = null; AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getContext()); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getContext()); for (AppWidgetProviderInfo info : appWidgetManager.getInstalledProviders()) { for (AppWidgetProviderInfo info : appWidgetManager.getInstalledProviders()) { if (info.provider.getPackageName().equals(providerPkg) && info.configure == null) { if (info.provider.getPackageName().equals(providerPkg) && info.configure == null) { Loading @@ -279,10 +299,17 @@ public class QsbContainerView extends FrameLayout { public static class QsbWidgetHost extends AppWidgetHost { public static class QsbWidgetHost extends AppWidgetHost { private final WidgetViewFactory mViewFactory; private final WidgetViewFactory mViewFactory; private final WidgetProvidersUpdateCallback mWidgetsUpdateCallback; public QsbWidgetHost(Context context, int hostId, WidgetViewFactory viewFactory) { public QsbWidgetHost(Context context, int hostId, WidgetViewFactory viewFactory, WidgetProvidersUpdateCallback widgetProvidersUpdateCallback) { super(context, hostId); super(context, hostId); mViewFactory = viewFactory; mViewFactory = viewFactory; mWidgetsUpdateCallback = widgetProvidersUpdateCallback; } public QsbWidgetHost(Context context, int hostId, WidgetViewFactory viewFactory) { this(context, hostId, viewFactory, null); } } @Override @Override Loading @@ -290,6 +317,14 @@ public class QsbContainerView extends FrameLayout { Context context, int appWidgetId, AppWidgetProviderInfo appWidget) { Context context, int appWidgetId, AppWidgetProviderInfo appWidget) { return mViewFactory.newView(context); return mViewFactory.newView(context); } } @Override protected void onProvidersChanged() { super.onProvidersChanged(); if (mWidgetsUpdateCallback != null) { mWidgetsUpdateCallback.onProvidersUpdated(); } } } } public interface WidgetViewFactory { public interface WidgetViewFactory { Loading @@ -297,6 +332,17 @@ public class QsbContainerView extends FrameLayout { QsbWidgetHostView newView(Context context); QsbWidgetHostView newView(Context context); } } /** * Callback interface for packages list update. */ @FunctionalInterface public interface WidgetProvidersUpdateCallback { /** * Gets called when widget providers list changes */ void onProvidersUpdated(); } /** /** * Returns true if {@param original} contains all entries defined in {@param updates} and * Returns true if {@param original} contains all entries defined in {@param updates} and * have the same value. * have the same value. Loading Loading
src/com/android/launcher3/qsb/QsbContainerView.java +57 −11 Original line number Original line Diff line number Diff line Loading @@ -32,12 +32,15 @@ import android.content.Context; import android.content.Intent; import android.content.Intent; import android.graphics.Rect; import android.graphics.Rect; import android.os.Bundle; import android.os.Bundle; import android.provider.Settings; import android.util.AttributeSet; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.View; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.FrameLayout; import androidx.annotation.Nullable; import com.android.launcher3.AppWidgetResizeFrame; import com.android.launcher3.AppWidgetResizeFrame; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppState; Loading @@ -55,6 +58,8 @@ import com.android.launcher3.graphics.FragmentWithPreview; */ */ public class QsbContainerView extends FrameLayout { public class QsbContainerView extends FrameLayout { public static final String SEARCH_PROVIDER_SETTINGS_KEY = "SEARCH_PROVIDER_PACKAGE_NAME"; public QsbContainerView(Context context) { public QsbContainerView(Context context) { super(context); super(context); } } Loading Loading @@ -101,7 +106,7 @@ public class QsbContainerView extends FrameLayout { protected QsbWidgetHost createHost() { protected QsbWidgetHost createHost() { return new QsbWidgetHost(getContext(), QSB_WIDGET_HOST_ID, return new QsbWidgetHost(getContext(), QSB_WIDGET_HOST_ID, (c) -> new QsbWidgetHostView(c)); (c) -> new QsbWidgetHostView(c), this::rebindFragment); } } private FrameLayout mWrapper; private FrameLayout mWrapper; Loading @@ -111,7 +116,6 @@ public class QsbContainerView extends FrameLayout { LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mWrapper = new FrameLayout(getContext()); mWrapper = new FrameLayout(getContext()); // Only add the view when enabled // Only add the view when enabled if (isQsbEnabled()) { if (isQsbEnabled()) { mWrapper.addView(createQsb(mWrapper)); mWrapper.addView(createQsb(mWrapper)); Loading Loading @@ -246,21 +250,37 @@ public class QsbContainerView extends FrameLayout { return v; return v; } } /** * returns the package name string from global settings or from system search service. * * @return String (package name) or null if neither exist */ @Nullable protected String getSearchProviderPackageName() { String providerPkg = Settings.Global.getString(getContext().getContentResolver(), SEARCH_PROVIDER_SETTINGS_KEY); if (providerPkg == null) { SearchManager searchManager = getContext().getSystemService(SearchManager.class); ComponentName componentName = searchManager.getGlobalSearchActivity(); if (componentName != null) { providerPkg = searchManager.getGlobalSearchActivity().getPackageName(); } } return providerPkg; } /** /** * Returns a widget with category {@link AppWidgetProviderInfo#WIDGET_CATEGORY_SEARCHBOX} * Returns a widget with category {@link AppWidgetProviderInfo#WIDGET_CATEGORY_SEARCHBOX} * provided by the same package which is set to be global search activity. * provided by the package from getSearchProviderPackageName * If widgetCategory is not supported, or no such widget is found, returns the first widget * If widgetCategory is not supported, or no such widget is found, returns the first widget * provided by the package. * provided by the package. */ */ protected AppWidgetProviderInfo getSearchWidgetProvider() { protected AppWidgetProviderInfo getSearchWidgetProvider() { SearchManager searchManager = String providerPkg = getSearchProviderPackageName(); (SearchManager) getContext().getSystemService(Context.SEARCH_SERVICE); if (providerPkg == null) { ComponentName searchComponent = searchManager.getGlobalSearchActivity(); return null; if (searchComponent == null) return null; } String providerPkg = searchComponent.getPackageName(); AppWidgetProviderInfo defaultWidgetForSearchPackage = null; AppWidgetProviderInfo defaultWidgetForSearchPackage = null; AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getContext()); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getContext()); for (AppWidgetProviderInfo info : appWidgetManager.getInstalledProviders()) { for (AppWidgetProviderInfo info : appWidgetManager.getInstalledProviders()) { if (info.provider.getPackageName().equals(providerPkg) && info.configure == null) { if (info.provider.getPackageName().equals(providerPkg) && info.configure == null) { Loading @@ -279,10 +299,17 @@ public class QsbContainerView extends FrameLayout { public static class QsbWidgetHost extends AppWidgetHost { public static class QsbWidgetHost extends AppWidgetHost { private final WidgetViewFactory mViewFactory; private final WidgetViewFactory mViewFactory; private final WidgetProvidersUpdateCallback mWidgetsUpdateCallback; public QsbWidgetHost(Context context, int hostId, WidgetViewFactory viewFactory) { public QsbWidgetHost(Context context, int hostId, WidgetViewFactory viewFactory, WidgetProvidersUpdateCallback widgetProvidersUpdateCallback) { super(context, hostId); super(context, hostId); mViewFactory = viewFactory; mViewFactory = viewFactory; mWidgetsUpdateCallback = widgetProvidersUpdateCallback; } public QsbWidgetHost(Context context, int hostId, WidgetViewFactory viewFactory) { this(context, hostId, viewFactory, null); } } @Override @Override Loading @@ -290,6 +317,14 @@ public class QsbContainerView extends FrameLayout { Context context, int appWidgetId, AppWidgetProviderInfo appWidget) { Context context, int appWidgetId, AppWidgetProviderInfo appWidget) { return mViewFactory.newView(context); return mViewFactory.newView(context); } } @Override protected void onProvidersChanged() { super.onProvidersChanged(); if (mWidgetsUpdateCallback != null) { mWidgetsUpdateCallback.onProvidersUpdated(); } } } } public interface WidgetViewFactory { public interface WidgetViewFactory { Loading @@ -297,6 +332,17 @@ public class QsbContainerView extends FrameLayout { QsbWidgetHostView newView(Context context); QsbWidgetHostView newView(Context context); } } /** * Callback interface for packages list update. */ @FunctionalInterface public interface WidgetProvidersUpdateCallback { /** * Gets called when widget providers list changes */ void onProvidersUpdated(); } /** /** * Returns true if {@param original} contains all entries defined in {@param updates} and * Returns true if {@param original} contains all entries defined in {@param updates} and * have the same value. * have the same value. Loading