Loading aconfig/launcher.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,9 @@ flag { namespace: "launcher" description: "Enables full width two pane widget picker for tablets in landscape and portrait" bug: "315055849" metadata { purpose: PURPOSE_BUGFIX } } flag { Loading Loading @@ -163,6 +166,13 @@ flag { bug: "318410881" } flag { name: "enable_add_app_widget_via_config_activity_v2" namespace: "launcher" description: "When adding app widget through config activity, directly add it to workspace to reduce flicker" bug: "284236964" } flag { name: "use_activity_overlay" namespace: "launcher" Loading src/com/android/launcher3/Launcher.java +106 −31 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import static com.android.launcher3.AbstractFloatingView.TYPE_FOLDER; import static com.android.launcher3.AbstractFloatingView.TYPE_ICON_SURFACE; import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE; import static com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType; import static com.android.launcher3.Flags.enableAddAppWidgetViaConfigActivityV2; import static com.android.launcher3.LauncherAnimUtils.HOTSEAT_SCALE_PROPERTY_FACTORY; import static com.android.launcher3.LauncherAnimUtils.SCALE_INDEX_WIDGET_TRANSITION; import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; Loading Loading @@ -116,6 +117,8 @@ import android.content.IntentSender; import android.content.SharedPreferences; import android.content.res.Configuration; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Rect; import android.graphics.RectF; Loading Loading @@ -828,7 +831,7 @@ public class Launcher extends StatefulActivity<LauncherState> announceForAccessibility(R.string.item_added_to_workspace); break; case REQUEST_CREATE_APPWIDGET: completeAddAppWidget(appWidgetId, info, null, null); completeAddAppWidget(appWidgetId, info, null, null, false, null); break; case REQUEST_RECONFIGURE_APPWIDGET: getStatsLogManager().logger().withItemInfo(info).log(LAUNCHER_WIDGET_RECONFIGURED); Loading Loading @@ -1015,11 +1018,18 @@ public class Launcher extends StatefulActivity<LauncherState> AppWidgetHostView boundWidget = null; if (resultCode == RESULT_OK) { animationType = Workspace.COMPLETE_TWO_STAGE_WIDGET_DROP_ANIMATION; final AppWidgetHostView layout = mAppWidgetHolder.createView(appWidgetId, // Now that we are exiting the config activity with RESULT_OK. // If FLAG_ENABLE_ADD_APP_WIDGET_VIA_CONFIG_ACTIVITY_V2 is enabled, we can retrieve the // PendingAppWidgetHostView from LauncherWidgetHolder (it was added to // LauncherWidgetHolder when starting the config activity). final AppWidgetHostView layout = enableAddAppWidgetViaConfigActivityV2() ? getWorkspace().getWidgetForAppWidgetId(appWidgetId) : mAppWidgetHolder.createView(appWidgetId, requestArgs.getWidgetHandler().getProviderInfo(this)); boundWidget = layout; onCompleteRunnable = () -> { completeAddAppWidget(appWidgetId, requestArgs, layout, null); completeAddAppWidget(appWidgetId, requestArgs, layout, null, false, null); if (!isInState(EDIT_MODE)) { mStateManager.goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); } Loading Loading @@ -1449,14 +1459,15 @@ public class Launcher extends StatefulActivity<LauncherState> */ @Thunk void completeAddAppWidget(int appWidgetId, ItemInfo itemInfo, AppWidgetHostView hostView, LauncherAppWidgetProviderInfo appWidgetInfo) { @Nullable AppWidgetHostView hostView, LauncherAppWidgetProviderInfo appWidgetInfo, boolean showPendingWidget, @Nullable Bitmap widgetPreviewBitmap) { if (appWidgetInfo == null) { appWidgetInfo = mAppWidgetManager.getLauncherAppWidgetInfo(appWidgetId, itemInfo.getTargetComponent()); } if (hostView == null) { if (hostView == null && !showPendingWidget) { // Perform actual inflation because we're live hostView = mAppWidgetHolder.createView(appWidgetId, appWidgetInfo); } Loading @@ -1470,24 +1481,57 @@ public class Launcher extends StatefulActivity<LauncherState> launcherInfo.minSpanX = itemInfo.minSpanX; launcherInfo.minSpanY = itemInfo.minSpanY; launcherInfo.user = appWidgetInfo.getProfile(); CellPos presenterPos = getCellPosMapper().mapModelToPresenter(itemInfo); if (showPendingWidget) { launcherInfo.restoreStatus = LauncherAppWidgetInfo.FLAG_UI_NOT_READY; PendingAppWidgetHostView pendingAppWidgetHostView = new PendingAppWidgetHostView(this, launcherInfo, appWidgetInfo); pendingAppWidgetHostView.setPreviewBitmap(widgetPreviewBitmap); hostView = pendingAppWidgetHostView; } else if (hostView instanceof PendingAppWidgetHostView) { ((PendingAppWidgetHostView) hostView).setPreviewBitmap(null); // User has selected a widget config and exited the config activity, we can trigger // re-inflation of PendingAppWidgetHostView to replace it with // LauncherAppWidgetHostView in workspace. completeRestoreAppWidget(appWidgetId, LauncherAppWidgetInfo.RESTORE_COMPLETED); // Show resize frame on the newly inflated LauncherAppWidgetHostView. LauncherAppWidgetHostView reInflatedHostView = getWorkspace().getWidgetForAppWidgetId(appWidgetId); showWidgetResizeFrame( reInflatedHostView, (LauncherAppWidgetInfo) reInflatedHostView.getTag(), presenterPos); return; } if (itemInfo instanceof PendingAddWidgetInfo) { launcherInfo.sourceContainer = ((PendingAddWidgetInfo) itemInfo).sourceContainer; } else if (itemInfo instanceof PendingRequestArgs) { launcherInfo.sourceContainer = ((PendingRequestArgs) itemInfo).getWidgetSourceContainer(); } CellPos presenterPos = getCellPosMapper().mapModelToPresenter(itemInfo); getModelWriter().addItemToDatabase(launcherInfo, itemInfo.container, presenterPos.screenId, presenterPos.cellX, presenterPos.cellY); hostView.setVisibility(View.VISIBLE); mItemInflater.prepareAppWidget(hostView, launcherInfo); if (!enableAddAppWidgetViaConfigActivityV2() || hostView.getParent() == null) { mWorkspace.addInScreen(hostView, launcherInfo); } announceForAccessibility(R.string.item_added_to_workspace); // Show the widget resize frame. if (hostView instanceof LauncherAppWidgetHostView) { final LauncherAppWidgetHostView launcherHostView = (LauncherAppWidgetHostView) hostView; showWidgetResizeFrame(launcherHostView, launcherInfo, presenterPos); } } /** Show widget resize frame. */ private void showWidgetResizeFrame( LauncherAppWidgetHostView launcherHostView, LauncherAppWidgetInfo launcherInfo, CellPos presenterPos) { CellLayout cellLayout = getCellLayout(launcherInfo.container, presenterPos.screenId); if (mStateManager.getState() == NORMAL) { AppWidgetResizeFrame.showForWidget(launcherHostView, cellLayout); Loading @@ -1504,7 +1548,6 @@ public class Launcher extends StatefulActivity<LauncherState> }); } } } private final ScreenOnListener mScreenOnListener = this::onScreenOnChanged; Loading Loading @@ -1759,20 +1802,40 @@ public class Launcher extends StatefulActivity<LauncherState> addAppWidgetImpl(appWidgetId, info, boundWidget, addFlowHandler, 0); } /** * If FLAG_ENABLE_ADD_APP_WIDGET_VIA_CONFIG_ACTIVITY_V2 is enabled, we always add widget * host view to workspace, otherwise we only add widget to host view if config activity is * not started. */ void addAppWidgetImpl(int appWidgetId, ItemInfo info, AppWidgetHostView boundWidget, WidgetAddFlowHandler addFlowHandler, int delay) { if (!addFlowHandler.startConfigActivity(this, appWidgetId, info, REQUEST_CREATE_APPWIDGET)) { // If the configuration flow was not started, add the widget final boolean isActivityStarted = addFlowHandler.startConfigActivity( this, appWidgetId, info, REQUEST_CREATE_APPWIDGET); if (!enableAddAppWidgetViaConfigActivityV2() && isActivityStarted) { return; } // If FLAG_ENABLE_ADD_APP_WIDGET_VIA_CONFIG_ACTIVITY_V2 is enabled and config activity is // started, we should remove the dropped AppWidgetHostView from drag layer and extract the // Bitmap that shows the preview. Then pass the Bitmap to completeAddAppWidget() to create // a PendingWidgetHostView. Bitmap widgetPreviewBitmap = null; if (isActivityStarted) { DragView dropView = getDragLayer().clearAnimatedView(); if (dropView != null && dropView.containsAppWidgetHostView()) { widgetPreviewBitmap = getBitmapFromView(dropView.getContentView()); } } // Exit spring loaded mode if necessary after adding the widget Runnable onComplete = MULTI_SELECT_EDIT_MODE.get() ? null : () -> mStateManager.goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); completeAddAppWidget(appWidgetId, info, boundWidget, addFlowHandler.getProviderInfo(this)); addFlowHandler.getProviderInfo(this), addFlowHandler.needsConfigure(), widgetPreviewBitmap); mWorkspace.removeExtraEmptyScreenDelayed(delay, false, onComplete); } } public void addPendingItem(PendingAddItemInfo info, int container, int screenId, int[] cell, int spanX, int spanY) { Loading Loading @@ -2366,6 +2429,18 @@ public class Launcher extends StatefulActivity<LauncherState> return null; } /** Convert a {@link View} to {@link Bitmap}. */ private static Bitmap getBitmapFromView(@Nullable View view) { if (view == null) { return null; } Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(returnedBitmap); view.draw(canvas); return returnedBitmap; } /** * Returns the first view matching the operator in the given ViewGroups, or null if none. * Forward iteration matters. Loading src/com/android/launcher3/Workspace.java +1 −1 Original line number Diff line number Diff line Loading @@ -2988,7 +2988,7 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T> } public void animateWidgetDrop(ItemInfo info, CellLayout cellLayout, final DragView dragView, final Runnable onCompleteRunnable, int animationType, final View finalView, final Runnable onCompleteRunnable, int animationType, @Nullable final View finalView, boolean external) { int[] finalPos = new int[2]; float scaleXY[] = new float[2]; Loading src/com/android/launcher3/dragndrop/DragLayer.java +11 −1 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.animation.Interpolator; import androidx.annotation.Nullable; import com.android.app.animation.Interpolators; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DropTargetBar; Loading Loading @@ -388,7 +390,13 @@ public class DragLayer extends BaseDragLayer<Launcher> implements LauncherOverla mDropAnim.start(); } public void clearAnimatedView() { /** * Remove the drop view and end the drag animation. * * @return {@link DragView} that is removed. */ @Nullable public DragView clearAnimatedView() { if (mDropAnim != null) { mDropAnim.cancel(); } Loading @@ -396,8 +404,10 @@ public class DragLayer extends BaseDragLayer<Launcher> implements LauncherOverla if (mDropView != null) { mDragController.onDeferredEndDrag(mDropView); } DragView ret = mDropView; mDropView = null; invalidate(); return ret; } public View getAnimatedView() { Loading src/com/android/launcher3/dragndrop/DragView.java +6 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.TargetApi; import android.appwidget.AppWidgetHostView; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; Loading Loading @@ -563,6 +564,11 @@ public abstract class DragView<T extends Context & ActivityContext> extends Fram return mContentViewParent; } /** Return true if {@link mContent} is a {@link AppWidgetHostView}. */ public boolean containsAppWidgetHostView() { return mContent instanceof AppWidgetHostView; } private static class SpringFloatValue { private static final FloatPropertyCompat<SpringFloatValue> VALUE = Loading Loading
aconfig/launcher.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,9 @@ flag { namespace: "launcher" description: "Enables full width two pane widget picker for tablets in landscape and portrait" bug: "315055849" metadata { purpose: PURPOSE_BUGFIX } } flag { Loading Loading @@ -163,6 +166,13 @@ flag { bug: "318410881" } flag { name: "enable_add_app_widget_via_config_activity_v2" namespace: "launcher" description: "When adding app widget through config activity, directly add it to workspace to reduce flicker" bug: "284236964" } flag { name: "use_activity_overlay" namespace: "launcher" Loading
src/com/android/launcher3/Launcher.java +106 −31 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import static com.android.launcher3.AbstractFloatingView.TYPE_FOLDER; import static com.android.launcher3.AbstractFloatingView.TYPE_ICON_SURFACE; import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE; import static com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType; import static com.android.launcher3.Flags.enableAddAppWidgetViaConfigActivityV2; import static com.android.launcher3.LauncherAnimUtils.HOTSEAT_SCALE_PROPERTY_FACTORY; import static com.android.launcher3.LauncherAnimUtils.SCALE_INDEX_WIDGET_TRANSITION; import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; Loading Loading @@ -116,6 +117,8 @@ import android.content.IntentSender; import android.content.SharedPreferences; import android.content.res.Configuration; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Rect; import android.graphics.RectF; Loading Loading @@ -828,7 +831,7 @@ public class Launcher extends StatefulActivity<LauncherState> announceForAccessibility(R.string.item_added_to_workspace); break; case REQUEST_CREATE_APPWIDGET: completeAddAppWidget(appWidgetId, info, null, null); completeAddAppWidget(appWidgetId, info, null, null, false, null); break; case REQUEST_RECONFIGURE_APPWIDGET: getStatsLogManager().logger().withItemInfo(info).log(LAUNCHER_WIDGET_RECONFIGURED); Loading Loading @@ -1015,11 +1018,18 @@ public class Launcher extends StatefulActivity<LauncherState> AppWidgetHostView boundWidget = null; if (resultCode == RESULT_OK) { animationType = Workspace.COMPLETE_TWO_STAGE_WIDGET_DROP_ANIMATION; final AppWidgetHostView layout = mAppWidgetHolder.createView(appWidgetId, // Now that we are exiting the config activity with RESULT_OK. // If FLAG_ENABLE_ADD_APP_WIDGET_VIA_CONFIG_ACTIVITY_V2 is enabled, we can retrieve the // PendingAppWidgetHostView from LauncherWidgetHolder (it was added to // LauncherWidgetHolder when starting the config activity). final AppWidgetHostView layout = enableAddAppWidgetViaConfigActivityV2() ? getWorkspace().getWidgetForAppWidgetId(appWidgetId) : mAppWidgetHolder.createView(appWidgetId, requestArgs.getWidgetHandler().getProviderInfo(this)); boundWidget = layout; onCompleteRunnable = () -> { completeAddAppWidget(appWidgetId, requestArgs, layout, null); completeAddAppWidget(appWidgetId, requestArgs, layout, null, false, null); if (!isInState(EDIT_MODE)) { mStateManager.goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); } Loading Loading @@ -1449,14 +1459,15 @@ public class Launcher extends StatefulActivity<LauncherState> */ @Thunk void completeAddAppWidget(int appWidgetId, ItemInfo itemInfo, AppWidgetHostView hostView, LauncherAppWidgetProviderInfo appWidgetInfo) { @Nullable AppWidgetHostView hostView, LauncherAppWidgetProviderInfo appWidgetInfo, boolean showPendingWidget, @Nullable Bitmap widgetPreviewBitmap) { if (appWidgetInfo == null) { appWidgetInfo = mAppWidgetManager.getLauncherAppWidgetInfo(appWidgetId, itemInfo.getTargetComponent()); } if (hostView == null) { if (hostView == null && !showPendingWidget) { // Perform actual inflation because we're live hostView = mAppWidgetHolder.createView(appWidgetId, appWidgetInfo); } Loading @@ -1470,24 +1481,57 @@ public class Launcher extends StatefulActivity<LauncherState> launcherInfo.minSpanX = itemInfo.minSpanX; launcherInfo.minSpanY = itemInfo.minSpanY; launcherInfo.user = appWidgetInfo.getProfile(); CellPos presenterPos = getCellPosMapper().mapModelToPresenter(itemInfo); if (showPendingWidget) { launcherInfo.restoreStatus = LauncherAppWidgetInfo.FLAG_UI_NOT_READY; PendingAppWidgetHostView pendingAppWidgetHostView = new PendingAppWidgetHostView(this, launcherInfo, appWidgetInfo); pendingAppWidgetHostView.setPreviewBitmap(widgetPreviewBitmap); hostView = pendingAppWidgetHostView; } else if (hostView instanceof PendingAppWidgetHostView) { ((PendingAppWidgetHostView) hostView).setPreviewBitmap(null); // User has selected a widget config and exited the config activity, we can trigger // re-inflation of PendingAppWidgetHostView to replace it with // LauncherAppWidgetHostView in workspace. completeRestoreAppWidget(appWidgetId, LauncherAppWidgetInfo.RESTORE_COMPLETED); // Show resize frame on the newly inflated LauncherAppWidgetHostView. LauncherAppWidgetHostView reInflatedHostView = getWorkspace().getWidgetForAppWidgetId(appWidgetId); showWidgetResizeFrame( reInflatedHostView, (LauncherAppWidgetInfo) reInflatedHostView.getTag(), presenterPos); return; } if (itemInfo instanceof PendingAddWidgetInfo) { launcherInfo.sourceContainer = ((PendingAddWidgetInfo) itemInfo).sourceContainer; } else if (itemInfo instanceof PendingRequestArgs) { launcherInfo.sourceContainer = ((PendingRequestArgs) itemInfo).getWidgetSourceContainer(); } CellPos presenterPos = getCellPosMapper().mapModelToPresenter(itemInfo); getModelWriter().addItemToDatabase(launcherInfo, itemInfo.container, presenterPos.screenId, presenterPos.cellX, presenterPos.cellY); hostView.setVisibility(View.VISIBLE); mItemInflater.prepareAppWidget(hostView, launcherInfo); if (!enableAddAppWidgetViaConfigActivityV2() || hostView.getParent() == null) { mWorkspace.addInScreen(hostView, launcherInfo); } announceForAccessibility(R.string.item_added_to_workspace); // Show the widget resize frame. if (hostView instanceof LauncherAppWidgetHostView) { final LauncherAppWidgetHostView launcherHostView = (LauncherAppWidgetHostView) hostView; showWidgetResizeFrame(launcherHostView, launcherInfo, presenterPos); } } /** Show widget resize frame. */ private void showWidgetResizeFrame( LauncherAppWidgetHostView launcherHostView, LauncherAppWidgetInfo launcherInfo, CellPos presenterPos) { CellLayout cellLayout = getCellLayout(launcherInfo.container, presenterPos.screenId); if (mStateManager.getState() == NORMAL) { AppWidgetResizeFrame.showForWidget(launcherHostView, cellLayout); Loading @@ -1504,7 +1548,6 @@ public class Launcher extends StatefulActivity<LauncherState> }); } } } private final ScreenOnListener mScreenOnListener = this::onScreenOnChanged; Loading Loading @@ -1759,20 +1802,40 @@ public class Launcher extends StatefulActivity<LauncherState> addAppWidgetImpl(appWidgetId, info, boundWidget, addFlowHandler, 0); } /** * If FLAG_ENABLE_ADD_APP_WIDGET_VIA_CONFIG_ACTIVITY_V2 is enabled, we always add widget * host view to workspace, otherwise we only add widget to host view if config activity is * not started. */ void addAppWidgetImpl(int appWidgetId, ItemInfo info, AppWidgetHostView boundWidget, WidgetAddFlowHandler addFlowHandler, int delay) { if (!addFlowHandler.startConfigActivity(this, appWidgetId, info, REQUEST_CREATE_APPWIDGET)) { // If the configuration flow was not started, add the widget final boolean isActivityStarted = addFlowHandler.startConfigActivity( this, appWidgetId, info, REQUEST_CREATE_APPWIDGET); if (!enableAddAppWidgetViaConfigActivityV2() && isActivityStarted) { return; } // If FLAG_ENABLE_ADD_APP_WIDGET_VIA_CONFIG_ACTIVITY_V2 is enabled and config activity is // started, we should remove the dropped AppWidgetHostView from drag layer and extract the // Bitmap that shows the preview. Then pass the Bitmap to completeAddAppWidget() to create // a PendingWidgetHostView. Bitmap widgetPreviewBitmap = null; if (isActivityStarted) { DragView dropView = getDragLayer().clearAnimatedView(); if (dropView != null && dropView.containsAppWidgetHostView()) { widgetPreviewBitmap = getBitmapFromView(dropView.getContentView()); } } // Exit spring loaded mode if necessary after adding the widget Runnable onComplete = MULTI_SELECT_EDIT_MODE.get() ? null : () -> mStateManager.goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); completeAddAppWidget(appWidgetId, info, boundWidget, addFlowHandler.getProviderInfo(this)); addFlowHandler.getProviderInfo(this), addFlowHandler.needsConfigure(), widgetPreviewBitmap); mWorkspace.removeExtraEmptyScreenDelayed(delay, false, onComplete); } } public void addPendingItem(PendingAddItemInfo info, int container, int screenId, int[] cell, int spanX, int spanY) { Loading Loading @@ -2366,6 +2429,18 @@ public class Launcher extends StatefulActivity<LauncherState> return null; } /** Convert a {@link View} to {@link Bitmap}. */ private static Bitmap getBitmapFromView(@Nullable View view) { if (view == null) { return null; } Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(returnedBitmap); view.draw(canvas); return returnedBitmap; } /** * Returns the first view matching the operator in the given ViewGroups, or null if none. * Forward iteration matters. Loading
src/com/android/launcher3/Workspace.java +1 −1 Original line number Diff line number Diff line Loading @@ -2988,7 +2988,7 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T> } public void animateWidgetDrop(ItemInfo info, CellLayout cellLayout, final DragView dragView, final Runnable onCompleteRunnable, int animationType, final View finalView, final Runnable onCompleteRunnable, int animationType, @Nullable final View finalView, boolean external) { int[] finalPos = new int[2]; float scaleXY[] = new float[2]; Loading
src/com/android/launcher3/dragndrop/DragLayer.java +11 −1 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.animation.Interpolator; import androidx.annotation.Nullable; import com.android.app.animation.Interpolators; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DropTargetBar; Loading Loading @@ -388,7 +390,13 @@ public class DragLayer extends BaseDragLayer<Launcher> implements LauncherOverla mDropAnim.start(); } public void clearAnimatedView() { /** * Remove the drop view and end the drag animation. * * @return {@link DragView} that is removed. */ @Nullable public DragView clearAnimatedView() { if (mDropAnim != null) { mDropAnim.cancel(); } Loading @@ -396,8 +404,10 @@ public class DragLayer extends BaseDragLayer<Launcher> implements LauncherOverla if (mDropView != null) { mDragController.onDeferredEndDrag(mDropView); } DragView ret = mDropView; mDropView = null; invalidate(); return ret; } public View getAnimatedView() { Loading
src/com/android/launcher3/dragndrop/DragView.java +6 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.TargetApi; import android.appwidget.AppWidgetHostView; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; Loading Loading @@ -563,6 +564,11 @@ public abstract class DragView<T extends Context & ActivityContext> extends Fram return mContentViewParent; } /** Return true if {@link mContent} is a {@link AppWidgetHostView}. */ public boolean containsAppWidgetHostView() { return mContent instanceof AppWidgetHostView; } private static class SpringFloatValue { private static final FloatPropertyCompat<SpringFloatValue> VALUE = Loading