1fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira/**
2fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * Copyright (c) 2011, Google Inc.
3fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira *
4fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * Licensed under the Apache License, Version 2.0 (the "License");
5fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * you may not use this file except in compliance with the License.
6fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * You may obtain a copy of the License at
7fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira *
8fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira *     http://www.apache.org/licenses/LICENSE-2.0
9fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira *
10fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * Unless required by applicable law or agreed to in writing, software
11fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * distributed under the License is distributed on an "AS IS" BASIS,
12fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * See the License for the specific language governing permissions and
14fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * limitations under the License.
15fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira */
1630e2c24b056542f3b1b438aeb798305d1226d0c8Andy Huangpackage com.android.mail;
17fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
18fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereiraimport android.content.Context;
19fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereiraimport android.os.Handler;
20fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereiraimport android.util.AttributeSet;
21fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereiraimport android.view.View;
22fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereiraimport android.widget.ProgressBar;
23fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
24fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira/**
25fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * MinTimeProgressView implements a ProgressBar that waits MIN_DELAY ms to be
26fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * dismissed before showing. Once visible, the progress bar will be visible for
27fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * at least MIN_SHOW_TIME to avoid "flashes" in the UI when an event could take
28fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * a largely variable time to complete (from none, to a user perceivable amount)
29fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira *
30fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira * @author mindyp
31fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira */
32fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereirapublic class MinTimeProgressView extends ProgressBar {
33fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    private static int sMinShowTime;
34fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
35fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    private static int sMinDelay;
36fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
37fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    private long mStartTime = -1;
38fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
39fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    private final Handler mHandler = new Handler();
40fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
41fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    private boolean mDismissed = false;
42fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
43fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    public MinTimeProgressView(Context context) {
44fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        this(context, null);
45fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    }
46fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
47fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    public MinTimeProgressView(Context context, AttributeSet attrs) {
48fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        super(context, attrs, R.style.MinTimeProgressViewStyle);
49fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        sMinShowTime = context.getResources()
50fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            .getInteger(R.integer.html_conv_progress_display_time);
51fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        sMinDelay = context.getResources()
52fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            .getInteger(R.integer.html_conv_progress_wait_time);
53fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    }
54fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
55fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    private final Runnable mDelayedHide = new Runnable() {
569e2d407fdafeb874e640eb84017feaf784309075Scott Kennedy        @Override
57fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        public void run() {
58fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            MinTimeProgressView.super.setVisibility(View.GONE);
59fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        }
60fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    };
61fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
62fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    private final Runnable mDelayedShow = new Runnable() {
639e2d407fdafeb874e640eb84017feaf784309075Scott Kennedy        @Override
64fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        public void run() {
65fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            if (!mDismissed) {
66fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira                mStartTime = System.currentTimeMillis();
67fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira                MinTimeProgressView.super.setVisibility(View.VISIBLE);
68fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            }
69fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        }
70fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    };
71fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
72fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    private void hide() {
73fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        mDismissed = true;
74fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        long diff = System.currentTimeMillis() - mStartTime;
75fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        if (diff >= sMinShowTime || mStartTime == -1) {
76fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            // The progress spinner has been shown long enough
77fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            // OR was not shown yet. If it wasn't shown yet,
78fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            // it will just never be shown.
79fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            MinTimeProgressView.super.setVisibility(View.GONE);
80fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        } else {
81fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            // The progress spinner is shown, but not long enough,
82fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            // so put a delayed message in to hide it when its been
83fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            // shown long enough.
84fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            mHandler.postDelayed(mDelayedHide, sMinShowTime - diff);
85fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        }
86fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    }
87fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
88fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    private void show() {
89fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        // Reset the start time.
90fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        mStartTime = -1;
91fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        mHandler.postDelayed(mDelayedShow, sMinDelay);
92fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    }
93fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira
94fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    @Override
95fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    public void setVisibility(int visibility) {
96fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        // Whenever the visibility gets changed, clear dismissed
97fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        // state.
98fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        mDismissed = false;
99fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        switch (visibility) {
100fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            case View.VISIBLE:
101fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira                show();
102fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira                break;
103fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            case View.GONE:
104fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira                hide();
105fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira                break;
106fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira            default:
107fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira                super.setVisibility(visibility);
108fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira        }
109fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira    }
110fdd984b69cabc5951eec269a23d42898ea70360fMindy Pereira}
111