1 /*
2  * Copyright (C) 2016 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 
17 package com.googlecode.android_scripting;
18 
19 import android.content.Context;
20 import android.content.res.AssetManager;
21 import android.os.Environment;
22 
23 import java.io.BufferedReader;
24 import java.io.File;
25 import java.io.FileOutputStream;
26 import java.io.FileReader;
27 import java.io.IOException;
28 import java.io.InputStream;
29 import java.io.InputStreamReader;
30 import java.io.OutputStream;
31 import java.lang.reflect.Method;
32 
33 /**
34  * Utility functions for handling files.
35  *
36  * @author Damon Kohler (damonkohler@gmail.com)
37  */
38 public class FileUtils {
39 
FileUtils()40   private FileUtils() {
41     // Utility class.
42   }
43 
externalStorageMounted()44   static public boolean externalStorageMounted() {
45     String state = Environment.getExternalStorageState();
46     return Environment.MEDIA_MOUNTED.equals(state)
47         || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
48   }
49 
chmod(File path, int mode)50   public static int chmod(File path, int mode) throws Exception {
51     Class<?> fileUtils = Class.forName("android.os.FileUtils");
52     Method setPermissions =
53         fileUtils.getMethod("setPermissions", String.class, int.class, int.class, int.class);
54     return (Integer) setPermissions.invoke(null, path.getAbsolutePath(), mode, -1, -1);
55   }
56 
recursiveChmod(File root, int mode)57   public static boolean recursiveChmod(File root, int mode) throws Exception {
58     boolean success = chmod(root, mode) == 0;
59     for (File path : root.listFiles()) {
60       if (path.isDirectory()) {
61         success = recursiveChmod(path, mode);
62       }
63       success &= (chmod(path, mode) == 0);
64     }
65     return success;
66   }
67 
delete(File path)68   public static boolean delete(File path) {
69     boolean result = true;
70     if (path.exists()) {
71       if (path.isDirectory()) {
72         for (File child : path.listFiles()) {
73           result &= delete(child);
74         }
75         result &= path.delete(); // Delete empty directory.
76       }
77       if (path.isFile()) {
78         result &= path.delete();
79       }
80       if (!result) {
81         Log.e("Delete failed;");
82       }
83       return result;
84     } else {
85       Log.e("File does not exist.");
86       return false;
87     }
88   }
89 
copyFromStream(String name, InputStream input)90   public static File copyFromStream(String name, InputStream input) {
91     if (name == null || name.length() == 0) {
92       Log.e("No script name specified.");
93       return null;
94     }
95     File file = new File(name);
96     if (!makeDirectories(file.getParentFile(), 0755)) {
97       return null;
98     }
99     try {
100       OutputStream output = new FileOutputStream(file);
101       IoUtils.copy(input, output);
102     } catch (Exception e) {
103       Log.e(e);
104       return null;
105     }
106     return file;
107   }
108 
makeDirectories(File directory, int mode)109   public static boolean makeDirectories(File directory, int mode) {
110     File parent = directory;
111     while (parent.getParentFile() != null && !parent.exists()) {
112       parent = parent.getParentFile();
113     }
114     if (!directory.exists()) {
115       Log.v("Creating directory: " + directory.getName());
116       if (!directory.mkdirs()) {
117         Log.e("Failed to create directory.");
118         return false;
119       }
120     }
121     try {
122       recursiveChmod(parent, mode);
123     } catch (Exception e) {
124       Log.e(e);
125       return false;
126     }
127     return true;
128   }
129 
getExternalDownload()130   public static File getExternalDownload() {
131     try {
132       Class<?> c = Class.forName("android.os.Environment");
133       Method m = c.getDeclaredMethod("getExternalStoragePublicDirectory", String.class);
134       String download = c.getDeclaredField("DIRECTORY_DOWNLOADS").get(null).toString();
135       return (File) m.invoke(null, download);
136     } catch (Exception e) {
137       return new File(Environment.getExternalStorageDirectory(), "Download");
138     }
139   }
140 
rename(File file, String name)141   public static boolean rename(File file, String name) {
142     return file.renameTo(new File(file.getParent(), name));
143   }
144 
readToString(File file)145   public static String readToString(File file) throws IOException {
146     if (file == null || !file.exists()) {
147       return null;
148     }
149     FileReader reader = new FileReader(file);
150     StringBuilder out = new StringBuilder();
151     char[] buffer = new char[1024 * 4];
152     int numRead = 0;
153     while ((numRead = reader.read(buffer)) > -1) {
154       out.append(String.valueOf(buffer, 0, numRead));
155     }
156     reader.close();
157     return out.toString();
158   }
159 
readFromAssetsFile(Context context, String name)160   public static String readFromAssetsFile(Context context, String name) throws IOException {
161     AssetManager am = context.getAssets();
162     BufferedReader reader = new BufferedReader(new InputStreamReader(am.open(name)));
163     String line;
164     StringBuilder builder = new StringBuilder();
165     while ((line = reader.readLine()) != null) {
166       builder.append(line);
167     }
168     reader.close();
169     return builder.toString();
170   }
171 
172 }
173