Merge "Created LauncherWidgetHolder as a wrapper for LauncherAppWidgetHost" into tm-qpr-dev
This commit is contained in:
@@ -77,6 +77,7 @@ import com.android.launcher3.DeviceProfile;
|
|||||||
import com.android.launcher3.Launcher;
|
import com.android.launcher3.Launcher;
|
||||||
import com.android.launcher3.LauncherSettings.Favorites;
|
import com.android.launcher3.LauncherSettings.Favorites;
|
||||||
import com.android.launcher3.LauncherState;
|
import com.android.launcher3.LauncherState;
|
||||||
|
import com.android.launcher3.LauncherWidgetHolder;
|
||||||
import com.android.launcher3.QuickstepAccessibilityDelegate;
|
import com.android.launcher3.QuickstepAccessibilityDelegate;
|
||||||
import com.android.launcher3.QuickstepTransitionManager;
|
import com.android.launcher3.QuickstepTransitionManager;
|
||||||
import com.android.launcher3.R;
|
import com.android.launcher3.R;
|
||||||
@@ -123,7 +124,6 @@ import com.android.launcher3.util.PendingSplitSelectInfo;
|
|||||||
import com.android.launcher3.util.RunnableList;
|
import com.android.launcher3.util.RunnableList;
|
||||||
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
|
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
|
||||||
import com.android.launcher3.util.TouchController;
|
import com.android.launcher3.util.TouchController;
|
||||||
import com.android.launcher3.widget.LauncherAppWidgetHost;
|
|
||||||
import com.android.quickstep.OverviewCommandHelper;
|
import com.android.quickstep.OverviewCommandHelper;
|
||||||
import com.android.quickstep.RecentsModel;
|
import com.android.quickstep.RecentsModel;
|
||||||
import com.android.quickstep.SystemUiProxy;
|
import com.android.quickstep.SystemUiProxy;
|
||||||
@@ -487,11 +487,11 @@ public class QuickstepLauncher extends Launcher {
|
|||||||
return new QuickstepAtomicAnimationFactory(this);
|
return new QuickstepAtomicAnimationFactory(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected LauncherAppWidgetHost createAppWidgetHost() {
|
@Override
|
||||||
LauncherAppWidgetHost appWidgetHost = super.createAppWidgetHost();
|
protected LauncherWidgetHolder createAppWidgetHolder() {
|
||||||
ApiWrapper.setHostInteractionHandler(appWidgetHost,
|
LauncherWidgetHolder appWidgetHolder = super.createAppWidgetHolder();
|
||||||
new QuickstepInteractionHandler(this));
|
appWidgetHolder.setInteractionHandler(new QuickstepInteractionHandler(this));
|
||||||
return appWidgetHost;
|
return appWidgetHolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -249,11 +249,11 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O
|
|||||||
/* widgetHandler= */ null,
|
/* widgetHandler= */ null,
|
||||||
(ItemInfo) mWidgetView.getTag()));
|
(ItemInfo) mWidgetView.getTag()));
|
||||||
mLauncher
|
mLauncher
|
||||||
.getAppWidgetHost()
|
.getAppWidgetHolder()
|
||||||
.startConfigActivity(
|
.startConfigActivity(
|
||||||
mLauncher,
|
mLauncher,
|
||||||
mWidgetView.getAppWidgetId(),
|
mWidgetView.getAppWidgetId(),
|
||||||
Launcher.REQUEST_RECONFIGURE_APPWIDGET);
|
Launcher.REQUEST_RECONFIGURE_APPWIDGET);
|
||||||
});
|
});
|
||||||
if (!hasSeenReconfigurableWidgetEducationTip()) {
|
if (!hasSeenReconfigurableWidgetEducationTip()) {
|
||||||
post(() -> {
|
post(() -> {
|
||||||
|
|||||||
@@ -205,7 +205,6 @@ import com.android.launcher3.views.FloatingIconView;
|
|||||||
import com.android.launcher3.views.FloatingSurfaceView;
|
import com.android.launcher3.views.FloatingSurfaceView;
|
||||||
import com.android.launcher3.views.OptionsPopupView;
|
import com.android.launcher3.views.OptionsPopupView;
|
||||||
import com.android.launcher3.views.ScrimView;
|
import com.android.launcher3.views.ScrimView;
|
||||||
import com.android.launcher3.widget.LauncherAppWidgetHost;
|
|
||||||
import com.android.launcher3.widget.LauncherAppWidgetHostView;
|
import com.android.launcher3.widget.LauncherAppWidgetHostView;
|
||||||
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
|
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
|
||||||
import com.android.launcher3.widget.PendingAddShortcutInfo;
|
import com.android.launcher3.widget.PendingAddShortcutInfo;
|
||||||
@@ -317,7 +316,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
DragLayer mDragLayer;
|
DragLayer mDragLayer;
|
||||||
|
|
||||||
private WidgetManagerHelper mAppWidgetManager;
|
private WidgetManagerHelper mAppWidgetManager;
|
||||||
private LauncherAppWidgetHost mAppWidgetHost;
|
private LauncherWidgetHolder mAppWidgetHolder;
|
||||||
|
|
||||||
private final int[] mTmpAddItemCellCoordinates = new int[2];
|
private final int[] mTmpAddItemCellCoordinates = new int[2];
|
||||||
|
|
||||||
@@ -482,8 +481,8 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
mOnboardingPrefs = createOnboardingPrefs(mSharedPrefs);
|
mOnboardingPrefs = createOnboardingPrefs(mSharedPrefs);
|
||||||
|
|
||||||
mAppWidgetManager = new WidgetManagerHelper(this);
|
mAppWidgetManager = new WidgetManagerHelper(this);
|
||||||
mAppWidgetHost = createAppWidgetHost();
|
mAppWidgetHolder = createAppWidgetHolder();
|
||||||
mAppWidgetHost.startListening();
|
mAppWidgetHolder.startListening();
|
||||||
|
|
||||||
setupViews();
|
setupViews();
|
||||||
crossFadeWithPreviousAppearance();
|
crossFadeWithPreviousAppearance();
|
||||||
@@ -963,7 +962,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
AppWidgetHostView boundWidget = null;
|
AppWidgetHostView boundWidget = null;
|
||||||
if (resultCode == RESULT_OK) {
|
if (resultCode == RESULT_OK) {
|
||||||
animationType = Workspace.COMPLETE_TWO_STAGE_WIDGET_DROP_ANIMATION;
|
animationType = Workspace.COMPLETE_TWO_STAGE_WIDGET_DROP_ANIMATION;
|
||||||
final AppWidgetHostView layout = mAppWidgetHost.createView(this, appWidgetId,
|
final AppWidgetHostView layout = mAppWidgetHolder.createView(this, appWidgetId,
|
||||||
requestArgs.getWidgetHandler().getProviderInfo(this));
|
requestArgs.getWidgetHandler().getProviderInfo(this));
|
||||||
boundWidget = layout;
|
boundWidget = layout;
|
||||||
onCompleteRunnable = new Runnable() {
|
onCompleteRunnable = new Runnable() {
|
||||||
@@ -974,7 +973,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
} else if (resultCode == RESULT_CANCELED) {
|
} else if (resultCode == RESULT_CANCELED) {
|
||||||
mAppWidgetHost.deleteAppWidgetId(appWidgetId);
|
mAppWidgetHolder.deleteAppWidgetId(appWidgetId);
|
||||||
animationType = Workspace.CANCEL_TWO_STAGE_WIDGET_DROP_ANIMATION;
|
animationType = Workspace.CANCEL_TWO_STAGE_WIDGET_DROP_ANIMATION;
|
||||||
}
|
}
|
||||||
if (mDragLayer.getAnimatedView() != null) {
|
if (mDragLayer.getAnimatedView() != null) {
|
||||||
@@ -997,7 +996,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
}
|
}
|
||||||
hideKeyboard();
|
hideKeyboard();
|
||||||
logStopAndResume(false /* isResume */);
|
logStopAndResume(false /* isResume */);
|
||||||
mAppWidgetHost.setActivityStarted(false);
|
mAppWidgetHolder.setActivityStarted(false);
|
||||||
NotificationListener.removeNotificationsChangedListener(getPopupDataProvider());
|
NotificationListener.removeNotificationsChangedListener(getPopupDataProvider());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1010,7 +1009,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
mOverlayManager.onActivityStarted(this);
|
mOverlayManager.onActivityStarted(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
mAppWidgetHost.setActivityStarted(true);
|
mAppWidgetHolder.setActivityStarted(true);
|
||||||
TraceHelper.INSTANCE.endSection(traceToken);
|
TraceHelper.INSTANCE.endSection(traceToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1030,7 +1029,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
NotificationListener.addNotificationsChangedListener(mPopupDataProvider);
|
NotificationListener.addNotificationsChangedListener(mPopupDataProvider);
|
||||||
|
|
||||||
DiscoveryBounce.showForHomeIfNeeded(this);
|
DiscoveryBounce.showForHomeIfNeeded(this);
|
||||||
mAppWidgetHost.setActivityResumed(true);
|
mAppWidgetHolder.setActivityResumed(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void logStopAndResume(boolean isResume) {
|
private void logStopAndResume(boolean isResume) {
|
||||||
@@ -1145,7 +1144,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
@Override
|
@Override
|
||||||
public void onStateSetEnd(LauncherState state) {
|
public void onStateSetEnd(LauncherState state) {
|
||||||
super.onStateSetEnd(state);
|
super.onStateSetEnd(state);
|
||||||
getAppWidgetHost().setStateIsNormal(state == LauncherState.NORMAL);
|
getAppWidgetHolder().setStateIsNormal(state == LauncherState.NORMAL);
|
||||||
getWorkspace().setClipChildren(!state.hasFlag(FLAG_MULTI_PAGE));
|
getWorkspace().setClipChildren(!state.hasFlag(FLAG_MULTI_PAGE));
|
||||||
|
|
||||||
finishAutoCancelActionMode();
|
finishAutoCancelActionMode();
|
||||||
@@ -1210,7 +1209,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
if (!mDeferOverlayCallbacks) {
|
if (!mDeferOverlayCallbacks) {
|
||||||
mOverlayManager.onActivityPaused(this);
|
mOverlayManager.onActivityPaused(this);
|
||||||
}
|
}
|
||||||
mAppWidgetHost.setActivityResumed(false);
|
mAppWidgetHolder.setActivityResumed(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1435,7 +1434,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
|
|
||||||
if (hostView == null) {
|
if (hostView == null) {
|
||||||
// Perform actual inflation because we're live
|
// Perform actual inflation because we're live
|
||||||
hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo);
|
hostView = mAppWidgetHolder.createView(this, appWidgetId, appWidgetInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
LauncherAppWidgetInfo launcherInfo;
|
LauncherAppWidgetInfo launcherInfo;
|
||||||
@@ -1566,12 +1565,12 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
return mScrimView;
|
return mScrimView;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LauncherAppWidgetHost getAppWidgetHost() {
|
public LauncherWidgetHolder getAppWidgetHolder() {
|
||||||
return mAppWidgetHost;
|
return mAppWidgetHolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected LauncherAppWidgetHost createAppWidgetHost() {
|
protected LauncherWidgetHolder createAppWidgetHolder() {
|
||||||
return new LauncherAppWidgetHost(this,
|
return new LauncherWidgetHolder(this,
|
||||||
appWidgetId -> getWorkspace().removeWidget(appWidgetId));
|
appWidgetId -> getWorkspace().removeWidget(appWidgetId));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1733,7 +1732,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
mRotationHelper.destroy();
|
mRotationHelper.destroy();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mAppWidgetHost.stopListening();
|
mAppWidgetHolder.stopListening();
|
||||||
} catch (NullPointerException ex) {
|
} catch (NullPointerException ex) {
|
||||||
Log.w(TAG, "problem while stopping AppWidgetHost during Launcher destruction", ex);
|
Log.w(TAG, "problem while stopping AppWidgetHost during Launcher destruction", ex);
|
||||||
}
|
}
|
||||||
@@ -1908,7 +1907,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
appWidgetId = CustomWidgetManager.INSTANCE.get(this).getWidgetIdForCustomProvider(
|
appWidgetId = CustomWidgetManager.INSTANCE.get(this).getWidgetIdForCustomProvider(
|
||||||
info.componentName);
|
info.componentName);
|
||||||
} else {
|
} else {
|
||||||
appWidgetId = getAppWidgetHost().allocateAppWidgetId();
|
appWidgetId = getAppWidgetHolder().allocateAppWidgetId();
|
||||||
}
|
}
|
||||||
Bundle options = info.bindOptions;
|
Bundle options = info.bindOptions;
|
||||||
|
|
||||||
@@ -2022,7 +2021,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
final LauncherAppWidgetInfo widgetInfo = (LauncherAppWidgetInfo) itemInfo;
|
final LauncherAppWidgetInfo widgetInfo = (LauncherAppWidgetInfo) itemInfo;
|
||||||
mWorkspace.removeWorkspaceItem(v);
|
mWorkspace.removeWorkspaceItem(v);
|
||||||
if (deleteFromDb) {
|
if (deleteFromDb) {
|
||||||
getModelWriter().deleteWidgetInfo(widgetInfo, getAppWidgetHost(), reason);
|
getModelWriter().deleteWidgetInfo(widgetInfo, getAppWidgetHolder(), reason);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
@@ -2280,7 +2279,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
|
|
||||||
mWorkspace.clearDropTargets();
|
mWorkspace.clearDropTargets();
|
||||||
mWorkspace.removeAllWorkspaceScreens();
|
mWorkspace.removeAllWorkspaceScreens();
|
||||||
mAppWidgetHost.clearViews();
|
mAppWidgetHolder.clearViews();
|
||||||
|
|
||||||
if (mHotseat != null) {
|
if (mHotseat != null) {
|
||||||
mHotseat.resetLayout(getDeviceProfile().isVerticalBarLayout());
|
mHotseat.resetLayout(getDeviceProfile().isVerticalBarLayout());
|
||||||
@@ -2587,7 +2586,7 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
if (item.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_ID_NOT_VALID)) {
|
if (item.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_ID_NOT_VALID)) {
|
||||||
if (!item.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_ID_ALLOCATED)) {
|
if (!item.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_ID_ALLOCATED)) {
|
||||||
// Id has not been allocated yet. Allocate a new id.
|
// Id has not been allocated yet. Allocate a new id.
|
||||||
item.appWidgetId = mAppWidgetHost.allocateAppWidgetId();
|
item.appWidgetId = mAppWidgetHolder.allocateAppWidgetId();
|
||||||
item.restoreStatus |= LauncherAppWidgetInfo.FLAG_ID_ALLOCATED;
|
item.restoreStatus |= LauncherAppWidgetInfo.FLAG_ID_ALLOCATED;
|
||||||
|
|
||||||
// Also try to bind the widget. If the bind fails, the user will be shown
|
// Also try to bind the widget. If the bind fails, the user will be shown
|
||||||
@@ -2649,18 +2648,18 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
// Verify that we own the widget
|
// Verify that we own the widget
|
||||||
if (appWidgetInfo == null) {
|
if (appWidgetInfo == null) {
|
||||||
FileLog.e(TAG, "Removing invalid widget: id=" + item.appWidgetId);
|
FileLog.e(TAG, "Removing invalid widget: id=" + item.appWidgetId);
|
||||||
getModelWriter().deleteWidgetInfo(item, getAppWidgetHost(), removalReason);
|
getModelWriter().deleteWidgetInfo(item, getAppWidgetHolder(), removalReason);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
item.minSpanX = appWidgetInfo.minSpanX;
|
item.minSpanX = appWidgetInfo.minSpanX;
|
||||||
item.minSpanY = appWidgetInfo.minSpanY;
|
item.minSpanY = appWidgetInfo.minSpanY;
|
||||||
view = mAppWidgetHost.createView(this, item.appWidgetId, appWidgetInfo);
|
view = mAppWidgetHolder.createView(this, item.appWidgetId, appWidgetInfo);
|
||||||
} else if (!item.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_ID_NOT_VALID)
|
} else if (!item.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_ID_NOT_VALID)
|
||||||
&& appWidgetInfo != null) {
|
&& appWidgetInfo != null) {
|
||||||
mAppWidgetHost.addPendingView(item.appWidgetId,
|
mAppWidgetHolder.addPendingView(item.appWidgetId,
|
||||||
new PendingAppWidgetHostView(this, item, mIconCache, false));
|
new PendingAppWidgetHostView(this, item, mIconCache, false));
|
||||||
view = mAppWidgetHost.createView(this, item.appWidgetId, appWidgetInfo);
|
view = mAppWidgetHolder.createView(this, item.appWidgetId, appWidgetInfo);
|
||||||
} else {
|
} else {
|
||||||
view = new PendingAppWidgetHostView(this, item, mIconCache, false);
|
view = new PendingAppWidgetHostView(this, item, mIconCache, false);
|
||||||
}
|
}
|
||||||
@@ -3018,7 +3017,8 @@ public class Launcher extends StatefulActivity<LauncherState>
|
|||||||
writer.println(prefix + "\tmPendingRequestArgs=" + mPendingRequestArgs
|
writer.println(prefix + "\tmPendingRequestArgs=" + mPendingRequestArgs
|
||||||
+ " mPendingActivityResult=" + mPendingActivityResult);
|
+ " mPendingActivityResult=" + mPendingActivityResult);
|
||||||
writer.println(prefix + "\tmRotationHelper: " + mRotationHelper);
|
writer.println(prefix + "\tmRotationHelper: " + mRotationHelper);
|
||||||
writer.println(prefix + "\tmAppWidgetHost.isListening: " + mAppWidgetHost.isListening());
|
writer.println(prefix + "\tmAppWidgetHolder.isListening: "
|
||||||
|
+ mAppWidgetHolder.isListening());
|
||||||
|
|
||||||
// Extra logging for general debugging
|
// Extra logging for general debugging
|
||||||
mDragLayer.dump(prefix, writer);
|
mDragLayer.dump(prefix, writer);
|
||||||
|
|||||||
@@ -0,0 +1,187 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2022 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.launcher3;
|
||||||
|
|
||||||
|
import android.appwidget.AppWidgetHostView;
|
||||||
|
import android.appwidget.AppWidgetProviderInfo;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.android.launcher3.uioverrides.ApiWrapper;
|
||||||
|
import com.android.launcher3.widget.LauncherAppWidgetHost;
|
||||||
|
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
|
||||||
|
import com.android.launcher3.widget.PendingAppWidgetHostView;
|
||||||
|
|
||||||
|
import java.util.function.IntConsumer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A wrapper for LauncherAppWidgetHost. This class is created so the AppWidgetHost could run in
|
||||||
|
* background.
|
||||||
|
*/
|
||||||
|
public class LauncherWidgetHolder {
|
||||||
|
@NonNull
|
||||||
|
private final LauncherAppWidgetHost mWidgetHost;
|
||||||
|
|
||||||
|
public LauncherWidgetHolder(@NonNull Context context) {
|
||||||
|
this(context, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public LauncherWidgetHolder(@NonNull Context context,
|
||||||
|
@Nullable IntConsumer appWidgetRemovedCallback) {
|
||||||
|
mWidgetHost = new LauncherAppWidgetHost(context, appWidgetRemovedCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts listening to the widget updates from the server side
|
||||||
|
*/
|
||||||
|
public void startListening() {
|
||||||
|
mWidgetHost.startListening();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the STARTED state of the widget host
|
||||||
|
* @param isStarted True if setting the host as started, false otherwise
|
||||||
|
*/
|
||||||
|
public void setActivityStarted(boolean isStarted) {
|
||||||
|
mWidgetHost.setActivityStarted(isStarted);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the RESUMED state of the widget host
|
||||||
|
* @param isResumed True if setting the host as resumed, false otherwise
|
||||||
|
*/
|
||||||
|
public void setActivityResumed(boolean isResumed) {
|
||||||
|
mWidgetHost.setActivityResumed(isResumed);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the NORMAL state of the widget host
|
||||||
|
* @param isNormal True if setting the host to be in normal state, false otherwise
|
||||||
|
*/
|
||||||
|
public void setStateIsNormal(boolean isNormal) {
|
||||||
|
mWidgetHost.setStateIsNormal(isNormal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete the specified app widget from the host
|
||||||
|
* @param appWidgetId The ID of the app widget to be deleted
|
||||||
|
*/
|
||||||
|
public void deleteAppWidgetId(int appWidgetId) {
|
||||||
|
mWidgetHost.deleteAppWidgetId(appWidgetId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the pending view to the host for complete configuration in further steps
|
||||||
|
* @param appWidgetId The ID of the specified app widget
|
||||||
|
* @param view The {@link PendingAppWidgetHostView} of the app widget
|
||||||
|
*/
|
||||||
|
public void addPendingView(int appWidgetId, @NonNull PendingAppWidgetHostView view) {
|
||||||
|
mWidgetHost.addPendingView(appWidgetId, view);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return True if the host is listening to the widget updates, false otherwise
|
||||||
|
*/
|
||||||
|
public boolean isListening() {
|
||||||
|
return mWidgetHost.isListening();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The allocated app widget id if allocation is successful, returns -1 otherwise
|
||||||
|
*/
|
||||||
|
public int allocateAppWidgetId() {
|
||||||
|
return mWidgetHost.allocateAppWidgetId();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a listener that is triggered when the providers of the widgets are changed
|
||||||
|
* @param listener The listener that notifies when the providers changed
|
||||||
|
*/
|
||||||
|
public void addProviderChangeListener(
|
||||||
|
@NonNull LauncherAppWidgetHost.ProviderChangedListener listener) {
|
||||||
|
mWidgetHost.addProviderChangeListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified listener from the host
|
||||||
|
* @param listener The listener that is to be removed from the host
|
||||||
|
*/
|
||||||
|
public void removeProviderChangeListener(
|
||||||
|
LauncherAppWidgetHost.ProviderChangedListener listener) {
|
||||||
|
mWidgetHost.removeProviderChangeListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the configuration activity for the widget
|
||||||
|
* @param activity The activity in which to start the configuration page
|
||||||
|
* @param widgetId The ID of the widget
|
||||||
|
* @param requestCode The request code
|
||||||
|
*/
|
||||||
|
public void startConfigActivity(@NonNull BaseDraggingActivity activity, int widgetId,
|
||||||
|
int requestCode) {
|
||||||
|
mWidgetHost.startConfigActivity(activity, widgetId, requestCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the binding flow for the widget
|
||||||
|
* @param activity The activity for which to bind the widget
|
||||||
|
* @param appWidgetId The ID of the widget
|
||||||
|
* @param info The {@link AppWidgetProviderInfo} of the widget
|
||||||
|
* @param requestCode The request code
|
||||||
|
*/
|
||||||
|
public void startBindFlow(@NonNull BaseActivity activity,
|
||||||
|
int appWidgetId, @NonNull AppWidgetProviderInfo info, int requestCode) {
|
||||||
|
mWidgetHost.startBindFlow(activity, appWidgetId, info, requestCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the host from listening to the widget updates
|
||||||
|
*/
|
||||||
|
public void stopListening() {
|
||||||
|
mWidgetHost.stopListening();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a view for the specified app widget
|
||||||
|
* @param context The activity context for which the view is created
|
||||||
|
* @param appWidgetId The ID of the widget
|
||||||
|
* @param info The {@link LauncherAppWidgetProviderInfo} of the widget
|
||||||
|
* @return A view for the widget
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public AppWidgetHostView createView(@NonNull Context context, int appWidgetId,
|
||||||
|
@NonNull LauncherAppWidgetProviderInfo info) {
|
||||||
|
return mWidgetHost.createView(context, appWidgetId, info);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the interaction handler for the widget host
|
||||||
|
* @param handler The interaction handler
|
||||||
|
*/
|
||||||
|
public void setInteractionHandler(
|
||||||
|
@Nullable LauncherAppWidgetHost.LauncherWidgetInteractionHandler handler) {
|
||||||
|
ApiWrapper.setHostInteractionHandler(mWidgetHost, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears all the views from the host
|
||||||
|
*/
|
||||||
|
public void clearViews() {
|
||||||
|
mWidgetHost.clearViews();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -288,7 +288,7 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList
|
|||||||
if (widgetId != INVALID_APPWIDGET_ID) {
|
if (widgetId != INVALID_APPWIDGET_ID) {
|
||||||
mLauncher.setWaitingForResult(
|
mLauncher.setWaitingForResult(
|
||||||
PendingRequestArgs.forWidgetInfo(widgetId, null, info));
|
PendingRequestArgs.forWidgetInfo(widgetId, null, info));
|
||||||
mLauncher.getAppWidgetHost().startConfigActivity(mLauncher, widgetId,
|
mLauncher.getAppWidgetHolder().startConfigActivity(mLauncher, widgetId,
|
||||||
REQUEST_RECONFIGURE_APPWIDGET);
|
REQUEST_RECONFIGURE_APPWIDGET);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -109,7 +109,6 @@ import com.android.launcher3.util.PackageUserKey;
|
|||||||
import com.android.launcher3.util.RunnableList;
|
import com.android.launcher3.util.RunnableList;
|
||||||
import com.android.launcher3.util.Thunk;
|
import com.android.launcher3.util.Thunk;
|
||||||
import com.android.launcher3.util.WallpaperOffsetInterpolator;
|
import com.android.launcher3.util.WallpaperOffsetInterpolator;
|
||||||
import com.android.launcher3.widget.LauncherAppWidgetHost;
|
|
||||||
import com.android.launcher3.widget.LauncherAppWidgetHost.ProviderChangedListener;
|
import com.android.launcher3.widget.LauncherAppWidgetHost.ProviderChangedListener;
|
||||||
import com.android.launcher3.widget.LauncherAppWidgetHostView;
|
import com.android.launcher3.widget.LauncherAppWidgetHostView;
|
||||||
import com.android.launcher3.widget.NavigableAppWidgetHostView;
|
import com.android.launcher3.widget.NavigableAppWidgetHostView;
|
||||||
@@ -3391,7 +3390,7 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T>
|
|||||||
public void widgetsRestored(final ArrayList<LauncherAppWidgetInfo> changedInfo) {
|
public void widgetsRestored(final ArrayList<LauncherAppWidgetInfo> changedInfo) {
|
||||||
if (!changedInfo.isEmpty()) {
|
if (!changedInfo.isEmpty()) {
|
||||||
DeferredWidgetRefresh widgetRefresh = new DeferredWidgetRefresh(changedInfo,
|
DeferredWidgetRefresh widgetRefresh = new DeferredWidgetRefresh(changedInfo,
|
||||||
mLauncher.getAppWidgetHost());
|
mLauncher.getAppWidgetHolder());
|
||||||
|
|
||||||
LauncherAppWidgetInfo item = changedInfo.get(0);
|
LauncherAppWidgetInfo item = changedInfo.get(0);
|
||||||
final AppWidgetProviderInfo widgetInfo;
|
final AppWidgetProviderInfo widgetInfo;
|
||||||
@@ -3517,19 +3516,19 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T>
|
|||||||
*/
|
*/
|
||||||
private class DeferredWidgetRefresh implements Runnable, ProviderChangedListener {
|
private class DeferredWidgetRefresh implements Runnable, ProviderChangedListener {
|
||||||
private final ArrayList<LauncherAppWidgetInfo> mInfos;
|
private final ArrayList<LauncherAppWidgetInfo> mInfos;
|
||||||
private final LauncherAppWidgetHost mHost;
|
private final LauncherWidgetHolder mWidgetHolder;
|
||||||
private final Handler mHandler;
|
private final Handler mHandler;
|
||||||
|
|
||||||
private boolean mRefreshPending;
|
private boolean mRefreshPending;
|
||||||
|
|
||||||
DeferredWidgetRefresh(ArrayList<LauncherAppWidgetInfo> infos,
|
DeferredWidgetRefresh(ArrayList<LauncherAppWidgetInfo> infos,
|
||||||
LauncherAppWidgetHost host) {
|
LauncherWidgetHolder holder) {
|
||||||
mInfos = infos;
|
mInfos = infos;
|
||||||
mHost = host;
|
mWidgetHolder = holder;
|
||||||
mHandler = mLauncher.mHandler;
|
mHandler = mLauncher.mHandler;
|
||||||
mRefreshPending = true;
|
mRefreshPending = true;
|
||||||
|
|
||||||
mHost.addProviderChangeListener(this);
|
mWidgetHolder.addProviderChangeListener(this);
|
||||||
// Force refresh after 10 seconds, if we don't get the provider changed event.
|
// Force refresh after 10 seconds, if we don't get the provider changed event.
|
||||||
// This could happen when the provider is no longer available in the app.
|
// This could happen when the provider is no longer available in the app.
|
||||||
Message msg = Message.obtain(mHandler, this);
|
Message msg = Message.obtain(mHandler, this);
|
||||||
@@ -3539,7 +3538,7 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
mHost.removeProviderChangeListener(this);
|
mWidgetHolder.removeProviderChangeListener(this);
|
||||||
mHandler.removeCallbacks(this);
|
mHandler.removeCallbacks(this);
|
||||||
|
|
||||||
if (!mRefreshPending) {
|
if (!mRefreshPending) {
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import com.android.launcher3.LauncherProvider;
|
|||||||
import com.android.launcher3.LauncherSettings;
|
import com.android.launcher3.LauncherSettings;
|
||||||
import com.android.launcher3.LauncherSettings.Favorites;
|
import com.android.launcher3.LauncherSettings.Favorites;
|
||||||
import com.android.launcher3.LauncherSettings.Settings;
|
import com.android.launcher3.LauncherSettings.Settings;
|
||||||
|
import com.android.launcher3.LauncherWidgetHolder;
|
||||||
import com.android.launcher3.Utilities;
|
import com.android.launcher3.Utilities;
|
||||||
import com.android.launcher3.config.FeatureFlags;
|
import com.android.launcher3.config.FeatureFlags;
|
||||||
import com.android.launcher3.logging.FileLog;
|
import com.android.launcher3.logging.FileLog;
|
||||||
@@ -48,7 +49,6 @@ import com.android.launcher3.util.ContentWriter;
|
|||||||
import com.android.launcher3.util.Executors;
|
import com.android.launcher3.util.Executors;
|
||||||
import com.android.launcher3.util.ItemInfoMatcher;
|
import com.android.launcher3.util.ItemInfoMatcher;
|
||||||
import com.android.launcher3.util.LooperExecutor;
|
import com.android.launcher3.util.LooperExecutor;
|
||||||
import com.android.launcher3.widget.LauncherAppWidgetHost;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -333,13 +333,13 @@ public class ModelWriter {
|
|||||||
/**
|
/**
|
||||||
* Deletes the widget info and the widget id.
|
* Deletes the widget info and the widget id.
|
||||||
*/
|
*/
|
||||||
public void deleteWidgetInfo(final LauncherAppWidgetInfo info, LauncherAppWidgetHost host,
|
public void deleteWidgetInfo(final LauncherAppWidgetInfo info, LauncherWidgetHolder holder,
|
||||||
@Nullable final String reason) {
|
@Nullable final String reason) {
|
||||||
notifyDelete(Collections.singleton(info));
|
notifyDelete(Collections.singleton(info));
|
||||||
if (host != null && !info.isCustomWidget() && info.isWidgetIdAllocated()) {
|
if (holder != null && !info.isCustomWidget() && info.isWidgetIdAllocated()) {
|
||||||
// Deleting an app widget ID is a void call but writes to disk before returning
|
// Deleting an app widget ID is a void call but writes to disk before returning
|
||||||
// to the caller...
|
// to the caller...
|
||||||
enqueueDeleteRunnable(() -> host.deleteAppWidgetId(info.appWidgetId));
|
enqueueDeleteRunnable(() -> holder.deleteAppWidgetId(info.appWidgetId));
|
||||||
}
|
}
|
||||||
deleteItemFromDatabase(info, reason);
|
deleteItemFromDatabase(info, reason);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ public class WidgetAddFlowHandler implements Parcelable {
|
|||||||
|
|
||||||
public void startBindFlow(Launcher launcher, int appWidgetId, ItemInfo info, int requestCode) {
|
public void startBindFlow(Launcher launcher, int appWidgetId, ItemInfo info, int requestCode) {
|
||||||
launcher.setWaitingForResult(PendingRequestArgs.forWidgetInfo(appWidgetId, this, info));
|
launcher.setWaitingForResult(PendingRequestArgs.forWidgetInfo(appWidgetId, this, info));
|
||||||
launcher.getAppWidgetHost()
|
launcher.getAppWidgetHolder()
|
||||||
.startBindFlow(launcher, appWidgetId, mProviderInfo, requestCode);
|
.startBindFlow(launcher, appWidgetId, mProviderInfo, requestCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ public class WidgetAddFlowHandler implements Parcelable {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
launcher.setWaitingForResult(PendingRequestArgs.forWidgetInfo(appWidgetId, this, info));
|
launcher.setWaitingForResult(PendingRequestArgs.forWidgetInfo(appWidgetId, this, info));
|
||||||
launcher.getAppWidgetHost().startConfigActivity(launcher, appWidgetId, requestCode);
|
launcher.getAppWidgetHolder().startConfigActivity(launcher, appWidgetId, requestCode);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public class WidgetHostViewLoader implements DragController.DragListener {
|
|||||||
|
|
||||||
// Cleanup widget id
|
// Cleanup widget id
|
||||||
if (mWidgetLoadingId != -1) {
|
if (mWidgetLoadingId != -1) {
|
||||||
mLauncher.getAppWidgetHost().deleteAppWidgetId(mWidgetLoadingId);
|
mLauncher.getAppWidgetHolder().deleteAppWidgetId(mWidgetLoadingId);
|
||||||
mWidgetLoadingId = -1;
|
mWidgetLoadingId = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ public class WidgetHostViewLoader implements DragController.DragListener {
|
|||||||
Log.d(TAG, "...removing widget from drag layer");
|
Log.d(TAG, "...removing widget from drag layer");
|
||||||
}
|
}
|
||||||
mLauncher.getDragLayer().removeView(mInfo.boundWidget);
|
mLauncher.getDragLayer().removeView(mInfo.boundWidget);
|
||||||
mLauncher.getAppWidgetHost().deleteAppWidgetId(mInfo.boundWidget.getAppWidgetId());
|
mLauncher.getAppWidgetHolder().deleteAppWidgetId(mInfo.boundWidget.getAppWidgetId());
|
||||||
mInfo.boundWidget = null;
|
mInfo.boundWidget = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -94,7 +94,7 @@ public class WidgetHostViewLoader implements DragController.DragListener {
|
|||||||
mBindWidgetRunnable = new Runnable() {
|
mBindWidgetRunnable = new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
mWidgetLoadingId = mLauncher.getAppWidgetHost().allocateAppWidgetId();
|
mWidgetLoadingId = mLauncher.getAppWidgetHolder().allocateAppWidgetId();
|
||||||
if (LOGD) {
|
if (LOGD) {
|
||||||
Log.d(TAG, "Binding widget, id: " + mWidgetLoadingId);
|
Log.d(TAG, "Binding widget, id: " + mWidgetLoadingId);
|
||||||
}
|
}
|
||||||
@@ -116,7 +116,7 @@ public class WidgetHostViewLoader implements DragController.DragListener {
|
|||||||
if (mWidgetLoadingId == -1) {
|
if (mWidgetLoadingId == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
AppWidgetHostView hostView = mLauncher.getAppWidgetHost().createView(
|
AppWidgetHostView hostView = mLauncher.getAppWidgetHolder().createView(
|
||||||
(Context) mLauncher, mWidgetLoadingId, pInfo);
|
(Context) mLauncher, mWidgetLoadingId, pInfo);
|
||||||
mInfo.boundWidget = hostView;
|
mInfo.boundWidget = hostView;
|
||||||
|
|
||||||
|
|||||||
@@ -321,7 +321,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet
|
|||||||
@Override
|
@Override
|
||||||
protected void onAttachedToWindow() {
|
protected void onAttachedToWindow() {
|
||||||
super.onAttachedToWindow();
|
super.onAttachedToWindow();
|
||||||
mActivityContext.getAppWidgetHost().addProviderChangeListener(this);
|
mActivityContext.getAppWidgetHolder().addProviderChangeListener(this);
|
||||||
notifyWidgetProvidersChanged();
|
notifyWidgetProvidersChanged();
|
||||||
onRecommendedWidgetsBound();
|
onRecommendedWidgetsBound();
|
||||||
}
|
}
|
||||||
@@ -329,7 +329,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet
|
|||||||
@Override
|
@Override
|
||||||
protected void onDetachedFromWindow() {
|
protected void onDetachedFromWindow() {
|
||||||
super.onDetachedFromWindow();
|
super.onDetachedFromWindow();
|
||||||
mActivityContext.getAppWidgetHost().removeProviderChangeListener(this);
|
mActivityContext.getAppWidgetHolder().removeProviderChangeListener(this);
|
||||||
mAdapters.get(AdapterHolder.PRIMARY).mWidgetsRecyclerView
|
mAdapters.get(AdapterHolder.PRIMARY).mWidgetsRecyclerView
|
||||||
.removeOnAttachStateChangeListener(mBindScrollbarInSearchMode);
|
.removeOnAttachStateChangeListener(mBindScrollbarInSearchMode);
|
||||||
if (mHasWorkProfile) {
|
if (mHasWorkProfile) {
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ public class BindWidgetTest extends AbstractLauncherUiTest {
|
|||||||
waitForLauncherCondition("App widget options did not update",
|
waitForLauncherCondition("App widget options did not update",
|
||||||
l -> appWidgetManager.getAppWidgetOptions(appWidgetId).getBoolean(
|
l -> appWidgetManager.getAppWidgetOptions(appWidgetId).getBoolean(
|
||||||
WidgetManagerHelper.WIDGET_OPTION_RESTORE_COMPLETED));
|
WidgetManagerHelper.WIDGET_OPTION_RESTORE_COMPLETED));
|
||||||
executeOnLauncher(l -> l.getAppWidgetHost().startListening());
|
executeOnLauncher(l -> l.getAppWidgetHolder().startListening());
|
||||||
verifyWidgetPresent(info);
|
verifyWidgetPresent(info);
|
||||||
assertNull(mLauncher.getWorkspace().tryGetPendingWidget(100));
|
assertNull(mLauncher.getWorkspace().tryGetPendingWidget(100));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user