Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 83fee73e authored by chihhangchuang's avatar chihhangchuang
Browse files

Add new preview for custom theme page (part1)

- Add new preview to the naming page, and wait decision for other pages.
- Screenshot: https://screenshot.googleplex.com/RwTqj6Q1Eiz.png
- Next: make shape app icon names available for the custom theme preview info.

Test: Manually
Bug: 151285476
Change-Id: Icc43bfbacd00d9180ae51da702b9bf8c6dd9d27e
parent 20fb9b61
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -31,15 +31,11 @@
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@color/secondary_color">
            <include
                android:id="@+id/component_preview_content"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginHorizontal="@dimen/preview_page_horizontal_margin"
                android:layout_marginTop="@dimen/preview_page_top_margin"
                android:layout_marginBottom="@dimen/component_preview_page_bottom_margin"
                layout="@layout/theme_preview_card"/>
            android:paddingTop="@dimen/preview_content_padding_top"
            android:paddingBottom="@dimen/preview_content_padding_bottom"
            android:clipToPadding="false"
            android:background="@color/fullscreen_preview_background">
            <include layout="@layout/theme_preview_card_v2"/>
        </FrameLayout>
        <LinearLayout
            android:id="@+id/options_section"
+5 −10
Original line number Diff line number Diff line
@@ -31,7 +31,10 @@
            android:id="@+id/component_preview_container"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:background="@color/secondary_color"
            android:paddingTop="@dimen/preview_content_padding_top"
            android:paddingBottom="@dimen/preview_content_padding_bottom"
            android:clipToPadding="false"
            android:background="@color/fullscreen_preview_background"
            app:layout_constrainedHeight="true"
            app:layout_constraintBottom_toTopOf="@+id/guideline"
            app:layout_constraintEnd_toEndOf="parent"
@@ -40,15 +43,7 @@
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0">

            <include
                android:id="@+id/component_preview_content"
                layout="@layout/theme_preview_card"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginHorizontal="@dimen/preview_page_horizontal_margin"
                android:layout_marginTop="@dimen/preview_page_top_margin"
                android:layout_marginBottom="@dimen/indicator_container_height"/>
            <include layout="@layout/theme_preview_card_v2"/>
        </FrameLayout>

        <androidx.constraintlayout.widget.Guideline
+45 −125
Original line number Diff line number Diff line
@@ -15,35 +15,26 @@
 */
package com.android.customization.picker.theme;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnLayoutChangeListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.cardview.widget.CardView;

import com.android.customization.model.theme.ThemeBundle.PreviewInfo;
import com.android.customization.picker.theme.ThemePreviewPage.ThemeCoverPage;
import com.android.customization.picker.WallpaperPreviewer;
import com.android.wallpaper.R;
import com.android.wallpaper.asset.Asset;
import com.android.wallpaper.asset.BitmapCachingAsset;
import com.android.wallpaper.model.WallpaperInfo;
import com.android.wallpaper.module.CurrentWallpaperInfoFactory;
import com.android.wallpaper.module.InjectorProvider;
import com.android.wallpaper.picker.AppbarFragment;
import com.android.wallpaper.util.TimeTicker;
import com.android.wallpaper.widget.WallpaperColorsLoader;

/** Fragment of naming a custom theme. */
public class CustomThemeNameFragment extends CustomThemeStepFragment {

    public static CustomThemeNameFragment newInstance(CharSequence toolbarTitle, int position,
@@ -56,43 +47,10 @@ public class CustomThemeNameFragment extends CustomThemeStepFragment {
        return fragment;
    }


    private int[] mColorButtonIds = {
            R.id.preview_check_selected, R.id.preview_radio_selected, R.id.preview_toggle_selected
    };
    private int[] mColorTileIds = {
            R.id.preview_color_qs_0_bg, R.id.preview_color_qs_1_bg, R.id.preview_color_qs_2_bg
    };
    private int[][] mColorTileIconIds = {
            new int[]{ R.id.preview_color_qs_0_icon, 0},
            new int[]{ R.id.preview_color_qs_1_icon, 1},
            new int[] { R.id.preview_color_qs_2_icon, 3}
    };

    private int[] mShapeIconIds = {
            R.id.shape_preview_icon_0, R.id.shape_preview_icon_1, R.id.shape_preview_icon_2,
            R.id.shape_preview_icon_3, R.id.shape_preview_icon_4, R.id.shape_preview_icon_5
    };

    private Asset mWallpaperAsset;
    private ThemeCoverPage mCoverPage;
    private TimeTicker mTicker;
    private EditText mNameEditor;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CurrentWallpaperInfoFactory currentWallpaperFactory = InjectorProvider.getInjector()
                .getCurrentWallpaperFactory(getActivity().getApplicationContext());
        currentWallpaperFactory.createCurrentWallpaperInfos(
                (homeWallpaper, lockWallpaper, presentationMode) -> {
                    mWallpaperAsset = new BitmapCachingAsset(getContext(),
                            homeWallpaper.getThumbAsset(getContext()));
                    if (mCoverPage != null) {
                        mCoverPage.bindBody(true);
                    }
                }, false);
    }
    private ImageView mWallpaperImage;
    private WallpaperInfo mCurrentHomeWallpaper;
    private ThemeOptionPreviewer mThemeOptionPreviewer;

