1/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package androidx.viewpager2.widget.swipe;
18
19import static org.hamcrest.Matchers.allOf;
20import static org.hamcrest.Matchers.greaterThanOrEqualTo;
21import static org.hamcrest.Matchers.lessThanOrEqualTo;
22import static org.junit.Assert.assertThat;
23
24import androidx.fragment.app.Fragment;
25import androidx.viewpager2.widget.ViewPager2;
26
27import java.util.Random;
28import java.util.concurrent.atomic.AtomicInteger;
29
30public class FragmentAdapterActivity extends BaseActivity {
31    private static final Random RANDOM = new Random();
32
33    private AtomicInteger mAttachCount = new AtomicInteger(0);
34    private AtomicInteger mDestroyCount = new AtomicInteger(0);
35    private PageFragment[] mFragments;
36
37    @Override
38    protected void setAdapter() {
39        mFragments = new PageFragment[mTotalPages];
40
41        ViewPager2.FragmentProvider fragmentProvider = new ViewPager2.FragmentProvider() {
42            final boolean[] mWasEverAttached = new boolean[mTotalPages];
43
44            @Override
45            public Fragment getItem(final int position) {
46                PageFragment fragment = PageFragment.create(valueForPosition(position));
47
48                fragment.mOnAttachListener = new PageFragment.EventListener() {
49                    @Override
50                    public void onEvent(PageFragment fragment) {
51                        mAttachCount.incrementAndGet();
52                        mWasEverAttached[position] = true;
53                    }
54                };
55
56                fragment.mOnDestroyListener = new PageFragment.EventListener() {
57                    @Override
58                    public void onEvent(PageFragment fragment) {
59                        mDestroyCount.incrementAndGet();
60                    }
61                };
62
63                return mFragments[position] = fragment;
64            }
65
66            private int valueForPosition(int position) {
67                // only supply correct value ones; then rely on it being kept by Fragment state
68                return mWasEverAttached[position]
69                        ? RANDOM.nextInt() // junk value to be overridden by state saved value
70                        : position;
71            }
72
73            @Override
74            public int getCount() {
75                return mTotalPages;
76            }
77        };
78
79        mViewPager.setAdapter(getSupportFragmentManager(), fragmentProvider,
80                ViewPager2.FragmentRetentionPolicy.SAVE_STATE);
81    }
82
83    @Override
84    public void updatePage(int pageIx, int newValue) {
85        mFragments[pageIx].updateValue(newValue);
86    }
87
88    @Override
89    public void validateState() {
90        assertThat(mAttachCount.get() - mDestroyCount.get(),
91                allOf(greaterThanOrEqualTo(1), lessThanOrEqualTo(4)));
92    }
93}
94