Loading res/values/config.xml +5 −0 Original line number Diff line number Diff line Loading @@ -90,6 +90,7 @@ <string name="wallpaper_picker_package" translatable="false"></string> <string name="calendar_component_name" translatable="false"></string> <string name="clock_component_name" translatable="false"></string> <string name="local_colors_extraction_class" translatable="false"></string> <!-- Accessibility actions --> <item type="id" name="action_remove" /> Loading Loading @@ -188,4 +189,8 @@ </string-array> <string-array name="filtered_components" ></string-array> <!-- Name of the class used to generate colors from the wallpaper colors. Must be implementing the LauncherAppWidgetHostView.ColorGenerator interface. --> <string name="color_generator_class" translatable="false"/> </resources> src/com/android/launcher3/Workspace.java +10 −2 Original line number Diff line number Diff line Loading @@ -186,7 +186,6 @@ public class Workspace extends PagedView<WorkspacePageIndicator> @Thunk final Launcher mLauncher; @Thunk DragController mDragController; private final Rect mTempRect = new Rect(); private final int[] mTempXY = new int[2]; private final float[] mTempFXY = new float[2]; @Thunk float[] mDragViewVisualCenter = new float[2]; Loading Loading @@ -367,10 +366,19 @@ public class Workspace extends PagedView<WorkspacePageIndicator> } public float getWallpaperOffsetForCenterPage() { int pageScroll = getScrollForPage(getPageNearestToCenterOfScreen()); return getWallpaperOffsetForPage(getPageNearestToCenterOfScreen()); } private float getWallpaperOffsetForPage(int page) { int pageScroll = getScrollForPage(page); return mWallpaperOffset.wallpaperOffsetForScroll(pageScroll); } /** Returns the number of pages used for the wallpaper parallax. */ public int getNumPagesForWallpaperParallax() { return mWallpaperOffset.getNumPagesForWallpaperParallax(); } public Rect estimateItemPosition(CellLayout cl, int hCell, int vCell, int hSpan, int vSpan) { Rect r = new Rect(); cl.cellToRect(hCell, vCell, hSpan, vSpan, r); Loading src/com/android/launcher3/settings/DeveloperOptionsFragment.java +0 −1 Original line number Diff line number Diff line Loading @@ -88,7 +88,6 @@ public class DeveloperOptionsFragment extends PreferenceFragmentCompat { private PreferenceCategory mPluginsCategory; private FlagTogglerPrefUi mFlagTogglerPrefUi; @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); Loading src/com/android/launcher3/util/WallpaperOffsetInterpolator.java +8 −5 Original line number Diff line number Diff line Loading @@ -145,14 +145,17 @@ public class WallpaperOffsetInterpolator extends BroadcastReceiver { msg.sendToTarget(); } private void updateOffset() { int numPagesForWallpaperParallax; /** Returns the number of pages used for the wallpaper parallax. */ public int getNumPagesForWallpaperParallax() { if (mWallpaperIsLiveWallpaper) { numPagesForWallpaperParallax = mNumScreens; return mNumScreens; } else { numPagesForWallpaperParallax = Math.max(MIN_PARALLAX_PAGE_SPAN, mNumScreens); return Math.max(MIN_PARALLAX_PAGE_SPAN, mNumScreens); } } Message.obtain(mHandler, MSG_SET_NUM_PARALLAX, numPagesForWallpaperParallax, 0, private void updateOffset() { Message.obtain(mHandler, MSG_SET_NUM_PARALLAX, getNumPagesForWallpaperParallax(), 0, mWindowToken).sendToTarget(); } Loading src/com/android/launcher3/widget/LauncherAppWidgetHostView.java +119 −1 Original line number Diff line number Diff line Loading @@ -16,12 +16,17 @@ package com.android.launcher3.widget; import android.app.WallpaperManager; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; import android.graphics.RectF; import android.os.Handler; import android.os.SystemClock; import android.util.Log; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; Loading @@ -32,10 +37,13 @@ import android.widget.AdapterView; import android.widget.Advanceable; import android.widget.RemoteViews; import androidx.annotation.Nullable; import com.android.launcher3.CheckLongPressHelper; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.LauncherAppWidgetInfo; Loading @@ -43,11 +51,16 @@ import com.android.launcher3.util.Executors; import com.android.launcher3.util.Themes; import com.android.launcher3.views.BaseDragLayer.TouchCompleteListener; import java.util.List; /** * {@inheritDoc} */ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView implements TouchCompleteListener, View.OnLongClickListener { implements TouchCompleteListener, View.OnLongClickListener, LocalColorExtractor.Listener { private static final String LOG_TAG = "LauncherAppWidgetHostView"; // Related to the auto-advancing of widgets private static final long ADVANCE_INTERVAL = 20000; Loading @@ -60,18 +73,29 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView private final CheckLongPressHelper mLongPressHelper; protected final Launcher mLauncher; private final Workspace mWorkspace; private final WallpaperManager mWallpaperManager; @ViewDebug.ExportedProperty(category = "launcher") private boolean mReinflateOnConfigChange; // Maintain the color manager. private final LocalColorExtractor mColorExtractor; private boolean mIsScrollable; private boolean mIsAttachedToWindow; private boolean mIsAutoAdvanceRegistered; private Runnable mAutoAdvanceRunnable; private RectF mLastLocationRegistered = null; // Used to store the widget size during onLayout. private final Rect mCurrentWidgetSize = new Rect(); private final RectF mTempRectF = new RectF(); private final boolean mIsRtl; public LauncherAppWidgetHostView(Context context) { super(context); mLauncher = Launcher.getLauncher(context); mWorkspace = mLauncher.getWorkspace(); mLongPressHelper = new CheckLongPressHelper(this, this); mInflater = LayoutInflater.from(context); setAccessibilityDelegate(mLauncher.getAccessibilityDelegate()); Loading @@ -81,6 +105,19 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView if (Utilities.ATLEAST_Q && Themes.getAttrBoolean(mLauncher, R.attr.isWorkspaceDarkText)) { setOnLightBackground(true); } mIsRtl = Utilities.isRtl(context.getResources()); mWallpaperManager = WallpaperManager.getInstance(getContext()); mColorExtractor = LocalColorExtractor.newInstance(getContext()); mColorExtractor.setListener(this); } @Override public void setColorResources(@Nullable SparseIntArray colors) { if (colors == null) { resetColorResources(); } else { super.setColorResources(colors); } } @Override Loading Loading @@ -167,6 +204,7 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView // state is updated. So isAttachedToWindow() will return true until next frame. mIsAttachedToWindow = false; checkIfAutoAdvance(); mColorExtractor.removeLocations(); } @Override Loading Loading @@ -213,6 +251,78 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView } mIsScrollable = checkScrollableRecursively(this); mCurrentWidgetSize.left = left; mCurrentWidgetSize.top = top; mCurrentWidgetSize.right = right; mCurrentWidgetSize.bottom = bottom; updateColorExtraction(mCurrentWidgetSize); } private void updateColorExtraction(Rect widgetLocation) { // If the widget hasn't been measured and laid out, we cannot do this. if (widgetLocation.isEmpty()) { return; } LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) getTag(); if (info != null) { int screenWidth = mLauncher.getDeviceProfile().widthPx; int screenHeight = mLauncher.getDeviceProfile().heightPx; int numScreens = mWorkspace.getNumPagesForWallpaperParallax(); int screenId = mIsRtl ? numScreens - info.screenId : info.screenId; float relativeScreenWidth = 1f / numScreens; float absoluteTop = widgetLocation.top; float absoluteBottom = widgetLocation.bottom; for (View v = (View) getParent(); v != null && v.getId() != R.id.launcher; v = (View) v.getParent()) { absoluteBottom += v.getTop(); absoluteTop += v.getTop(); } float xOffset = 0; View parentView = (View) getParent(); // The layout depends on the orientation. if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { xOffset = screenHeight - mWorkspace.getPaddingRight() - parentView.getWidth(); } else { xOffset = mWorkspace.getPaddingLeft() + parentView.getPaddingLeft(); } // This is the position of the widget relative to the wallpaper, as expected by the // local color extraction of the WallpaperManager. // The coordinate system is such that, on the horizontal axis, each screen has a // distinct range on the [0,1] segment. So if there are 3 screens, they will have the // ranges [0, 1/3], [1/3, 2/3] and [2/3, 1]. The position on the subrange should be // the position of the widget relative to the screen. For the vertical axis, this is // simply the location of the widget relative to the screen. mTempRectF.left = ((widgetLocation.left + xOffset) / screenWidth + screenId) * relativeScreenWidth; mTempRectF.right = ((widgetLocation.right + xOffset) / screenWidth + screenId) * relativeScreenWidth; mTempRectF.top = absoluteTop / screenHeight; mTempRectF.bottom = absoluteBottom / screenHeight; if (mTempRectF.left < 0 || mTempRectF.right > 1 || mTempRectF.top < 0 || mTempRectF.bottom > 1) { Log.e(LOG_TAG, " Error, invalid relative position"); return; } if (!mTempRectF.equals(mLastLocationRegistered)) { if (mLastLocationRegistered != null) { mColorExtractor.removeLocations(); } mLastLocationRegistered = new RectF(mTempRectF); mColorExtractor.addLocation(List.of(mLastLocationRegistered)); } } else { mColorExtractor.removeLocations(); } } @Override public void onColorsChanged(RectF rectF, SparseIntArray colors) { // setColorResources will reapply the view, which must happen in the UI thread. post(() -> setColorResources(colors)); } @Override Loading @@ -225,6 +335,14 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); maybeRegisterAutoAdvance(); if (visibility == View.VISIBLE) { if (mLastLocationRegistered != null) { mColorExtractor.addLocation(List.of(mLastLocationRegistered)); } } else { mColorExtractor.removeLocations(); } } private void checkIfAutoAdvance() { Loading Loading
res/values/config.xml +5 −0 Original line number Diff line number Diff line Loading @@ -90,6 +90,7 @@ <string name="wallpaper_picker_package" translatable="false"></string> <string name="calendar_component_name" translatable="false"></string> <string name="clock_component_name" translatable="false"></string> <string name="local_colors_extraction_class" translatable="false"></string> <!-- Accessibility actions --> <item type="id" name="action_remove" /> Loading Loading @@ -188,4 +189,8 @@ </string-array> <string-array name="filtered_components" ></string-array> <!-- Name of the class used to generate colors from the wallpaper colors. Must be implementing the LauncherAppWidgetHostView.ColorGenerator interface. --> <string name="color_generator_class" translatable="false"/> </resources>
src/com/android/launcher3/Workspace.java +10 −2 Original line number Diff line number Diff line Loading @@ -186,7 +186,6 @@ public class Workspace extends PagedView<WorkspacePageIndicator> @Thunk final Launcher mLauncher; @Thunk DragController mDragController; private final Rect mTempRect = new Rect(); private final int[] mTempXY = new int[2]; private final float[] mTempFXY = new float[2]; @Thunk float[] mDragViewVisualCenter = new float[2]; Loading Loading @@ -367,10 +366,19 @@ public class Workspace extends PagedView<WorkspacePageIndicator> } public float getWallpaperOffsetForCenterPage() { int pageScroll = getScrollForPage(getPageNearestToCenterOfScreen()); return getWallpaperOffsetForPage(getPageNearestToCenterOfScreen()); } private float getWallpaperOffsetForPage(int page) { int pageScroll = getScrollForPage(page); return mWallpaperOffset.wallpaperOffsetForScroll(pageScroll); } /** Returns the number of pages used for the wallpaper parallax. */ public int getNumPagesForWallpaperParallax() { return mWallpaperOffset.getNumPagesForWallpaperParallax(); } public Rect estimateItemPosition(CellLayout cl, int hCell, int vCell, int hSpan, int vSpan) { Rect r = new Rect(); cl.cellToRect(hCell, vCell, hSpan, vSpan, r); Loading
src/com/android/launcher3/settings/DeveloperOptionsFragment.java +0 −1 Original line number Diff line number Diff line Loading @@ -88,7 +88,6 @@ public class DeveloperOptionsFragment extends PreferenceFragmentCompat { private PreferenceCategory mPluginsCategory; private FlagTogglerPrefUi mFlagTogglerPrefUi; @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); Loading
src/com/android/launcher3/util/WallpaperOffsetInterpolator.java +8 −5 Original line number Diff line number Diff line Loading @@ -145,14 +145,17 @@ public class WallpaperOffsetInterpolator extends BroadcastReceiver { msg.sendToTarget(); } private void updateOffset() { int numPagesForWallpaperParallax; /** Returns the number of pages used for the wallpaper parallax. */ public int getNumPagesForWallpaperParallax() { if (mWallpaperIsLiveWallpaper) { numPagesForWallpaperParallax = mNumScreens; return mNumScreens; } else { numPagesForWallpaperParallax = Math.max(MIN_PARALLAX_PAGE_SPAN, mNumScreens); return Math.max(MIN_PARALLAX_PAGE_SPAN, mNumScreens); } } Message.obtain(mHandler, MSG_SET_NUM_PARALLAX, numPagesForWallpaperParallax, 0, private void updateOffset() { Message.obtain(mHandler, MSG_SET_NUM_PARALLAX, getNumPagesForWallpaperParallax(), 0, mWindowToken).sendToTarget(); } Loading
src/com/android/launcher3/widget/LauncherAppWidgetHostView.java +119 −1 Original line number Diff line number Diff line Loading @@ -16,12 +16,17 @@ package com.android.launcher3.widget; import android.app.WallpaperManager; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; import android.graphics.RectF; import android.os.Handler; import android.os.SystemClock; import android.util.Log; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; Loading @@ -32,10 +37,13 @@ import android.widget.AdapterView; import android.widget.Advanceable; import android.widget.RemoteViews; import androidx.annotation.Nullable; import com.android.launcher3.CheckLongPressHelper; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.LauncherAppWidgetInfo; Loading @@ -43,11 +51,16 @@ import com.android.launcher3.util.Executors; import com.android.launcher3.util.Themes; import com.android.launcher3.views.BaseDragLayer.TouchCompleteListener; import java.util.List; /** * {@inheritDoc} */ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView implements TouchCompleteListener, View.OnLongClickListener { implements TouchCompleteListener, View.OnLongClickListener, LocalColorExtractor.Listener { private static final String LOG_TAG = "LauncherAppWidgetHostView"; // Related to the auto-advancing of widgets private static final long ADVANCE_INTERVAL = 20000; Loading @@ -60,18 +73,29 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView private final CheckLongPressHelper mLongPressHelper; protected final Launcher mLauncher; private final Workspace mWorkspace; private final WallpaperManager mWallpaperManager; @ViewDebug.ExportedProperty(category = "launcher") private boolean mReinflateOnConfigChange; // Maintain the color manager. private final LocalColorExtractor mColorExtractor; private boolean mIsScrollable; private boolean mIsAttachedToWindow; private boolean mIsAutoAdvanceRegistered; private Runnable mAutoAdvanceRunnable; private RectF mLastLocationRegistered = null; // Used to store the widget size during onLayout. private final Rect mCurrentWidgetSize = new Rect(); private final RectF mTempRectF = new RectF(); private final boolean mIsRtl; public LauncherAppWidgetHostView(Context context) { super(context); mLauncher = Launcher.getLauncher(context); mWorkspace = mLauncher.getWorkspace(); mLongPressHelper = new CheckLongPressHelper(this, this); mInflater = LayoutInflater.from(context); setAccessibilityDelegate(mLauncher.getAccessibilityDelegate()); Loading @@ -81,6 +105,19 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView if (Utilities.ATLEAST_Q && Themes.getAttrBoolean(mLauncher, R.attr.isWorkspaceDarkText)) { setOnLightBackground(true); } mIsRtl = Utilities.isRtl(context.getResources()); mWallpaperManager = WallpaperManager.getInstance(getContext()); mColorExtractor = LocalColorExtractor.newInstance(getContext()); mColorExtractor.setListener(this); } @Override public void setColorResources(@Nullable SparseIntArray colors) { if (colors == null) { resetColorResources(); } else { super.setColorResources(colors); } } @Override Loading Loading @@ -167,6 +204,7 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView // state is updated. So isAttachedToWindow() will return true until next frame. mIsAttachedToWindow = false; checkIfAutoAdvance(); mColorExtractor.removeLocations(); } @Override Loading Loading @@ -213,6 +251,78 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView } mIsScrollable = checkScrollableRecursively(this); mCurrentWidgetSize.left = left; mCurrentWidgetSize.top = top; mCurrentWidgetSize.right = right; mCurrentWidgetSize.bottom = bottom; updateColorExtraction(mCurrentWidgetSize); } private void updateColorExtraction(Rect widgetLocation) { // If the widget hasn't been measured and laid out, we cannot do this. if (widgetLocation.isEmpty()) { return; } LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) getTag(); if (info != null) { int screenWidth = mLauncher.getDeviceProfile().widthPx; int screenHeight = mLauncher.getDeviceProfile().heightPx; int numScreens = mWorkspace.getNumPagesForWallpaperParallax(); int screenId = mIsRtl ? numScreens - info.screenId : info.screenId; float relativeScreenWidth = 1f / numScreens; float absoluteTop = widgetLocation.top; float absoluteBottom = widgetLocation.bottom; for (View v = (View) getParent(); v != null && v.getId() != R.id.launcher; v = (View) v.getParent()) { absoluteBottom += v.getTop(); absoluteTop += v.getTop(); } float xOffset = 0; View parentView = (View) getParent(); // The layout depends on the orientation. if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { xOffset = screenHeight - mWorkspace.getPaddingRight() - parentView.getWidth(); } else { xOffset = mWorkspace.getPaddingLeft() + parentView.getPaddingLeft(); } // This is the position of the widget relative to the wallpaper, as expected by the // local color extraction of the WallpaperManager. // The coordinate system is such that, on the horizontal axis, each screen has a // distinct range on the [0,1] segment. So if there are 3 screens, they will have the // ranges [0, 1/3], [1/3, 2/3] and [2/3, 1]. The position on the subrange should be // the position of the widget relative to the screen. For the vertical axis, this is // simply the location of the widget relative to the screen. mTempRectF.left = ((widgetLocation.left + xOffset) / screenWidth + screenId) * relativeScreenWidth; mTempRectF.right = ((widgetLocation.right + xOffset) / screenWidth + screenId) * relativeScreenWidth; mTempRectF.top = absoluteTop / screenHeight; mTempRectF.bottom = absoluteBottom / screenHeight; if (mTempRectF.left < 0 || mTempRectF.right > 1 || mTempRectF.top < 0 || mTempRectF.bottom > 1) { Log.e(LOG_TAG, " Error, invalid relative position"); return; } if (!mTempRectF.equals(mLastLocationRegistered)) { if (mLastLocationRegistered != null) { mColorExtractor.removeLocations(); } mLastLocationRegistered = new RectF(mTempRectF); mColorExtractor.addLocation(List.of(mLastLocationRegistered)); } } else { mColorExtractor.removeLocations(); } } @Override public void onColorsChanged(RectF rectF, SparseIntArray colors) { // setColorResources will reapply the view, which must happen in the UI thread. post(() -> setColorResources(colors)); } @Override Loading @@ -225,6 +335,14 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); maybeRegisterAutoAdvance(); if (visibility == View.VISIBLE) { if (mLastLocationRegistered != null) { mColorExtractor.addLocation(List.of(mLastLocationRegistered)); } } else { mColorExtractor.removeLocations(); } } private void checkIfAutoAdvance() { Loading