Home | History | Annotate | Download | only in ui
      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