1684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnatapackage android.support.v17.leanback.app;
2684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
3684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnataimport android.os.Handler;
4684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnataimport android.view.Gravity;
5684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnataimport android.view.View;
6684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnataimport android.view.ViewGroup;
7684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnataimport android.widget.FrameLayout;
8684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnataimport android.widget.ProgressBar;
9684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
10684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata/**
11684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata * Manager for showing/hiding progress bar widget. This class lets user specify an initial
12684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata * delay after which the progress bar will be shown. This is currently being used in
13684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata * {@link BrowseFragment} & {@link VerticalGridFragment} to show {@link ProgressBar}
14684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata * while the data is being loaded.
15684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata */
16684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnatapublic final class ProgressBarManager {
17684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    // Default delay for progress bar widget.
18684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    private static final long DEFAULT_PROGRESS_BAR_DELAY = 1000;
19684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
20684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    private long mInitialDelay = DEFAULT_PROGRESS_BAR_DELAY;
2199ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    ViewGroup rootView;
2299ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    View mProgressBarView;
23684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    private Handler mHandler = new Handler();
2499ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    boolean mEnableProgressBar = true;
2599ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    boolean mUserProvidedProgressBar;
2699ec8b0cb375f7e5577ea3ec9f09e6ff7a95de0dAurimas Liutikas    boolean mIsShowing;
27684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
28684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    private Runnable runnable = new Runnable() {
29684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        @Override
30684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        public void run() {
316bab657cffc32270d494ab47f469658f14e17c56susnata            if (!mEnableProgressBar || (!mUserProvidedProgressBar && rootView == null)) {
32684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata                return;
33684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata            }
34684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
356bab657cffc32270d494ab47f469658f14e17c56susnata            if (mIsShowing) {
366bab657cffc32270d494ab47f469658f14e17c56susnata                if (mProgressBarView == null) {
376bab657cffc32270d494ab47f469658f14e17c56susnata                    mProgressBarView = new ProgressBar(
386bab657cffc32270d494ab47f469658f14e17c56susnata                            rootView.getContext(), null, android.R.attr.progressBarStyleLarge);
396bab657cffc32270d494ab47f469658f14e17c56susnata                    FrameLayout.LayoutParams progressBarParams = new FrameLayout.LayoutParams(
406bab657cffc32270d494ab47f469658f14e17c56susnata                            FrameLayout.LayoutParams.WRAP_CONTENT,
416bab657cffc32270d494ab47f469658f14e17c56susnata                            FrameLayout.LayoutParams.WRAP_CONTENT);
426bab657cffc32270d494ab47f469658f14e17c56susnata                    progressBarParams.gravity = Gravity.CENTER;
436bab657cffc32270d494ab47f469658f14e17c56susnata                    rootView.addView(mProgressBarView, progressBarParams);
446bab657cffc32270d494ab47f469658f14e17c56susnata                } else if (mUserProvidedProgressBar) {
456bab657cffc32270d494ab47f469658f14e17c56susnata                    mProgressBarView.setVisibility(View.VISIBLE);
466bab657cffc32270d494ab47f469658f14e17c56susnata                }
47684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata            }
48684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        }
49684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    };
50684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
51684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    /**
52684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * Sets the root view on which the progress bar will be attached. This class assumes the
53684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * root view to be {@link FrameLayout} in order to position the progress bar widget
54684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * in the center of the screen.
55684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     *
56684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * @param rootView view that will contain the progress bar.
57684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     */
58684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    public void setRootView(ViewGroup rootView) {
59684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        this.rootView = rootView;
60684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    }
61684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
62684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    /**
63684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * Displays the progress bar.
64684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     */
65684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    public void show() {
66684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        if (mEnableProgressBar) {
676bab657cffc32270d494ab47f469658f14e17c56susnata            mIsShowing = true;
68684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata            mHandler.postDelayed(runnable, mInitialDelay);
69684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        }
70684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    }
71684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
72684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    /**
73684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * Hides the progress bar.
74684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     */
75684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    public void hide() {
76684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        mIsShowing = false;
77684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        if (mUserProvidedProgressBar) {
78684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata            mProgressBarView.setVisibility(View.INVISIBLE);
79684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        } else if (mProgressBarView != null) {
80684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata            rootView.removeView(mProgressBarView);
81684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        }
82684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
83684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        mHandler.removeCallbacks(runnable);
84684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    }
85684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
86684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    /**
87684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * Sets a custom view to be shown in place of the default {@link ProgressBar}. This
88684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * view must have a parent. Once set, we maintain the visibility property of this view.
89684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     *
90684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * @param progressBarView custom view that will be shown to indicate progress.
91684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     */
92684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    public void setProgressBarView(View progressBarView) {
93684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        if (progressBarView.getParent() == null) {
94684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata            throw new IllegalArgumentException("Must have a parent");
95684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        }
96684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
97684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        this.mProgressBarView = progressBarView;
98684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        this.mProgressBarView.setVisibility(View.INVISIBLE);
99684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        mUserProvidedProgressBar = true;
100684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    }
101684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
102684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    /**
103684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * Returns the initial delay.
104684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     */
105684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    public long getInitialDelay() {
106684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        return mInitialDelay;
107684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    }
108684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
109684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    /**
110684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * Sets the initial delay. Progress bar will be shown after this delay has elapsed.
111684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     *
112684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * @param initialDelay millisecond representing the initial delay.
113684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     */
114684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    public void setInitialDelay(long initialDelay) {
115684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        this.mInitialDelay = initialDelay;
116684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    }
117684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
118684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    /**
119684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * Disables progress bar.
120684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     */
121684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    public void disableProgressBar() {
122684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        mEnableProgressBar = false;
123684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    }
124684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata
125684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    /**
126684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     * Enables progress bar.
127684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata     */
128684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    public void enableProgressBar() {
129684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata        mEnableProgressBar = true;
130684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata    }
131684f4a94f6f55b2abc5ed2677dfdfc9501dd6407susnata}
132