拷貝文件

代碼塊
package com.oushang.factorymode.config.mvp.view;

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.oushang.factorymode.common.BaseFragment;
import com.oushang.factorymode.config.R;
import com.oushang.factorymode.config.utils.NaviFileUtils;

import java.io.File;

/**
 * Created by Android Studio.
 * User: li.yuan34
 * Date: 2020/5/27
 * Time: 10:19
 */
public class ConfigNaviFragment extends BaseFragment implements OnClickListener {
    private static final String TAG = "NaviFac_Fragment";
    public static final String ACTIVATION_CODE_FROM_FILE = "/storage/usbotg/AutoNaviData/ReLoginCode.csv";
    public static final String ACTIVATION_CODE_TO_FOLDER = "/oem/AutoNaviData";
    public static final String ACTIVATION_CODE_FILE_NAME = "ReLoginCode.csv";



    private static final String OFFLINE_DATA_FROM_FOLDER_PATH = "/storage/usbotg/AutoNaviData/chn";
    private static final String OFFLINE_DATA_TO_FOLDER_PATH = "/navi/AutoNaviData/chn";

    private static final String FROM_MD5_FOLDER_PATH = "/storage/usbotg/AutoNaviData/md5";
    private static final String FROM_COPY_MD5_FOLDER_PATH = "/navi/AutoNaviData/md5";
    private static final String TO_MD5_FOLDER_PATH = "/navi/md5";
    private static final String OFFLINE_DATA_MD5_FILE_NAME = "chnmd5.txt";

    private static final String OFFLINE_DATA_FROM_MD5_FILE_PATH = FROM_MD5_FOLDER_PATH + "/" + OFFLINE_DATA_MD5_FILE_NAME;
    private static final String OFFLINE_DATA_FROM_COPY_MD5_FILE_PATH = FROM_COPY_MD5_FOLDER_PATH + "/" + OFFLINE_DATA_MD5_FILE_NAME;
    private static final String OFFLINE_DATA_TO_MD5_FILE_PATH = TO_MD5_FOLDER_PATH + "/" + OFFLINE_DATA_MD5_FILE_NAME;

    private static final int ACTION_DEFAULT = -100;
    private static final int ACTION_COPY_ACTIVATION_CODE = 0;
    private static final int ACTION_COPY_OFFLINE_DATA = 1;
    private static final int ACTION_MD5_OFFLINE_DATA = 2;
    private static final int ACTION_DELETE_OFFLINE_DATA = 3;
    private static final int ACTION_CREATE_OFFLINE_DATA_MD5 = 4;
    private static final int ACTION_COPE_OFFLINE_DATA_MD5 = 5;

    private static final int CMD_RESULT_DEFAULT = -100;

    private static final int MUIL_CLICK_DURATION = 1000;
    long mLastClickTime;
    int mClickCount;
    boolean mIsVisiable;
    Button mImportBtn;
    Button mCopyButton;
    Button mMD5Button;
    Button mDeleteButton;
    Button mCreateMD5Button;
    Button mCopyMD5Button;
    TextView mTextView;


    Handler mHandler;
    Handler mWorkHandler;
    HandlerThread mWorkThread;

    private static final int WORK_MSG_ACTION = 0;

    private static final int MAIN_MSG_RESULT = 0;

