view app/src/main/java/com/five_ten_sg/connectbot/util/TransferThread.java @ 465:7c8aebcc882a

request permissions if not already granted
author Carl Byington <carl@five-ten-sg.com>
date Mon, 19 Aug 2019 11:12:40 -0700
parents d29cce60f393
children
line wrap: on
line source

/*
 * TransferThread Class for VX ConnectBot
 * Copyright 2012 Martin Matuska
 *
 * 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.five_ten_sg.connectbot.util;

import java.util.StringTokenizer;

import com.five_ten_sg.connectbot.R;
import com.five_ten_sg.connectbot.service.TerminalBridge;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;

public class TransferThread extends Thread {
    public final static String TAG = "ConnectBot.TransferThread";
    private final Activity activity;
    private final SharedPreferences prefs;
    private String dialogMessage = null;
    private Handler handler = new Handler();
    private TerminalBridge bridge;
    private String files, destName, destFolder;
    private ProgressDialog progress = null;
    private boolean upload;
    private Toast progressToast = null;

    public TransferThread(Activity activity, Handler handler) {
        this.activity = activity;
//      this.handler = handler;
        this.prefs = PreferenceManager.getDefaultSharedPreferences(this.activity);
    }

    public void setProgressDialogMessage(String message) {
        this.dialogMessage = message;
    }

    public void download(TerminalBridge bridge, String files, String destName, String destFolder) {
        this.bridge = bridge;
        this.files = files;
        this.destName = destName;
        this.destFolder = destFolder;
        this.upload = false;
        this.configureProgressDialog();
        this.start();
    }

    public void upload(TerminalBridge bridge, String files, String destName, String destFolder) {
        this.bridge = bridge;
        this.files = files;
        this.destName = destName;
        this.destFolder = destFolder;
        this.upload = true;
        this.configureProgressDialog();
        this.start();
    }

    @Override
    public void run() {
        if (this.activity == null || this.handler == null || this.bridge == null)
            return;

        Log.d(TAG, "Requested " + (upload ? "upload" : "download") + " of [" + files + "]");
        Resources res = activity.getResources();
        String fail = "";

        try {
            StringTokenizer fileSet = new StringTokenizer(files, "\n");

            while (fileSet.hasMoreTokens()) {
                String file = fileSet.nextToken();
                final String newMessage = res.getString(upload ? R.string.transfer_uploading_file : R.string.transfer_downloading_file, file);
                handler.post(new Runnable() {
                    public void run() {
                        if (prefs.getBoolean(PreferenceConstants.BACKGROUND_FILE_TRANSFER, true)) {
                            if (progressToast == null)
                                progressToast = Toast.makeText(activity, newMessage, Toast.LENGTH_LONG);
                            else
                                progressToast.setText(newMessage);

                            progressToast.show();
                        }
                        else if (progress != null) {
                            progress.setMessage(newMessage);
                        }
                    }
                });
                boolean success = (upload ? bridge.uploadFile(file, destName, destFolder, null) : bridge.downloadFile(file, destFolder));

                if (! success)
                    fail += " " + file;
            }
        }
        finally {
            final String failMessage = (fail.length() == 0 ? null : res.getString(upload ? R.string.transfer_upload_failed : R.string.transfer_download_failed, fail));
            final String sucMessage = (res.getString(upload ? R.string.transfer_upload_complete : R.string.transfer_download_complete));
            handler.post(new Runnable() {
                public void run() {
                    if (progress != null)
                        progress.dismiss();

                    if (prefs.getBoolean(PreferenceConstants.BACKGROUND_FILE_TRANSFER, true)) {
                        Toast.makeText(activity,
                                       failMessage != null ? failMessage : sucMessage,
                                       Toast.LENGTH_LONG)
                        .show();
                    }
                    else if (failMessage != null) {
                        new AlertDialog.Builder(activity)
                        .setMessage(failMessage)
                        .setNegativeButton(android.R.string.ok, null).create().show();
                    }
                }
            });
        }
    }

    private void configureProgressDialog() {
        if (dialogMessage != null)
            progress = fileProgressDialog(activity, this.dialogMessage);
        else
            progress = null;
    }

    private ProgressDialog fileProgressDialog(Activity activity, String message) {
        ProgressDialog progress = new ProgressDialog(activity);
        progress.setIndeterminate(true);
        progress.setMessage(message);
        progress.setCancelable(false);
        progress.show();
        return progress;
    }
}