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

Commit 05428e90 authored by chihhangchuang's avatar chihhangchuang
Browse files

Add new preview for theme picker (Part1)

- Uses a flag to hide the new preview until it's ready.
- Uses the apply button of bottom action bar.

Screenshot:
    flag is false: https://screenshot.googleplex.com/nDyDnt708tL.png
    flag is ture: https://screenshot.googleplex.com/R76eoVL0rNy.png

Test: Manually
Bug: 146475648
Change-Id: I49e33e011da106e7773a66a1238cc462a873c1cc
parent 2848da68
Loading
Loading
Loading
Loading
+22 −32
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@
-->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
@@ -27,49 +26,40 @@
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.constraintlayout.widget.ConstraintLayout
        <LinearLayout
            android:id="@+id/content_section"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            android:layout_height="match_parent"
            android:orientation="vertical">

            <!-- The V2 preview card. -->
            <FrameLayout
                android:id="@+id/preview_card_container"
                android:layout_width="match_parent"
                android:layout_height="@dimen/preview_content_height"
                android:paddingTop="@dimen/preview_content_padding_top"
                android:paddingBottom="@dimen/preview_content_padding_bottom"
                android:clipToPadding="false"
                android:background="@color/fullscreen_preview_background"
                android:visibility="gone">
                <include layout="@layout/theme_preview_card_v2"/>
            </FrameLayout>

            <!-- Will remove it later. -->
            <com.android.wallpaper.widget.PreviewPager
                android:id="@+id/theme_preview_pager"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/preview_pager_background"
                app:layout_constrainedHeight="true"
                app:layout_constraintBottom_toTopOf="@id/options_container"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHeight_max="@dimen/preview_pager_max_height"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintVertical_bias="0.0"
                app:layout_constraintVertical_chainStyle="spread_inside"/>
                android:layout_height="@dimen/preview_content_height"
                android:background="@color/preview_pager_background"/>

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/options_container"
                android:layout_width="match_parent"
                android:layout_height="@dimen/options_container_height"
                android:layout_height="0dp"
                android:layout_gravity="bottom|center_horizontal"
                android:layout_marginTop="10dp"
                android:layout_weight="1"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/theme_preview_pager"
                app:layout_constraintVertical_bias="1.0"/>

            <Button
                android:id="@+id/apply_button"
                style="@style/ActionPrimaryButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
                android:layout_marginEnd="10dp"
                android:layout_marginBottom="10dp"
                android:text="@string/apply_theme_btn"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"/>
        </androidx.constraintlayout.widget.ConstraintLayout>
                android:layout_weight="1"/>
        </LinearLayout>

        <androidx.core.widget.ContentLoadingProgressBar
            android:id="@+id/loading_indicator"
+35 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright (C) 2020 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/FullContentPreviewCard"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center">

    <ImageView
        android:id="@+id/wallpaper_preview_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/primary_color" />

    <SurfaceView
        android:id="@+id/wallpaper_preview_surface"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.cardview.widget.CardView>
 No newline at end of file
+57 −10
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
 */
package com.android.customization.picker.theme;

import static com.android.wallpaper.widget.BottomActionBar.BottomAction.APPLY;

import android.app.Activity;
import android.app.WallpaperColors;
import android.content.Context;
@@ -54,6 +56,7 @@ import com.android.customization.model.theme.custom.CustomTheme;
import com.android.customization.module.ThemesUserEventLogger;
import com.android.customization.picker.BasePreviewAdapter;
import com.android.customization.picker.TimeTicker;
import com.android.customization.picker.WallpaperPreviewer;
import com.android.customization.picker.theme.ThemePreviewPage.ThemeCoverPage;
import com.android.customization.picker.theme.ThemePreviewPage.TimeContainer;
import com.android.customization.widget.OptionSelectorController;
@@ -65,6 +68,7 @@ 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.widget.BottomActionBar;
import com.android.wallpaper.widget.PreviewPager;

