1/*
2 * Copyright (C) 2016 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 com.android.settings.dashboard;
18
19import android.app.Activity;
20import android.app.Fragment;
21import android.app.FragmentManager;
22import android.content.Context;
23import android.os.Bundle;
24import android.support.v13.app.FragmentPagerAdapter;
25import android.text.TextUtils;
26import android.view.LayoutInflater;
27import android.view.View;
28import android.view.ViewGroup;
29
30import com.android.internal.logging.MetricsLogger;
31import com.android.internal.logging.MetricsProto;
32import com.android.settings.InstrumentedFragment;
33import com.android.settings.R;
34import com.android.settings.SettingsActivity;
35import com.android.settings.overlay.FeatureFactory;
36import com.android.settings.overlay.SupportFeatureProvider;
37import com.android.settings.widget.RtlCompatibleViewPager;
38import com.android.settings.widget.SlidingTabLayout;
39import com.android.settingslib.drawer.SettingsDrawerActivity;
40
41/**
42 * Container for Dashboard fragments.
43 */
44public final class DashboardContainerFragment extends InstrumentedFragment {
45
46    public static final String EXTRA_SELECT_SETTINGS_TAB = ":settings:select_settings_tab";
47
48    private static final String ARG_SUPPORT_TAB = "SUPPORT";
49    private static final String ARG_SUMMARY_TAB = "SUMMARY";
50    private static final int INDEX_SUMMARY_FRAGMENT = 0;
51    private static final int INDEX_SUPPORT_FRAGMENT = 1;
52
53    private RtlCompatibleViewPager mViewPager;
54    private View mHeaderView;
55    private DashboardViewPagerAdapter mPagerAdapter;
56
57    @Override
58    protected int getMetricsCategory() {
59        return MetricsProto.MetricsEvent.DASHBOARD_CONTAINER;
60    }
61
62    @Override
63    public void onCreate(Bundle savedInstanceState) {
64        super.onCreate(savedInstanceState);
65        setHasOptionsMenu(true);
66    }
67
68    @Override
69    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
70        final View content = inflater.inflate(R.layout.dashboard_container, parent, false);
71        mViewPager = (RtlCompatibleViewPager) content.findViewById(R.id.pager);
72        mPagerAdapter = new DashboardViewPagerAdapter(getContext(),
73                getChildFragmentManager(), mViewPager);
74        mViewPager.setAdapter(mPagerAdapter);
75        mViewPager.addOnPageChangeListener(
76                new TabChangeListener((SettingsActivity) getActivity()));
77
78        // check if support tab needs to be selected
79        final String selectedTab = getArguments().
80            getString(EXTRA_SELECT_SETTINGS_TAB, ARG_SUMMARY_TAB);
81        if (TextUtils.equals(selectedTab, ARG_SUPPORT_TAB)) {
82            mViewPager.setCurrentItem(INDEX_SUPPORT_FRAGMENT);
83        } else {
84            mViewPager.setCurrentItem(INDEX_SUMMARY_FRAGMENT);
85        }
86
87        mHeaderView = inflater.inflate(R.layout.dashboard_container_header, parent, false);
88        ((SlidingTabLayout) mHeaderView).setViewPager(mViewPager);
89        return content;
90    }
91
92    @Override
93    public void onResume() {
94        super.onResume();
95        if (mPagerAdapter.getCount() > 1) {
96            final Activity activity = getActivity();
97            if (activity instanceof SettingsDrawerActivity) {
98                ((SettingsDrawerActivity) getActivity()).setContentHeaderView(mHeaderView);
99            }
100        }
101    }
102
103    private static final class DashboardViewPagerAdapter extends FragmentPagerAdapter {
104
105        private final Context mContext;
106        private final SupportFeatureProvider mSupportFeatureProvider;
107        private final RtlCompatibleViewPager mViewPager;
108
109        public DashboardViewPagerAdapter(Context context, FragmentManager fragmentManager,
110                RtlCompatibleViewPager viewPager) {
111            super(fragmentManager);
112            mContext = context;
113            mSupportFeatureProvider =
114                    FeatureFactory.getFactory(context).getSupportFeatureProvider(context);
115            mViewPager = viewPager;
116        }
117
118        @Override
119        public CharSequence getPageTitle(int position) {
120            switch (position) {
121                case INDEX_SUMMARY_FRAGMENT:
122                    return mContext.getString(R.string.page_tab_title_summary);
123                case INDEX_SUPPORT_FRAGMENT:
124                    return mContext.getString(R.string.page_tab_title_support);
125            }
126            return super.getPageTitle(position);
127        }
128
129        @Override
130        public Fragment getItem(int position) {
131            switch (position) {
132                case INDEX_SUMMARY_FRAGMENT:
133                    return new DashboardSummary();
134                case INDEX_SUPPORT_FRAGMENT:
135                    return new SupportFragment();
136                default:
137                    throw new IllegalArgumentException(
138                            String.format(
139                                    "Position %d does not map to a valid dashboard fragment",
140                                    position));
141            }
142        }
143
144        @Override
145        public Object instantiateItem(ViewGroup container, int position) {
146            return super.instantiateItem(container,
147                    mViewPager.getRtlAwareIndex(position));
148        }
149
150        @Override
151        public int getCount() {
152            return mSupportFeatureProvider == null ? 1 : 2;
153        }
154    }
155
156    private static final class TabChangeListener
157            implements RtlCompatibleViewPager.OnPageChangeListener {
158
159        private final SettingsActivity mActivity;
160
161        public TabChangeListener(SettingsActivity activity) {
162            mActivity = activity;
163        }
164
165        @Override
166        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
167            // Do nothing.
168        }
169
170        @Override
171        public void onPageScrollStateChanged(int state) {
172            // Do nothing
173        }
174
175        @Override
176        public void onPageSelected(int position) {
177            switch (position) {
178                case INDEX_SUMMARY_FRAGMENT:
179                    MetricsLogger.action(
180                            mActivity, MetricsProto.MetricsEvent.ACTION_SELECT_SUMMARY);
181                    mActivity.setDisplaySearchMenu(true);
182                    break;
183                case INDEX_SUPPORT_FRAGMENT:
184                    MetricsLogger.action(
185                            mActivity, MetricsProto.MetricsEvent.ACTION_SELECT_SUPPORT_FRAGMENT);
186                    mActivity.setDisplaySearchMenu(false);
187                    break;
188            }
189        }
190    }
191}
192