    @Nullable
    @Override
@@ -103,92 +61,54 @@ public class CustomThemeNameFragment extends CustomThemeStepFragment {
        mTitle.setText(mTitleResId);
        mNameEditor = view.findViewById(R.id.custom_theme_name);
        mNameEditor.setText(mCustomThemeManager.getOriginalTheme().getTitle());
        bindCover(view.findViewById(R.id.component_preview_content));
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        mTicker = TimeTicker.registerNewReceiver(getContext(), this::updateTime);
        updateTime();
    }

    private void updateTime() {
        if (mCoverPage != null) {
            mCoverPage.updateTime();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (getContext() != null) {
            getContext().unregisterReceiver(mTicker);
        }
    }

    private void bindCover(CardView card) {
        Context context = getContext();
        PreviewInfo previewInfo = mCustomThemeManager.buildCustomThemePreviewInfo(context);
        mCoverPage = new ThemeCoverPage(getActivity(), getThemeName(),
                previewInfo.resolveAccentColor(getResources()), previewInfo.icons,
                previewInfo.headlineFontFamily, previewInfo.bottomSheeetCornerRadius,
                previewInfo.shapeDrawable, previewInfo.shapeAppIcons, null,
                mColorButtonIds, mColorTileIds, mColorTileIconIds, mShapeIconIds,
                new WallpaperLayoutListener());
        mCoverPage.setCard(card);
        mCoverPage.bindPreviewContent();
        mNameEditor.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                ((TextView)card.findViewById(R.id.theme_preview_card_header)).setText(charSequence);
            }

            @Override
            public void afterTextChanged(Editable editable) {
        CurrentWallpaperInfoFactory currentWallpaperFactory = InjectorProvider.getInjector()
                .getCurrentWallpaperFactory(getActivity().getApplicationContext());

            }
        });
    }
        // Set wallpaper background.
        mWallpaperImage = view.findViewById(R.id.wallpaper_preview_image);
        final WallpaperPreviewer wallpaperPreviewer = new WallpaperPreviewer(
                getLifecycle(),
                getActivity(),
                mWallpaperImage,
                view.findViewById(R.id.wallpaper_preview_surface));
        currentWallpaperFactory.createCurrentWallpaperInfos(
                (homeWallpaper, lockWallpaper, presentationMode) -> {
                    mCurrentHomeWallpaper = homeWallpaper;
                    wallpaperPreviewer.setWallpaper(homeWallpaper);
                    updateThemePreviewColorPerWallpaper();
                }, false);

    private class WallpaperLayoutListener implements OnLayoutChangeListener {
        // Set theme option.
        mThemeOptionPreviewer = new ThemeOptionPreviewer(
                getLifecycle(),
                getContext(),
                view.findViewById(R.id.theme_preview_container));
        PreviewInfo previewInfo = mCustomThemeManager.buildCustomThemePreviewInfo(getContext());
        mThemeOptionPreviewer.setPreviewInfo(previewInfo);

        view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
        public void onLayoutChange(View view, int left, int top, int right,
                int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
            int targetWidth = right - left;
            int targetHeight = bottom - top;
            if (targetWidth > 0 && targetHeight > 0) {
                if (mWallpaperAsset != null) {
                    mWallpaperAsset.decodeBitmap(
                            targetWidth, targetHeight,
                            bitmap -> setWallpaperBitmap(view, bitmap));
                }
            public void onLayoutChange(View v, int left, int top, int right, int bottom,
                                       int oldLeft, int oldTop, int oldRight, int oldBottom) {
                wallpaperPreviewer.updatePreviewCardRadius();
                updateThemePreviewColorPerWallpaper();
                view.removeOnLayoutChangeListener(this);
            }
        });
        return view;
    }

        private void setWallpaperBitmap(View view, Bitmap bitmap) {
            Resources res = view.getContext().getResources();
            Drawable background = new BitmapDrawable(res, bitmap);
            background.setAlpha(ThemeCoverPage.COVER_PAGE_WALLPAPER_ALPHA);

            view.findViewById(R.id.theme_preview_card_background).setBackground(background);
    private void updateThemePreviewColorPerWallpaper() {
        if (mCurrentHomeWallpaper != null && mWallpaperImage.getMeasuredWidth() > 0
                && mWallpaperImage.getMeasuredHeight() > 0) {
            WallpaperColorsLoader.getWallpaperColors(
                    mCurrentHomeWallpaper.getThumbAsset(getContext()),
                    mWallpaperImage.getMeasuredWidth(),
                    mWallpaperImage.getMeasuredHeight(),
                    mThemeOptionPreviewer::updateColorForLauncherWidgets);
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mCoverPage = null;
    }

    @Override
    protected int getFragmentLayoutResId() {
        return R.layout.fragment_custom_theme_name;