/*
* 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.
}
*/
}
}