| /** |
| * Copyright (c) 2011, Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.android.mail; |
| |
| import android.content.Context; |
| import android.os.Handler; |
| import android.util.AttributeSet; |
| import android.view.View; |
| import android.widget.ProgressBar; |
| |
| /** |
| * MinTimeProgressView implements a ProgressBar that waits MIN_DELAY ms to be |
| * dismissed before showing. Once visible, the progress bar will be visible for |
| * at least MIN_SHOW_TIME to avoid "flashes" in the UI when an event could take |
| * a largely variable time to complete (from none, to a user perceivable amount) |
| * |
| * @author mindyp |
| */ |
| public class MinTimeProgressView extends ProgressBar { |
| private static int sMinShowTime; |
| |
| private static int sMinDelay; |
| |
| private long mStartTime = -1; |
| |
| private final Handler mHandler = new Handler(); |
| |
| private boolean mDismissed = false; |
| |
| public MinTimeProgressView(Context context) { |
| this(context, null); |
| } |
| |
| public MinTimeProgressView(Context context, AttributeSet attrs) { |
| super(context, attrs, R.style.MinTimeProgressViewStyle); |
| sMinShowTime = context.getResources() |
| .getInteger(R.integer.html_conv_progress_display_time); |
| sMinDelay = context.getResources() |
| .getInteger(R.integer.html_conv_progress_wait_time); |
| } |
| |
| private final Runnable mDelayedHide = new Runnable() { |
| @Override |
| public void run() { |
| MinTimeProgressView.super.setVisibility(View.GONE); |
| } |
| }; |
| |
| private final Runnable mDelayedShow = new Runnable() { |
| @Override |
| public void run() { |
| if (!mDismissed) { |
| mStartTime = System.currentTimeMillis(); |
| MinTimeProgressView.super.setVisibility(View.VISIBLE); |
| } |
| } |
| }; |
| |
| private void hide() { |
| mDismissed = true; |
| long diff = System.currentTimeMillis() - mStartTime; |
| if (diff >= sMinShowTime || mStartTime == -1) { |
| // The progress spinner has been shown long enough |
| // OR was not shown yet. If it wasn't shown yet, |
| // it will just never be shown. |
| MinTimeProgressView.super.setVisibility(View.GONE); |
| } else { |
| // The progress spinner is shown, but not long enough, |
| // so put a delayed message in to hide it when its been |
| // shown long enough. |
| mHandler.postDelayed(mDelayedHide, sMinShowTime - diff); |
| } |
| } |
| |
| private void show() { |
| // Reset the start time. |
| mStartTime = -1; |
| mHandler.postDelayed(mDelayedShow, sMinDelay); |
| } |
| |
| @Override |
| public void setVisibility(int visibility) { |
| // Whenever the visibility gets changed, clear dismissed |
| // state. |
| mDismissed = false; |
| switch (visibility) { |
| case View.VISIBLE: |
| show(); |
| break; |
| case View.GONE: |
| hide(); |
| break; |
| default: |
| super.setVisibility(visibility); |
| } |
| } |
| } |