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