1ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav/* 2ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * Copyright (C) 2015 The Android Open Source Project 3ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * 4ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * Licensed under the Apache License, Version 2.0 (the "License"); 5ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * you may not use this file except in compliance with the License. 6ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * You may obtain a copy of the License at 7ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * 8ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * http://www.apache.org/licenses/LICENSE-2.0 9ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * 10ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * Unless required by applicable law or agreed to in writing, software 11ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * distributed under the License is distributed on an "AS IS" BASIS, 12ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * See the License for the specific language governing permissions and 14ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * limitations under the License. 15ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav */ 16ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 17ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavpackage com.android.packageinstaller.permission.ui.handheld; 18ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 19ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavimport android.os.Bundle; 20ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavimport android.preference.PreferenceFragment; 21ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavimport android.view.LayoutInflater; 22ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavimport android.view.View; 23ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavimport android.view.ViewGroup; 24ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavimport android.view.animation.Animation; 25ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavimport android.view.animation.Animation.AnimationListener; 26ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavimport android.view.animation.AnimationUtils; 27ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavimport android.widget.ListView; 28ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavimport android.widget.TextView; 29ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavimport com.android.packageinstaller.R; 30ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 31ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslavpublic abstract class PermissionsFrameFragment extends PreferenceFragment { 32ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav private ViewGroup mPreferencesContainer; 33ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 34ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav private View mLoadingView; 35ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav private ViewGroup mPrefsView; 36ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav private boolean mIsLoading; 37ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 38ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav /** 39ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * Returns the view group that holds the preferences objects. This will 40ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav * only be set after {@link #onCreateView} has been called. 41ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav */ 42ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav protected final ViewGroup getPreferencesContainer() { 43ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav return mPreferencesContainer; 44ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 45ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 46ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav @Override 47ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav public View onCreateView(LayoutInflater inflater, ViewGroup container, 48ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav Bundle savedInstanceState) { 49ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.permissions_frame, container, 50ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav false); 51ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav mPrefsView = (ViewGroup) rootView.findViewById(R.id.prefs_container); 52ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav if (mPrefsView == null) { 53ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav mPrefsView = rootView; 54ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 55ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav mLoadingView = rootView.findViewById(R.id.loading_container); 56ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav mPreferencesContainer = (ViewGroup) super.onCreateView( 57ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav inflater, mPrefsView, savedInstanceState); 58ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav setLoading(mIsLoading, false, true /* force */); 59ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav mPrefsView.addView(mPreferencesContainer); 60ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav return rootView; 61ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 62ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 63ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav protected void setLoading(boolean loading, boolean animate) { 64ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav setLoading(loading, animate, false); 65ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 66ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 67ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav private void setLoading(boolean loading, boolean animate, boolean force) { 68ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav if (mIsLoading != loading || force) { 69ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav mIsLoading = loading; 70ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav if (getView() == null) { 71ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav // If there is no created view, there is no reason to animate. 72ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav animate = false; 73ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 74ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav if (mPrefsView != null) { 75ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav setViewShown(mPrefsView, !loading, animate); 76ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 77ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav if (mLoadingView != null) { 78ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav setViewShown(mLoadingView, loading, animate); 79ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 80ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 81ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 82ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 83ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav @Override 84ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav public ListView getListView() { 85ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav ListView listView = super.getListView(); 86ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav if (listView.getEmptyView() == null) { 87ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav TextView emptyView = (TextView) getView().findViewById(R.id.no_permissions); 88ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav listView.setEmptyView(emptyView); 89ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 90ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav return listView; 91ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 92ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 93ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav private void setViewShown(final View view, boolean shown, boolean animate) { 94ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav if (animate) { 95ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav Animation animation = AnimationUtils.loadAnimation(getContext(), 96ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav shown ? android.R.anim.fade_in : android.R.anim.fade_out); 97ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav if (shown) { 98ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav view.setVisibility(View.VISIBLE); 99ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } else { 100ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav animation.setAnimationListener(new AnimationListener() { 101ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav @Override 102ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav public void onAnimationStart(Animation animation) { 103ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 104ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 105ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav @Override 106ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav public void onAnimationRepeat(Animation animation) { 107ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 108ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav 109ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav @Override 110ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav public void onAnimationEnd(Animation animation) { 111ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav view.setVisibility(View.INVISIBLE); 112ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 113ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav }); 114ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 115ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav view.startAnimation(animation); 116ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } else { 117ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav view.clearAnimation(); 118ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav view.setVisibility(shown ? View.VISIBLE : View.INVISIBLE); 119ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 120ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav } 121ef861375eebd9ac6cce7c0bb163380ab1c951063Svetoslav} 122