com.money.manager.ex.utils.MmxFileUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.money.manager.ex.utils.MmxFileUtils.java

Source

/*
 * Copyright (C) 2012-2016 The Android Money Manager Ex Project Team
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.money.manager.ex.utils;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.util.SparseArray;

import org.apache.commons.io.FilenameUtils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import timber.log.Timber;

/**
 * File utilities
 */
public class MmxFileUtils {

    private static final int PERMISSION_REQUEST_READ_EXTERNAL_STORAGE = 1;
    private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 2;

    private static final int BUFFER_DIMENSION = 128;
    // https://developer.android.com/reference/android/util/SparseArray.html
    private static SparseArray<String> rawHashMap = new SparseArray<>();

    /**
     * Method that allows you to make a copy of file
     *
     * @param src Source file
     * @param dst Destination file
     * @throws IOException
     */
    public static void copy(File src, File dst) throws IOException {
        InputStream in = new FileInputStream(src);
        OutputStream out = new FileOutputStream(dst);

        // Transfer bytes from in to out
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    }

    /**
     * @param context application
     * @param resId:  rawid resources
     * @return String: String file
     */
    public static String getRawAsString(Context context, int resId) {
        if (rawHashMap.indexOfKey(resId) >= 0) {
            return rawHashMap.get(resId);
        } else {
            String raw = loadRaw(context, resId);
            if (!TextUtils.isEmpty(raw))
                rawHashMap.put(resId, raw);
            return raw;
        }
    }

    /**
     * @param context application
     * @param resId:  rawid resources
     * @return String: String file
     */
    public static String loadRaw(Context context, int resId) {
        String result = null;
        // take input stream
        InputStream is = context.getResources().openRawResource(resId);
        if (is != null) {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[BUFFER_DIMENSION];
            int numRead = 0;
            try {
                while ((numRead = is.read(buffer)) >= 0) {
                    outputStream.write(buffer, 0, numRead);
                }
                // convert to string
                result = new String(outputStream.toByteArray());
            } catch (IOException e) {
                Timber.e(e, "loadRaw");
            } finally {
                if (outputStream != null) {
                    try {
                        outputStream.close();
                    } catch (IOException e) {
                        Timber.e(e, "close byte array");
                    }
                }
            }
        }
        return result;
    }

    // Instance

    public MmxFileUtils(Context context) {
        this.context = context;
    }

    private Context context;

    public Context getContext() {
        return this.context;
    }

    /**
     * Dangerous permissions have to be requested at runtime as of API 23 (Android M, 6).
     * @return boolean indicating whether the request permission binaryDialog is displayed and should be
     * handled asynchronously.
     */
    public boolean requestExternalStoragePermissions(Activity activity) {
        boolean requestingRead = false;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            // Read external storage available only as of API 16.
            requestingRead = requestPermission(Manifest.permission.READ_EXTERNAL_STORAGE, activity,
                    PERMISSION_REQUEST_READ_EXTERNAL_STORAGE);
        }

        // Check write permission.
        boolean requestingWrite = requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, activity,
                PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);

        return requestingRead && requestingWrite;
    }

    private boolean requestPermission(String permission, Activity activity, int requestId) {
        boolean requesting = false;
        int permissionResult = ContextCompat.checkSelfPermission(context, permission);

        if (permissionResult != PackageManager.PERMISSION_GRANTED) {
            requesting = true;
            ActivityCompat.requestPermissions(activity, new String[] { permission }, requestId);
        }

        return requesting;

        /*
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.
            
        // todo: show explanation?
        } else {
        // No explanation needed, we can request the permission.
            
        ActivityCompat.requestPermissions(activity, new String[]{ permission },
            PERMISSION_REQUEST_EXTERNAL_STORAGE);
            
        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
        }
        */
    }

}