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