    Context mContext;
    String mText;
    public static boolean mIsProcessRuning = false;
    static int mAction = ACTION_DEFAULT;
    static int mResult = CMD_RESULT_DEFAULT;
    static int mTextColor = Color.GREEN;
    static ConfigNaviFragment mFragment;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView mAction=" + mAction + " mResult=" + mResult + " mIsProcessRuning=" + mIsProcessRuning + " this="+this);
        mView = inflater.inflate(R.layout.config_navi_import_fragment, container, false);
        mHandler = new Handler(Looper.getMainLooper()) {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                Log.d(TAG,"main handleMessage msg.arg1=" + msg.arg1 + " msg.arg2=" + msg.arg2 + "mIsProcessRuning=" + mIsProcessRuning);
                switch (msg.what){
                    case MAIN_MSG_RESULT:
                        if (mFragment != null){
                            mFragment.updateTextView(msg.arg1, msg.arg2);
                        }
                        break;
                    default:
                        break;
                }
            }
        };
        mWorkThread = new HandlerThread("workThread");
        mWorkThread.start();
        mWorkHandler = new WorkHandler(mWorkThread.getLooper());
        mContext = getActivity();
        mFragment = this;
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
        super.onDestroy();
        mFragment = null;
    }

    @Override
    protected void initView() {
        Log.d(TAG, "initView");
        mImportBtn = mView.findViewById(R.id.config_import_navi_btn);
        mCopyButton = mView.findViewById(R.id.copy_button);
        mMD5Button = mView.findViewById(R.id.md5_button);
        mDeleteButton = mView.findViewById(R.id.delete_button);
        mCreateMD5Button = mView.findViewById(R.id.md5_create_button);
        mCopyMD5Button = mView.findViewById(R.id.md5_copy_button);
        mTextView = mView.findViewById(R.id.copy_text);
        updateTextView(mAction, mResult);
    }

    @Override
    protected void initData() {
    }

    @Override
    protected void setAllListener() {
        mImportBtn.setOnClickListener(this);
        mCopyButton.setOnClickListener(this);
        mMD5Button.setOnClickListener(this);
        mDeleteButton.setOnClickListener(this);
        mCreateMD5Button.setOnClickListener(this);
        mCopyMD5Button.setOnClickListener(this);
        mTextView.setOnClickListener(this);
    }


    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.copy_text){//顯示操作狀態(tài)联予,連續(xù)點擊10次可顯示或隱藏刪除杆兵、MD5生成、導(dǎo)入和強行停止選項
            textViewClick();
            return;
        }

        if (mIsProcessRuning){
            Toast.makeText(mContext,getString(R.string.navigation_toast),Toast.LENGTH_SHORT).show();
            return;
        }

        int action = ACTION_DEFAULT;
        if (view.getId() == R.id.config_import_navi_btn){//導(dǎo)入導(dǎo)航激活碼
            action = ACTION_COPY_ACTIVATION_CODE;
        }else if (view.getId() == R.id.copy_button){//從U盤導(dǎo)入離線數(shù)據(jù)和MD5文件
            action = ACTION_COPY_OFFLINE_DATA;
        }else if (view.getId() == R.id.md5_button){//對離線數(shù)據(jù)進行MD5校驗垮庐,即對離線數(shù)據(jù)生成MD5文件爆袍,并與導(dǎo)入的MD5文件進行比對(如果沒有導(dǎo)入則實時對U盤離線數(shù)據(jù)生成MD5文件)
            action = ACTION_MD5_OFFLINE_DATA;
        }else if (view.getId() == R.id.delete_button){//刪除離線數(shù)據(jù)和MD5文件
            action = ACTION_DELETE_OFFLINE_DATA;
        }else if (view.getId() == R.id.md5_create_button){//對U盤離線數(shù)據(jù)生成MD5文件至U盤
            action = ACTION_CREATE_OFFLINE_DATA_MD5;
        }else if (view.getId() == R.id.md5_copy_button){//從U盤導(dǎo)入MD5文件
            action = ACTION_COPE_OFFLINE_DATA_MD5;
        }
        mIsProcessRuning = true;
        mAction = action;
        updateTextView(action);
        Message message = Message.obtain();
        message.what = WORK_MSG_ACTION;
        message.arg1 = mAction;
        mWorkHandler.sendMessage(message);
    }

    private String getDoingString(int action){
        String string = "";
        if (action == ACTION_COPY_ACTIVATION_CODE){
            string = getString(R.string.navigation_activation_code_drive);
        }else if (action == ACTION_COPY_OFFLINE_DATA){
            string = getString(R.string.navigation_offline_data_drive);
        }else if (action == ACTION_MD5_OFFLINE_DATA){
            string = getString(R.string.navigation_checkout_offline_data_drive);
        }else if (action == ACTION_DELETE_OFFLINE_DATA){
            string = getString(R.string.navigation_delete_offline_data_drive);
        }else if (action == ACTION_CREATE_OFFLINE_DATA_MD5){
            string = getString(R.string.navigation_generate_data_file);
        }else if (action == ACTION_COPE_OFFLINE_DATA_MD5){
            string = getString(R.string.navigation_md5_copy);
        }
        return string;
    }

    public void updateTextView(int action) {
        mTextView.setText(getDoingString(action));
        mTextColor = Color.RED;
        mTextView.setTextColor(mTextColor);
    }

    public void updateTextView(int action, int result) {
        Log.d(TAG,"updateTextView "+ this);
        if (result == NaviFileUtils.CMD_RESULT_SUCCESS){
            mTextColor = Color.GREEN;
        }else {
            mTextColor = Color.RED;
        }
        if (mFragment != null && !mFragment.isAdded()){
            Log.d(TAG,"fragment is not added");
            return;
        }
        if (mIsProcessRuning){//處理中
            Log.d(TAG,"isProcessRuning");
            updateTextView(action);
            return;
        }

        if (mResult == CMD_RESULT_DEFAULT){//第一次進入
            return;
        }

        //真正返回結(jié)果
        String actionText = "";
        switch (action) {
            case ACTION_COPY_ACTIVATION_CODE:
                actionText = getString(R.string.navigation_activation_code_copy);
                break;
            case ACTION_COPY_OFFLINE_DATA:
                actionText = getString(R.string.navigation_offline_data_copy);
                break;
            case ACTION_MD5_OFFLINE_DATA:
                actionText = getString(R.string.navigation_md5_Validity);
                break;
            case ACTION_DELETE_OFFLINE_DATA:
                actionText = getString(R.string.navigation_delete);
                break;
            case ACTION_CREATE_OFFLINE_DATA_MD5:
                actionText = getString(R.string.navigation_md5_generate);
                break;
            case ACTION_COPE_OFFLINE_DATA_MD5:
                actionText = getString(R.string.navigation_copy);
                break;
        }
        String resultText;
        switch (result) {
            case NaviFileUtils.CMD_RESULT_SUCCESS:
                resultText = getString(R.string.navigation_succeed);
                break;
            case NaviFileUtils.CMD_RESULT_FROM_FILE_NONEXIST:
                resultText = getString(R.string.navigation_Failed_error) + result + getString(R.string.navigation_file_does_not_exist);
                break;
            case NaviFileUtils.CMD_RESULT_TO_FILE_NONEXIST:
                resultText = getString(R.string.navigation_Failed_error) + result + getString(R.string.navigation_The_target_file_does_not_exist);
                break;
            case NaviFileUtils.CMD_RESULT_FILE_NONSAME:
                resultText = getString(R.string.navigation_Failed_error) + result + getString(R.string.navigation_File_inconsistency);
                break;
            case NaviFileUtils.CMD_NO_CONNECT_USB:
                resultText = getString(R.string.navigation_Failed_error) + result + getString(R.string.navigation_Confirm_U_disk_connection_status);
                break;
            default:
                resultText = getString(R.string.navigation_Failed_error) + result;
                break;
        }
        mText = actionText + resultText;
        mTextView.setText(mText);
        mTextView.setTextColor(mTextColor);
    }

    private void textViewClick(){
        long newClickTime = SystemClock.uptimeMillis();
        long duration = newClickTime - mLastClickTime;
        if (duration > 0 && duration < MUIL_CLICK_DURATION) {
            mClickCount++;
            if (mClickCount == 10) {
                mCreateMD5Button.setVisibility(mIsVisiable ? View.VISIBLE : View.GONE);
                mCopyMD5Button.setVisibility(mIsVisiable ? View.VISIBLE : View.GONE);
                mDeleteButton.setVisibility(mIsVisiable ? View.VISIBLE : View.GONE);
                mClickCount = 0;
                mIsVisiable = !mIsVisiable;
            }
        } else {
            mClickCount = 0;
        }
        mLastClickTime = SystemClock.uptimeMillis();
    }

    class WorkHandler extends Handler{
        public WorkHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case WORK_MSG_ACTION:
                    int result = NaviFileUtils.CMD_RESULT_UNKNOWN;
                    switch (msg.arg1){
                        case ACTION_COPY_ACTIVATION_CODE:
                            result = NaviFileUtils.copyFile(ACTIVATION_CODE_FROM_FILE, ACTIVATION_CODE_TO_FOLDER, ACTIVATION_CODE_FILE_NAME);
                            break;
                        case ACTION_COPY_OFFLINE_DATA:
                            if ((OFFLINE_DATA_FROM_FOLDER_PATH.contains(NaviFileUtils.USB_PATH) || OFFLINE_DATA_TO_FOLDER_PATH.contains(NaviFileUtils.USB_PATH))
                                    && !new File(NaviFileUtils.USB_PATH).exists()) {
                                result = NaviFileUtils.CMD_NO_CONNECT_USB;
                                Log.e(TAG, "no connect usb");
                            }else {
                                //先刪除之前拷貝的和生成的
                                NaviFileUtils.deleteFolderOrFile(OFFLINE_DATA_TO_MD5_FILE_PATH);
                                NaviFileUtils.deleteFolderOrFile(OFFLINE_DATA_FROM_COPY_MD5_FILE_PATH);
                                NaviFileUtils.deleteFolderOrFile(OFFLINE_DATA_TO_FOLDER_PATH);
                                //然后先拷貝MD5文件首繁,再拷貝離線數(shù)據(jù)
                                NaviFileUtils.copyFile(OFFLINE_DATA_FROM_MD5_FILE_PATH, FROM_COPY_MD5_FOLDER_PATH, OFFLINE_DATA_MD5_FILE_NAME);
                                result = NaviFileUtils.copyFolder(OFFLINE_DATA_FROM_FOLDER_PATH, OFFLINE_DATA_TO_FOLDER_PATH);
                            }
                            break;
                        case ACTION_MD5_OFFLINE_DATA:
                            result = NaviFileUtils.compareMD5(OFFLINE_DATA_FROM_FOLDER_PATH, OFFLINE_DATA_TO_FOLDER_PATH, FROM_COPY_MD5_FOLDER_PATH,
                                    TO_MD5_FOLDER_PATH, OFFLINE_DATA_MD5_FILE_NAME);
                            break;
                        case ACTION_DELETE_OFFLINE_DATA:
                            //刪除之前拷貝的和生成的
                            NaviFileUtils.deleteFolderOrFile(OFFLINE_DATA_TO_MD5_FILE_PATH);
                            NaviFileUtils.deleteFolderOrFile(OFFLINE_DATA_FROM_COPY_MD5_FILE_PATH);
                            result = NaviFileUtils.deleteFolderOrFile(OFFLINE_DATA_TO_FOLDER_PATH);
                            break;
                        case ACTION_CREATE_OFFLINE_DATA_MD5:
                            result = NaviFileUtils.createMD5File(OFFLINE_DATA_FROM_FOLDER_PATH, FROM_MD5_FOLDER_PATH, OFFLINE_DATA_MD5_FILE_NAME);
                            break;
                        case ACTION_COPE_OFFLINE_DATA_MD5:
                            result = NaviFileUtils.copyFile(OFFLINE_DATA_FROM_MD5_FILE_PATH, FROM_COPY_MD5_FOLDER_PATH, OFFLINE_DATA_MD5_FILE_NAME);
                            break;
                        default:
                            break;
                    }
                    mResult = result;
                    mIsProcessRuning = false;
                    Message message = Message.obtain();
                    message.what = MAIN_MSG_RESULT;
                    message.arg1 = msg.arg1;
                    message.arg2 = mResult;
                    mHandler.sendMessage(message);
                    Log.d(TAG, "work handleMessage mAction=" + mAction + " mResult=" + mResult + " mIsProcessRuning=" + mIsProcessRuning);
                    break;
                default:
                    break;

            }
        }
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市陨囊,隨后出現(xiàn)的幾起案子弦疮,更是在濱河造成了極大的恐慌,老刑警劉巖蜘醋,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胁塞,死亡現(xiàn)場離奇詭異,居然都是意外死亡压语,警方通過查閱死者的電腦和手機啸罢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胎食,“玉大人扰才,你說我怎么就攤上這事〔蘖” “怎么了衩匣?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵蕾总,是天一觀的道長。 經(jīng)常有香客問我琅捏,道長生百,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任柄延,我火速辦了婚禮蚀浆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拦焚。我一直安慰自己蜡坊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布赎败。 她就那樣靜靜地躺著,像睡著了一般蠢甲。 火紅的嫁衣襯著肌膚如雪僵刮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天鹦牛,我揣著相機與錄音搞糕,去河邊找鬼。 笑死曼追,一個胖子當(dāng)著我的面吹牛窍仰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播礼殊,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼驹吮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晶伦?” 一聲冷哼從身側(cè)響起碟狞,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婚陪,沒想到半個月后族沃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡泌参,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年脆淹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沽一。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡盖溺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锯玛,到底是詐尸還是另有隱情咐柜,我是刑警寧澤兼蜈,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拙友,受9級特大地震影響为狸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遗契,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一辐棒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牍蜂,春花似錦漾根、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至从绘,卻和暖如春寄疏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背僵井。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工陕截, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人批什。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓农曲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驻债。 傳聞我的和親對象是個殘疾皇子乳规,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友却汉。感恩相遇驯妄!感恩不離不棄。 中午開了第一次的黨會合砂,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,567評論 0 11
  • 彩排完青扔,天已黑
    劉凱書法閱讀 4,218評論 1 3
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒翩伪。表情可以傳達很多信息微猖。高興了當(dāng)然就笑了,難過就哭了缘屹。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,129評論 2 7