132 lines
4.4 KiB
Java
132 lines
4.4 KiB
Java
/*
|
|
* 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();
|
|
}
|
|
}
|