import java.util.List;
@@ -77,6 +81,8 @@ public class ThemeFragment extends AppbarFragment {
    private static final String TAG = "ThemeFragment";
    private static final String KEY_SELECTED_THEME = "ThemeFragment.SelectedThemeBundle";

    private static final boolean USE_NEW_PREVIEW = false;

    /**
     * Interface to be implemented by an Activity hosting a {@link ThemeFragment}
     */
@@ -104,6 +110,8 @@ public class ThemeFragment extends AppbarFragment {
    private Asset mCurrentWallpaperThumbAsset;
    private CurrentWallpaperInfoFactory mCurrentWallpaperFactory;
    private TimeTicker mTicker;
    private BottomActionBar mBottomActionBar;
    private WallpaperPreviewer mWallpaperPreviewer;

    @Override
    public void onAttach(Context context) {
@@ -128,14 +136,43 @@ public class ThemeFragment extends AppbarFragment {
                .getCurrentWallpaperFactory(getActivity().getApplicationContext());
        mPreviewPager = view.findViewById(R.id.theme_preview_pager);
        mOptionsContainer = view.findViewById(R.id.options_container);
        view.findViewById(R.id.apply_button).setOnClickListener(v -> {
            applyTheme();
        });
        setUpOptions(savedInstanceState);

        if (USE_NEW_PREVIEW) {
            mPreviewPager.setVisibility(View.GONE);
            view.findViewById(R.id.preview_card_container).setVisibility(View.VISIBLE);
            mWallpaperPreviewer = new WallpaperPreviewer(
                    getLifecycle(),
                    getActivity(),
                    view.findViewById(R.id.wallpaper_preview_image),
                    view.findViewById(R.id.wallpaper_preview_surface));
            view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
                @Override
                public void onLayoutChange(View v, int left, int top, int right, int bottom,
                                           int oldLeft, int oldTop, int oldRight, int oldBottom) {
                    mWallpaperPreviewer.updatePreviewCardRadius();
                    view.removeOnLayoutChangeListener(this);
                }
            });
        }
        return view;
    }

    @Override
    protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {
        mBottomActionBar = bottomActionBar;
        mBottomActionBar.bindBackButtonToSystemBackKey(getActivity());
        mBottomActionBar.showActionsOnly(APPLY);
        mBottomActionBar.setActionClickListener(APPLY, v -> applyTheme());
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        // Setup options here when all views are ready(including BottomActionBar), since we need to
        // update views after options are loaded.
        setUpOptions(savedInstanceState);
    }

    private void applyTheme() {
        mThemeManager.apply(mSelectedTheme, new Callback() {
            @Override
@@ -208,12 +245,16 @@ public class ThemeFragment extends AppbarFragment {
        mCurrentWallpaperFactory.createCurrentWallpaperInfos(
                (homeWallpaper, lockWallpaper, presentationMode) -> {
                    mCurrentHomeWallpaper = homeWallpaper;
                    if (USE_NEW_PREVIEW) {
                        mWallpaperPreviewer.setWallpaper(mCurrentHomeWallpaper);
                    } else {
                        mCurrentWallpaperThumbAsset = new BitmapCachingAsset(getContext(),
                                mCurrentHomeWallpaper.getThumbAsset(getContext()));
                        if (mSelectedTheme != null && mAdapter != null) {
                            mAdapter.setWallpaperAsset(mCurrentWallpaperThumbAsset);
                            mAdapter.rebindWallpaperIfAvailable();
                        }
                    }
        }, false);
    }

@@ -261,8 +302,11 @@ public class ThemeFragment extends AppbarFragment {
                        }
                        mEventLogger.logThemeSelected(mSelectedTheme,
                                selected instanceof CustomTheme);
                        if (!USE_NEW_PREVIEW) {
                            createAdapter(options);
                        }
                        mBottomActionBar.show();
                    }
                });
                mOptionsController.initOptions(mThemeManager);
                String previouslySelected = savedInstanceState != null
@@ -285,6 +329,9 @@ public class ThemeFragment extends AppbarFragment {
                    mOptionsController.setAppliedOption(mSelectedTheme);
                }
                mOptionsController.setSelectedOption(mSelectedTheme);
                // Set selected option above will show BottomActionBar when entering the tab. But
                // it should not show when entering the tab.
                mBottomActionBar.hide();
            }
            @Override
            public void onError(@Nullable Throwable throwable) {