/* * Copyright (C) 2017 The Android Open Source Project * * 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.googlecode.android_scripting; import android.content.Context; import android.content.res.AssetManager; import android.os.Environment; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.lang.reflect.Method; /** * Utility functions for handling files. * */ public class FileUtils { private FileUtils() { // Utility class. } static public boolean externalStorageMounted() { String state = Environment.getExternalStorageState(); return Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state); } public static int chmod(File path, int mode) throws Exception { Class fileUtils = Class.forName("android.os.FileUtils"); Method setPermissions = fileUtils.getMethod("setPermissions", String.class, int.class, int.class, int.class); return (Integer) setPermissions.invoke(null, path.getAbsolutePath(), mode, -1, -1); } public static boolean recursiveChmod(File root, int mode) throws Exception { boolean success = chmod(root, mode) == 0; for (File path : root.listFiles()) { if (path.isDirectory()) { success = recursiveChmod(path, mode); } success &= (chmod(path, mode) == 0); } return success; } public static boolean delete(File path) { boolean result = true; if (path.exists()) { if (path.isDirectory()) { for (File child : path.listFiles()) { result &= delete(child); } result &= path.delete(); // Delete empty directory. } if (path.isFile()) { result &= path.delete(); } if (!result) { Log.e("Delete failed;"); } return result; } else { Log.e("File does not exist."); return false; } } public static File copyFromStream(String name, InputStream input) { if (name == null || name.length() == 0) { Log.e("No script name specified."); return null; } File file = new File(name); if (!makeDirectories(file.getParentFile(), 0755)) { return null; } try { OutputStream output = new FileOutputStream(file); IoUtils.copy(input, output); } catch (Exception e) { Log.e(e); return null; } return file; } public static boolean makeDirectories(File directory, int mode) { File parent = directory; while (parent.getParentFile() != null && !parent.exists()) { parent = parent.getParentFile(); } if (!directory.exists()) { Log.v("Creating directory: " + directory.getName()); if (!directory.mkdirs()) { Log.e("Failed to create directory."); return false; } } try { recursiveChmod(parent, mode); } catch (Exception e) { Log.e(e); return false; } return true; } public static File getExternalDownload() { try { Class c = Class.forName("android.os.Environment"); Method m = c.getDeclaredMethod("getExternalStoragePublicDirectory", String.class); String download = c.getDeclaredField("DIRECTORY_DOWNLOADS").get(null).toString(); return (File) m.invoke(null, download); } catch (Exception e) { return new File(Environment.getExternalStorageDirectory(), "Download"); } } public static boolean rename(File file, String name) { return file.renameTo(new File(file.getParent(), name)); } public static String readToString(File file) throws IOException { if (file == null || !file.exists()) { return null; } FileReader reader = new FileReader(file); StringBuilder out = new StringBuilder(); char[] buffer = new char[1024 * 4]; int numRead = 0; while ((numRead = reader.read(buffer)) > -1) { out.append(String.valueOf(buffer, 0, numRead)); } reader.close(); return out.toString(); } public static String readFromAssetsFile(Context context, String name) throws IOException { AssetManager am = context.getAssets(); BufferedReader reader = new BufferedReader(new InputStreamReader(am.open(name))); String line; StringBuilder builder = new StringBuilder(); while ((line = reader.readLine()) != null) { builder.append(line); } reader.close(); return builder.toString(); } }