summaryrefslogtreecommitdiff
path: root/src/com/android/customization/picker/BasePreviewAdapter.java
blob: c3ddc1d3fee539eb8560c2551507f4964bb9bc6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * Copyright (C) 2019 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.
 */
package com.android.customization.picker;

import static androidx.core.view.ViewCompat.LAYOUT_DIRECTION_RTL;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.core.view.ViewCompat;
import androidx.viewpager.widget.PagerAdapter;

import com.android.customization.picker.BasePreviewAdapter.PreviewPage;
import com.android.wallpaper.util.SizeCalculator;
import com.android.wallpaper.widget.PreviewPager;

import java.util.ArrayList;
import java.util.List;

/**
 * Base adapter for {@link PreviewPager}.
 * It can be used as-is by creating an extension of {@link PreviewPage} and adding pages via
 * {@link #addPage(PreviewPage)}
 * @param <T> the type of {@link PreviewPage} that this adapter will handle.
 */
public class BasePreviewAdapter<T extends PreviewPage> extends PagerAdapter {

    private final int mPreviewCardResId;
    private final Context mContext;
    private final LayoutInflater mInflater;
    protected final List<T> mPages = new ArrayList<>();

    protected BasePreviewAdapter(Context context, @LayoutRes int previewCardResId) {
        mContext = context;
        mPreviewCardResId = previewCardResId;
        mInflater = LayoutInflater.from(mContext);
    }

    protected void addPage(T p) {
        mPages.add(p);
    }

    @Override
    public int getCount() {
        return mPages.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == ((PreviewPage) object).card;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        if (ViewCompat.getLayoutDirection(container) == LAYOUT_DIRECTION_RTL) {
            position = mPages.size() - 1 - position;
        }
        CardView card = (CardView) mInflater.inflate(mPreviewCardResId, container, false);
        T page = mPages.get(position);

        page.setCard(card);
        page.bindPreviewContent();
        if (card.getParent() != null) {
            container.removeView(card);
        }
        container.addView(card);
        return page;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position,
            @NonNull Object object) {
        View card = ((PreviewPage) object).card;
        ((PreviewPage) object).card = null;
        if (card.getParent() == container) {
            container.removeView(card);
        }
    }

    /**
     * Represents a possible page in a {@link PreviewPager}, based on a CardView container.
     * Override {@link #bindPreviewContent()} to bind the contents of the page when instantiated.
     */
    public static abstract class PreviewPage {
        protected final String title;
        protected CardView card;

        private Activity mActivity;

        protected PreviewPage(String title, Activity activity) {
            this.title = title;
            mActivity = activity;
        }

        public void setCard(CardView card) {
            card.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) {
                            card.setRadius(SizeCalculator.getPreviewCornerRadius(
                                    mActivity, card.getMeasuredWidth()));
                            card.removeOnLayoutChangeListener(this);
                        }
                    });
            this.card = card;
        }

        public abstract void bindPreviewContent();
    }
}