1db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan/*
2db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan * Copyright (C) 2011 The Android Open Source Project
3db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan *
4db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan * Licensed under the Apache License, Version 2.0 (the "License");
5db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan * you may not use this file except in compliance with the License.
6db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan * You may obtain a copy of the License at
7db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan *
8db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan *      http://www.apache.org/licenses/LICENSE-2.0
9db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan *
10db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan * Unless required by applicable law or agreed to in writing, software
11db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan * distributed under the License is distributed on an "AS IS" BASIS,
12db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan * See the License for the specific language governing permissions and
14db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan * limitations under the License.
15db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan */
16db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuanpackage com.android.contacts.detail;
17db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
18db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuanimport android.os.Parcelable;
19db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuanimport android.support.v4.view.PagerAdapter;
20db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuanimport android.support.v4.view.ViewPager;
21db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuanimport android.view.View;
22db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
23db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan/**
246feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan * Adapter for the {@link ViewPager} for the contact detail page for a contact in 2 cases:
256feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan * 1) without social updates, and 2) with social updates. The default initial case is for
266feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan * the contact with social updates which uses all possible pages.
27db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan */
28db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuanpublic class ContactDetailViewPagerAdapter extends PagerAdapter {
29db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
30db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public static final String ABOUT_FRAGMENT_TAG = "view-pager-about-fragment";
31db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public static final String UPDTES_FRAGMENT_TAG = "view-pager-updates-fragment";
32db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
33db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    private static final int INDEX_ABOUT_FRAGMENT = 0;
34db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    private static final int INDEX_UPDATES_FRAGMENT = 1;
35db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
363bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan    private static final int MAX_FRAGMENT_VIEW_COUNT = 2;
373bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan
386feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan    /**
396feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan     * The initial value for the view count needs to be MAX_FRAGMENT_VIEW_COUNT,
406feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan     * otherwise anything smaller would break screen rotation functionality for a user viewing
416feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan     * a contact with social updates (i.e. the user was viewing the second page, rotates the
426feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan     * device, the view pager requires the second page to exist immediately on launch).
436feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan     */
443bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan    private int mFragmentViewCount = MAX_FRAGMENT_VIEW_COUNT;
453bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan
466c0470e21d8506fb53915df7463634fd47288343Katherine Kuan    private View mAboutFragmentView;
476c0470e21d8506fb53915df7463634fd47288343Katherine Kuan    private View mUpdatesFragmentView;
48db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
49db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public ContactDetailViewPagerAdapter() {
50db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
51db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
526c0470e21d8506fb53915df7463634fd47288343Katherine Kuan    public void setAboutFragmentView(View view) {
53db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan        mAboutFragmentView = view;
54db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
55db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
566c0470e21d8506fb53915df7463634fd47288343Katherine Kuan    public void setUpdatesFragmentView(View view) {
57db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan        mUpdatesFragmentView = view;
58db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
59db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
6051f1071a1dc91dace0de73be1c5fbba4f091f054Katherine Kuan    /**
6151f1071a1dc91dace0de73be1c5fbba4f091f054Katherine Kuan     * Enable swiping if the detail and update fragments should be showing. Otherwise diable
6251f1071a1dc91dace0de73be1c5fbba4f091f054Katherine Kuan     * swiping if only the detail fragment should be showing.
6351f1071a1dc91dace0de73be1c5fbba4f091f054Katherine Kuan     */
6451f1071a1dc91dace0de73be1c5fbba4f091f054Katherine Kuan    public void enableSwipe(boolean enable) {
6551f1071a1dc91dace0de73be1c5fbba4f091f054Katherine Kuan        mFragmentViewCount = enable ? MAX_FRAGMENT_VIEW_COUNT : 1;
663bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan        notifyDataSetChanged();
673bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan    }
683bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan
69db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    @Override
70db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public int getCount() {
713bbd9a0c3e85262365376ae212f9a8bc521e37d4Katherine Kuan        return mFragmentViewCount;
72db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
73db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
74db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    /** Gets called when the number of items changes. */
75db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    @Override
76db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public int getItemPosition(Object object) {
776feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan        // Always return a valid index for the about fragment view because it's always shown
786feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan        // whether the contact has social updates or not.
79db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan        if (object == mAboutFragmentView) {
80db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan            return INDEX_ABOUT_FRAGMENT;
81db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan        }
826feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan        // Only return a valid index for the updates fragment view if our view count > 1.
836feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan        if (object == mUpdatesFragmentView && mFragmentViewCount > 1) {
84db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan            return INDEX_UPDATES_FRAGMENT;
85db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan        }
866feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan        // Otherwise the view should have no position.
87db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan        return POSITION_NONE;
88db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
89db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
90db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    @Override
91db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public void startUpdate(View container) {
92db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
93db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
94db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    @Override
95db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public Object instantiateItem(View container, int position) {
96db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan        switch (position) {
97db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan            case INDEX_ABOUT_FRAGMENT:
986feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan                mAboutFragmentView.setVisibility(View.VISIBLE);
99db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan                return mAboutFragmentView;
100db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan            case INDEX_UPDATES_FRAGMENT:
1016feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan                mUpdatesFragmentView.setVisibility(View.VISIBLE);
102db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan                return mUpdatesFragmentView;
103db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan        }
104db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan        throw new IllegalArgumentException("Invalid position: " + position);
105db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
106db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
107db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    @Override
108db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public void destroyItem(View container, int position, Object object) {
1096feb0d3fcae55524e66edc1bad4e97ac936ec197Katherine Kuan        ((View) object).setVisibility(View.GONE);
110db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
111db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
112db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    @Override
113db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public void finishUpdate(View container) {
114db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
115db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
116db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    @Override
117db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public boolean isViewFromObject(View view, Object object) {
118db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan        return ((View) object) == view;
119db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
120db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
121db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    @Override
122db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public Parcelable saveState() {
123db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan        return null;
124db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
125db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan
126db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    @Override
127db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    public void restoreState(Parcelable state, ClassLoader loader) {
128db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan    }
129db0d8669cd1ffaa45827edb65b2b0eecb27561f5Katherine Kuan}
130