diff options
author | Chihhang Chuang <chihhangchuang@google.com> | 2021-04-27 18:27:54 +0800 |
---|---|---|
committer | Chihhang Chuang <chihhangchuang@google.com> | 2021-04-27 21:54:03 +0800 |
commit | 4f97a7d4d575a8424008cd5d924a18228c8bceb0 (patch) | |
tree | c5751552e600fe75c0804d99561eadf3ab1a8dca | |
parent | 53da759ebbe3489d30a79a2a708ea04362718100 (diff) | |
download | platform_packages_apps_WallpaperPicker2-4f97a7d4d575a8424008cd5d924a18228c8bceb0.tar.gz platform_packages_apps_WallpaperPicker2-4f97a7d4d575a8424008cd5d924a18228c8bceb0.tar.bz2 platform_packages_apps_WallpaperPicker2-4f97a7d4d575a8424008cd5d924a18228c8bceb0.zip |
Update WallpaperColors when zoom or pan the wallpaper preview
Also fix the state loss of #setUpTabs for both image and live preview.
Video: https://drive.google.com/file/d/17MAUnAoAugbK5Sanr0gDpULw4PJzMQxj/view?usp=sharing
Bug: 185198554
Test: manual
Change-Id: I52e880cdfdf1ba58ef184f45e727c7f153d14d24
3 files changed, 90 insertions, 35 deletions
diff --git a/src/com/android/wallpaper/asset/StreamableAsset.java b/src/com/android/wallpaper/asset/StreamableAsset.java index e4c566e..227f748 100755 --- a/src/com/android/wallpaper/asset/StreamableAsset.java +++ b/src/com/android/wallpaper/asset/StreamableAsset.java @@ -365,6 +365,9 @@ public abstract class StreamableAsset extends Asset { } catch (OutOfMemoryError e) { Log.e(TAG, "Out of memory and unable to decode bitmap region", e); return null; + } catch (IllegalArgumentException e){ + Log.e(TAG, "Illegal argument for decoding bitmap region", e); + return null; } } diff --git a/src/com/android/wallpaper/picker/ImagePreviewFragment.java b/src/com/android/wallpaper/picker/ImagePreviewFragment.java index 7e99797..7e7e6dd 100755 --- a/src/com/android/wallpaper/picker/ImagePreviewFragment.java +++ b/src/com/android/wallpaper/picker/ImagePreviewFragment.java @@ -34,6 +34,7 @@ import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.Surface; import android.view.SurfaceControlViewHost; @@ -55,6 +56,8 @@ import com.android.wallpaper.R; import com.android.wallpaper.asset.Asset; import com.android.wallpaper.asset.CurrentWallpaperAssetVN; import com.android.wallpaper.model.WallpaperInfo; +import com.android.wallpaper.module.BitmapCropper; +import com.android.wallpaper.module.InjectorProvider; import com.android.wallpaper.module.WallpaperPersister.Destination; import com.android.wallpaper.module.WallpaperPersister.SetWallpaperCallback; import com.android.wallpaper.util.ResourceUtils; @@ -74,6 +77,8 @@ import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; import com.google.android.material.tabs.TabLayout; import java.util.Locale; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; /** * Fragment which displays the UI for previewing an individual static wallpaper and its attribution @@ -81,6 +86,7 @@ import java.util.Locale; */ public class ImagePreviewFragment extends PreviewFragment implements WallpaperColorsLoader.Callback{ + private static final String TAG = "ImagePreviewFragment"; private static final float DEFAULT_WALLPAPER_MAX_ZOOM = 8f; private final WallpaperSurfaceCallback mWallpaperSurfaceCallback = @@ -97,6 +103,8 @@ public class ImagePreviewFragment extends PreviewFragment implements WallpaperCo private WorkspaceSurfaceHolderCallback mWorkspaceSurfaceCallback; private SurfaceView mWallpaperSurface; private WallpaperInfoView mWallpaperInfoView; + private Optional<Integer> mLastSelectedTabPositionOptional = Optional.empty(); + private AtomicInteger mImageScaleChangeCounter = new AtomicInteger(0); protected ViewGroup mLockPreviewContainer; protected LockScreenPreviewer2 mLockScreenPreviewer; @@ -149,7 +157,6 @@ public class ImagePreviewFragment extends PreviewFragment implements WallpaperCo mLockPreviewContainer); setUpTabs(view.findViewById(R.id.pill_tabs)); - updateScreenPreview(mViewAsHome); view.measure(makeMeasureSpec(mScreenSize.x, EXACTLY), makeMeasureSpec(mScreenSize.y, EXACTLY)); @@ -171,6 +178,28 @@ public class ImagePreviewFragment extends PreviewFragment implements WallpaperCo super.onViewCreated(view, savedInstanceState); WallpaperColorsLoader.getWallpaperColors(getContext(), mWallpaper.getThumbAsset(getContext()), this); + + mWallpaperAsset.decodeRawDimensions(getActivity(), dimensions -> { + // Don't continue loading the wallpaper if the Fragment is detached. + if (getActivity() == null) { + return; + } + + // Return early and show a dialog if dimensions are null (signaling a decoding error). + if (dimensions == null) { + showLoadWallpaperErrorDialog(); + return; + } + + // To avoid applying the wallpaper when it's not parsed. Now it's parsed, enable the + // bottom action bar to allow applying the wallpaper. + if (mBottomActionBar != null) { + mBottomActionBar.enableActions(); + } + + mRawWallpaperSize = dimensions; + initFullResView(); + }); } @Override @@ -209,7 +238,6 @@ public class ImagePreviewFragment extends PreviewFragment implements WallpaperCo @Override protected void onBottomActionBarReady(BottomActionBar bottomActionBar) { super.onBottomActionBarReady(bottomActionBar); - mWallpaperInfoView = (WallpaperInfoView) LayoutInflater.from(getContext()).inflate( R.layout.wallpaper_info_view, /* root= */null); @@ -239,28 +267,14 @@ public class ImagePreviewFragment extends PreviewFragment implements WallpaperCo // Will trigger onActionSelected callback to update the editing state. mBottomActionBar.setDefaultSelectedButton(EDIT); mBottomActionBar.show(); - + // Loads wallpaper info and populate into view. + setUpExploreIntentAndLabel(this::populateWallpaperInfo); + // To avoid applying the wallpaper when the wallpaper's not parsed. mBottomActionBar.disableActions(); - mWallpaperAsset.decodeRawDimensions(getActivity(), dimensions -> { - // Don't continue loading the wallpaper if the Fragment is detached. - if (getActivity() == null) { - return; - } - - // Return early and show a dialog if dimensions are null (signaling a decoding error). - if (dimensions == null) { - showLoadWallpaperErrorDialog(); - return; - } - - if (mBottomActionBar != null) { - mBottomActionBar.enableActions(); - } - - mRawWallpaperSize = dimensions; - - setUpExploreIntentAndLabel(ImagePreviewFragment.this::initFullResView); - }); + // If the wallpaper is parsed, enable the bottom action bar. + if (mRawWallpaperSize != null) { + mBottomActionBar.enableActions(); + } } protected void setUpTabs(TabLayout tabs) { @@ -269,7 +283,8 @@ public class ImagePreviewFragment extends PreviewFragment implements WallpaperCo tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { - updateScreenPreview(tab.getPosition() == 0); + mLastSelectedTabPositionOptional = Optional.of(tab.getPosition()); + updateScreenPreview(/* isHomeSelected= */ tab.getPosition() == 0); } @Override @@ -282,7 +297,9 @@ public class ImagePreviewFragment extends PreviewFragment implements WallpaperCo // The TabLayout only contains below tabs // 0. Home tab // 1. Lock tab - tabs.getTabAt(mViewAsHome ? 0 : 1).select(); + int tabPosition = mLastSelectedTabPositionOptional.orElseGet(() -> mViewAsHome ? 0 : 1); + tabs.getTabAt(tabPosition).select(); + updateScreenPreview(/* isHomeSelected= */ tabPosition == 0); } /** @@ -332,20 +349,51 @@ public class ImagePreviewFragment extends PreviewFragment implements WallpaperCo setDefaultWallpaperZoomAndScroll( mWallpaperAsset instanceof CurrentWallpaperAssetVN); crossFadeInMosaicView(); + mFullResImageView.setOnStateChangedListener( + new SubsamplingScaleImageView.DefaultOnStateChangedListener() { + @Override + public void onCenterChanged(PointF newCenter, int origin) { + super.onCenterChanged(newCenter, origin); + mImageScaleChangeCounter.incrementAndGet(); + mFullResImageView.postDelayed(() -> { + if (mImageScaleChangeCounter.decrementAndGet() == 0) { + recalculateColors(); + } + }, /* delayMillis= */ 100); + } + }); } getActivity().invalidateOptionsMenu(); + }); + } + + private void recalculateColors() { + BitmapCropper bitmapCropper = InjectorProvider.getInjector().getBitmapCropper(); + bitmapCropper.cropAndScaleBitmap(mWallpaperAsset, mFullResImageView.getScale(), + calculateCropRect(), /* adjustForRtl= */ false, new BitmapCropper.Callback() { + @Override + public void onBitmapCropped(Bitmap croppedBitmap) { + onLoaded(WallpaperColors.fromBitmap(croppedBitmap)); + } - if (mWallpaperInfoView != null && mWallpaper != null) { - mWallpaperInfoView.populateWallpaperInfo( - mWallpaper, - mActionLabel, - WallpaperInfoHelper.shouldShowExploreButton( - getContext(), mExploreIntent), - this::onExploreClicked); + @Override + public void onError(@Nullable Throwable e) { + Log.w(TAG, "Recalculate colors, crop and scale bitmap failed.", e); } }); } + private void populateWallpaperInfo() { + if (mWallpaperInfoView != null && mWallpaper != null) { + mWallpaperInfoView.populateWallpaperInfo( + mWallpaper, + mActionLabel, + WallpaperInfoHelper.shouldShowExploreButton( + getContext(), mExploreIntent), + this::onExploreClicked); + } + } + /** * Makes the MosaicView visible with an alpha fade-in animation while fading out the loading * indicator. diff --git a/src/com/android/wallpaper/picker/LivePreviewFragment.java b/src/com/android/wallpaper/picker/LivePreviewFragment.java index a033500..9f57dfd 100644 --- a/src/com/android/wallpaper/picker/LivePreviewFragment.java +++ b/src/com/android/wallpaper/picker/LivePreviewFragment.java @@ -78,6 +78,7 @@ import com.android.wallpaper.widget.WallpaperInfoView; import com.google.android.material.tabs.TabLayout; import java.util.Locale; +import java.util.Optional; /** * Fragment which displays the UI for previewing an individual live wallpaper, its attribution @@ -114,6 +115,7 @@ public class LivePreviewFragment extends PreviewFragment implements private SurfaceView mWallpaperSurface; private WorkspaceSurfaceHolderCallback mWorkspaceSurfaceCallback; private WallpaperSurfaceCallback mWallpaperSurfaceCallback; + private Optional<Integer> mLastSelectedTabPositionOptional = Optional.empty(); protected ViewGroup mLockPreviewContainer; protected LockScreenPreviewer2 mLockScreenPreviewer; @@ -202,7 +204,6 @@ public class LivePreviewFragment extends PreviewFragment implements mHomePreview, mWallpaperSurface); setUpTabs(view.findViewById(R.id.pill_tabs)); - updateScreenPreview(mViewAsHome); view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override @@ -230,7 +231,8 @@ public class LivePreviewFragment extends PreviewFragment implements tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { - updateScreenPreview(tab.getPosition() == 0); + mLastSelectedTabPositionOptional = Optional.of(tab.getPosition()); + updateScreenPreview(/* isHomeSelected= */ tab.getPosition() == 0); } @Override @@ -243,7 +245,9 @@ public class LivePreviewFragment extends PreviewFragment implements // The TabLayout only contains below tabs // 0. Home tab // 1. Lock tab - tabs.getTabAt(mViewAsHome ? 0 : 1).select(); + int tabPosition = mLastSelectedTabPositionOptional.orElseGet(() -> mViewAsHome ? 0 : 1); + tabs.getTabAt(tabPosition).select(); + updateScreenPreview(/* isHomeSelected= */ tabPosition == 0); } private void updateWallpaperSurface() { |