118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn/** 218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * Copyright (C) 2013 The Android Open Source Project 318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * 418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); you may not 518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * use this file except in compliance with the License. You may obtain a copy 618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * of the License at 718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * 818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * 1018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 1218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 1318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * License for the specific language governing permissions and limitations 1418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn * under the License. 1518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn */ 1618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 17a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornpackage com.android.settings.applications; 18a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 19a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornimport android.app.Fragment; 20a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornimport android.app.FragmentManager; 2155eaa96fe44ab473975fd2d9b3d97836935752feAlan Viveretteimport android.content.res.TypedArray; 22a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornimport android.os.Bundle; 23a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornimport android.preference.PreferenceFrameLayout; 24a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornimport android.support.v13.app.FragmentPagerAdapter; 25a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornimport android.support.v4.view.PagerTabStrip; 26a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornimport android.support.v4.view.ViewPager; 27a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornimport android.view.LayoutInflater; 28a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornimport android.view.View; 29a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornimport android.view.ViewGroup; 30a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 318a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger; 328a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.settings.InstrumentedFragment; 33a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackbornimport com.android.settings.R; 34a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 358a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenpublic class AppOpsSummary extends InstrumentedFragment { 36a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn // layout inflater object used to inflate views 37a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn private LayoutInflater mInflater; 38a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 39a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn private ViewGroup mContentContainer; 40a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn private View mRootView; 41a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn private ViewPager mViewPager; 42a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 43a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn CharSequence[] mPageNames; 4418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn static AppOpsState.OpsTemplate[] sPageTemplates = new AppOpsState.OpsTemplate[] { 4518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn AppOpsState.LOCATION_TEMPLATE, 4618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn AppOpsState.PERSONAL_TEMPLATE, 47983378738761150d8ba649b4b1d74635881e61ecDianne Hackborn AppOpsState.MESSAGING_TEMPLATE, 486e91babedac9983b10fdf2650de86386800017beDianne Hackborn AppOpsState.MEDIA_TEMPLATE, 4918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn AppOpsState.DEVICE_TEMPLATE 50228df665d4c98e267dce3f529ab953046cd03e5bDianne Hackborn }; 51a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 52a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn int mCurPos; 53a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 548a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 558a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 568a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren return MetricsLogger.APP_OPS_SUMMARY; 578a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 588a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 59a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn class MyPagerAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener { 60a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 61a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn public MyPagerAdapter(FragmentManager fm) { 62a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn super(fm); 63a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn } 64a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 65a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn @Override 66a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn public Fragment getItem(int position) { 6718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn return new AppOpsCategory(sPageTemplates[position]); 68a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn } 69a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 70a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn @Override 71a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn public int getCount() { 7218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn return sPageTemplates.length; 73a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn } 74a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 75a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn @Override 76a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn public CharSequence getPageTitle(int position) { 77a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn return mPageNames[position]; 78a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn } 79a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 80a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn @Override 81a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 82a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn } 83a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 84a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn @Override 85a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn public void onPageSelected(int position) { 86a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn mCurPos = position; 87a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn } 88a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 89a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn @Override 90a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn public void onPageScrollStateChanged(int state) { 91a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn if (state == ViewPager.SCROLL_STATE_IDLE) { 92a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn //updateCurrentTab(mCurPos); 93a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn } 94a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn } 95a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn } 96a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 97a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn @Override 98a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 99a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn // initialize the inflater 100a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn mInflater = inflater; 101a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 102a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn View rootView = mInflater.inflate(R.layout.app_ops_summary, 103a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn container, false); 104a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn mContentContainer = container; 105a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn mRootView = rootView; 106a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 107a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn mPageNames = getResources().getTextArray(R.array.app_ops_categories); 108a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 109a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn mViewPager = (ViewPager) rootView.findViewById(R.id.pager); 110a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn MyPagerAdapter adapter = new MyPagerAdapter(getChildFragmentManager()); 111a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn mViewPager.setAdapter(adapter); 112a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn mViewPager.setOnPageChangeListener(adapter); 113a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs); 11455eaa96fe44ab473975fd2d9b3d97836935752feAlan Viverette 11555eaa96fe44ab473975fd2d9b3d97836935752feAlan Viverette // This should be set in the XML layout, but PagerTabStrip lives in 11655eaa96fe44ab473975fd2d9b3d97836935752feAlan Viverette // support-v4 and doesn't have styleable attributes. 11755eaa96fe44ab473975fd2d9b3d97836935752feAlan Viverette final TypedArray ta = tabs.getContext().obtainStyledAttributes( 11855eaa96fe44ab473975fd2d9b3d97836935752feAlan Viverette new int[] { android.R.attr.colorAccent }); 11955eaa96fe44ab473975fd2d9b3d97836935752feAlan Viverette final int colorAccent = ta.getColor(0, 0); 12055eaa96fe44ab473975fd2d9b3d97836935752feAlan Viverette ta.recycle(); 12155eaa96fe44ab473975fd2d9b3d97836935752feAlan Viverette 12255eaa96fe44ab473975fd2d9b3d97836935752feAlan Viverette tabs.setTabIndicatorColorResource(colorAccent); 123a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 124a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn // We have to do this now because PreferenceFrameLayout looks at it 125a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn // only when the view is added. 126a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn if (container instanceof PreferenceFrameLayout) { 127a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true; 128a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn } 129a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn 130a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn return rootView; 131a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn } 132a522a8ef8233382bbd39308b7d5f2e26eed44d22Dianne Hackborn} 133