blob: 3ac461dea4c383833cb2f63e3bb5259c2f18eec0 [file] [log] [blame]
/**
* 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.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnShowListener;
import android.os.Handler;
/**
* MinTimeProgressDialog implements a ProgressDialog that waits MIN_DELAY ms to
* be dismissed before showing. Once visible, the dialog 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 MinTimeProgressDialog extends ProgressDialog implements OnShowListener {
private static int sMinShowTime;
private static int sMinDelay;
private int mMinShowTime = -1;
private long mStartTime = -1;
private boolean mDismissed = false;
private final Handler mHandler = new Handler();
private final Runnable mDelayedDismiss = new Runnable() {
@Override
public void run() {
MinTimeProgressDialog.super.dismiss();
}
};
private final Runnable mDelayedShow = new Runnable() {
@Override
public void run() {
if (!mDismissed) {
MinTimeProgressDialog.super.show();
}
}
};
public MinTimeProgressDialog(Context context) {
super(context, R.style.MinTimeProgressDialogStyle);
sMinShowTime = context.getResources()
.getInteger(R.integer.batch_progress_display_time);
sMinDelay = context.getResources()
.getInteger(R.integer.batch_progress_wait_time);
mMinShowTime = sMinShowTime
+ context.getResources().getInteger(R.integer.dialog_animationDefaultDur);
}
@Override
public void dismiss() {
mDismissed = true;
long diff = System.currentTimeMillis() - mStartTime;
if (diff >= mMinShowTime || mStartTime == -1) {
// This covers the case where the dialog was not shown
// at all yet OR enough time of the dialog showing
// has passed. If it wasn't shown at all yet, then it is
// just never shown.
super.dismiss();
} else {
mHandler.postDelayed(mDelayedDismiss, mMinShowTime - diff);
}
}
/**
* Dismiss the dialog, immediately if necessary.
*
* @param force If true, dismiss the dialog right away.
*/
public void dismiss(boolean force) {
if (force) {
mDismissed = true;
super.dismiss();
} else {
dismiss();
}
}
@Override
public void show() {
mDismissed = false;
mHandler.postDelayed(mDelayedShow, sMinDelay);
}
@Override
public void onShow(DialogInterface dialog) {
// When the dialog is actually shown, start the timer.
mStartTime = System.currentTimeMillis();
}
/**
* Show a MinTimeProgressDialog.
*/
public static MinTimeProgressDialog show(Context context, CharSequence title,
CharSequence message, boolean indeterminate, boolean cancelable,
OnCancelListener cancelListener) {
MinTimeProgressDialog dialog = new MinTimeProgressDialog(context);
dialog.setTitle(title);
dialog.setMessage(message);
dialog.setIndeterminate(indeterminate);
dialog.setCancelable(cancelable);
dialog.setOnCancelListener(cancelListener);
dialog.setOnShowListener(dialog);
dialog.show();
return dialog;
}
}