1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.documentsui.ui; 18 19 import android.app.Activity; 20 import android.app.ProgressDialog; 21 import android.content.DialogInterface; 22 import android.os.Handler; 23 import android.os.Message; 24 import android.text.format.DateUtils; 25 26 import com.android.documentsui.R; 27 import com.android.documentsui.services.FileOperation; 28 import com.android.documentsui.services.FileOperationService.MessageType; 29 import com.android.documentsui.services.FileOperationService.OpType; 30 import com.android.documentsui.services.FileOperationService; 31 import com.android.documentsui.services.FileOperations; 32 33 import android.support.annotation.StringRes; 34 import android.util.Log; 35 36 public class OperationProgressDialog { 37 38 private final Activity mActivity; 39 private final ProgressDialog mDialog; 40 private final String mJobId; 41 42 private OperationProgressDialog(Activity activity, String jobId, @StringRes int titleResId, 43 @StringRes int prepareResId, final FileOperation operation) { 44 mActivity = activity; 45 mJobId = jobId; 46 mDialog = new ProgressDialog(mActivity); 47 mDialog.setTitle(mActivity.getString(titleResId)); 48 mDialog.setMessage(mActivity.getString(prepareResId)); 49 mDialog.setProgress(0); 50 mDialog.setMax(100); 51 mDialog.setIndeterminate(true); 52 mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 53 mDialog.setCanceledOnTouchOutside(false); 54 55 mDialog.setButton(ProgressDialog.BUTTON_NEGATIVE, 56 activity.getString(android.R.string.cancel), 57 (dialog, button) -> { 58 FileOperations.cancel(mActivity, mJobId); 59 mDialog.dismiss(); 60 }); 61 62 mDialog.setButton(ProgressDialog.BUTTON_NEUTRAL, 63 activity.getString(R.string.continue_in_background), 64 (dialog, button) -> mDialog.dismiss()); 65 66 operation.addMessageListener(new Handler.Callback() { 67 @Override 68 public boolean handleMessage(Message message) { 69 switch (message.what) { 70 case FileOperationService.MESSAGE_PROGRESS: 71 mDialog.setIndeterminate(false); 72 if (message.arg1 != -1) { 73 mDialog.setProgress(message.arg1); 74 } 75 if (message.arg2 > 0) { 76 mDialog.setMessage(mActivity.getString(R.string.copy_remaining, 77 DateUtils.formatDuration(message.arg2))); 78 } 79 return true; 80 case FileOperationService.MESSAGE_FINISH: 81 operation.removeMessageListener(this); 82 mDialog.dismiss(); 83 return true; 84 } 85 return false; 86 } 87 }); 88 } 89 90 public static OperationProgressDialog create(Activity activity, String jobId, 91 FileOperation operation) { 92 int titleResId; 93 int prepareResId; 94 switch (operation.getOpType()) { 95 case FileOperationService.OPERATION_COPY: 96 titleResId = R.string.copy_notification_title; 97 prepareResId = R.string.copy_preparing; 98 break; 99 case FileOperationService.OPERATION_COMPRESS: 100 titleResId = R.string.compress_notification_title; 101 prepareResId = R.string.compress_preparing; 102 break; 103 case FileOperationService.OPERATION_EXTRACT: 104 titleResId = R.string.extract_notification_title; 105 prepareResId = R.string.extract_preparing; 106 break; 107 case FileOperationService.OPERATION_MOVE: 108 titleResId = R.string.move_notification_title; 109 prepareResId = R.string.move_preparing; 110 break; 111 case FileOperationService.OPERATION_DELETE: 112 // Not supported yet. Pass through to default. 113 default: 114 throw new IllegalArgumentException(); 115 } 116 return new OperationProgressDialog(activity, jobId, titleResId, prepareResId, operation); 117 } 118 119 public void dismiss() { 120 mDialog.dismiss(); 121 } 122 123 public void show() { 124 mDialog.show(); 125 } 126 } 127