blob: 563f777856863fd92321e4eda126f633b719685a [file] [log] [blame]
/*
* Copyright (C) 2021 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.providers.media.photopicker.ui;
import android.content.Context;
import android.view.View;
import androidx.viewpager2.widget.CompositePageTransformer;
import androidx.viewpager2.widget.MarginPageTransformer;
import androidx.viewpager2.widget.ViewPager2;
import com.android.providers.media.R;
import com.android.providers.media.photopicker.data.MuteStatus;
import com.android.providers.media.photopicker.data.model.Item;
import java.util.ArrayList;
import java.util.List;
/**
* A wrapper class to assist in initializing {@link ViewPager2} and {@link PreviewAdapter}. This
* class also supports some of {@link ViewPager2} and {@link PreviewAdapter} methods to avoid
* exposing these objects outside this class.
* The class also supports registering {@link ViewPager2.OnPageChangeCallback} and unregister the
* same onDestroy().
*/
class ViewPager2Wrapper {
private final ViewPager2 mViewPager;
private final PreviewAdapter mAdapter;
private final List<ViewPager2.OnPageChangeCallback> mOnPageChangeCallbacks = new ArrayList<>();
ViewPager2Wrapper(ViewPager2 viewPager, List<Item> selectedItems, MuteStatus muteStatus) {
mViewPager = viewPager;
final Context context = mViewPager.getContext();
mAdapter = new PreviewAdapter(context, muteStatus);
mAdapter.updateItemList(selectedItems);
mViewPager.setAdapter(mAdapter);
CompositePageTransformer compositePageTransformer = new CompositePageTransformer();
compositePageTransformer.addTransformer(new MarginPageTransformer(
context.getResources().getDimensionPixelSize(R.dimen.preview_viewpager_margin)));
compositePageTransformer.addTransformer(new PlayerPageTransformer());
mViewPager.setPageTransformer(compositePageTransformer);
}
/**
* Registers given {@link ViewPager2.OnPageChangeCallback} to the {@link ViewPager2}. This class
* also takes care of unregistering the callback onDestroy()
*/
public void addOnPageChangeCallback(ViewPager2.OnPageChangeCallback onPageChangeCallback) {
mOnPageChangeCallbacks.add(onPageChangeCallback);
mViewPager.registerOnPageChangeCallback(onPageChangeCallback);
}
public Item getItemAt(int position) {
return getItemAtInternal(position);
}
public Item getCurrentItem() {
return getItemAtInternal(mViewPager.getCurrentItem());
}
private Item getItemAtInternal(int position) {
return mAdapter.getItem(position);
}
public void onStop() {
mAdapter.onStop();
}
public void onStart() {
// TODO(b/197083539): Restore the playback state here.
// This forces PageTransformer#transformPage call and assists in ExoPlayer initialization.
mViewPager.requestTransform();
}
public void onDestroy() {
for (ViewPager2.OnPageChangeCallback callback : mOnPageChangeCallbacks) {
mViewPager.unregisterOnPageChangeCallback(callback);
}
mOnPageChangeCallbacks.clear();
mAdapter.onDestroy();
}
private class PlayerPageTransformer implements ViewPager2.PageTransformer {
@Override
public void transformPage(View view, float position) {
// We are only interested in position == 0.0. Only position=0.0 indicates that the page
// is selected.
if (position != 0) return;
mAdapter.onHandlePageSelected(view);
}
}
}