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