summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChihhang Chuang <chihhangchuang@google.com>2021-04-27 18:27:54 +0800
committerChihhang Chuang <chihhangchuang@google.com>2021-04-27 21:54:03 +0800
commit4f97a7d4d575a8424008cd5d924a18228c8bceb0 (patch)
treec5751552e600fe75c0804d99561eadf3ab1a8dca
parent53da759ebbe3489d30a79a2a708ea04362718100 (diff)
downloadplatform_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
-rwxr-xr-xsrc/com/android/wallpaper/asset/StreamableAsset.java3
-rwxr-xr-xsrc/com/android/wallpaper/picker/ImagePreviewFragment.java112
-rw-r--r--src/com/android/wallpaper/picker/LivePreviewFragment.java10
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() {