diff -r 9a7cc0f29430 -r 10011f051f9c project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/Utils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/Utils.java Thu Oct 20 22:54:34 2011 +0200 @@ -0,0 +1,215 @@ +/* + * Hedgewars for Android. An Android port of Hedgewars, a free turn based strategy game + * Copyright (c) 2011 Richard Deurwaarder + * + * 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; version 2 of the License + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + + +package org.hedgewars.hedgeroid; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +import org.hedgewars.mobile.R; + +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Build; +import android.os.Environment; +import android.widget.Toast; + +public class Utils { + + + /** + * get the path to which we should download all the data files + * @param c context + * @return absolute path + */ + public static String getDownloadPath(Context c){ + if(Build.VERSION.SDK_INT < 8){//8 == Build.VERSION_CODES.FROYO + return PreFroyoSDCardDir.getDownloadPath(c); + }else{ + return FroyoSDCardDir.getDownloadPath(c); + } + } + + static class FroyoSDCardDir{ + public static String getDownloadPath(Context c){ + File f = c.getExternalCacheDir(); + if(f != null){ + return f.getAbsolutePath() + "/Data/"; + }else{ + Toast.makeText(c, R.string.sdcard_not_mounted, Toast.LENGTH_LONG).show(); + return null; + } + } + } + + static class PreFroyoSDCardDir{ + public static String getDownloadPath(Context c){ + if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ + if(Environment.getExternalStorageDirectory() != null) + return Environment.getExternalStorageDirectory().getAbsolutePath() + "/Hedgewars/"; + } + Toast.makeText(c, R.string.sdcard_not_mounted, Toast.LENGTH_LONG).show(); + return null; + } + } + + /** + * Get files from dirName, dir name is relative to {@link getDownloadPath} + * @param dirName + * @param c context + * @return string of files + */ + public static String[] getFileNamesFromRelativeDir(Context c, String dirName){ + String prefix = getDownloadPath(c); + File f = new File(prefix + dirName); + + if(f.exists() && f.isDirectory()) return f.list(); + else throw new IllegalArgumentException("File not a directory or doesn't exist dirName = " + f.getAbsolutePath()); + } + + /** + * Return a File array with all the files from dirName + * @param c + * @param dirName + * @return + */ + public static File[] getFilesFromRelativeDir(Context c, String dirName){ + String prefix = getDownloadPath(c); + File f = new File(prefix + dirName); + + if(f.exists() && f.isDirectory()) return f.listFiles(); + else throw new IllegalArgumentException("File not a directory or doesn't exist dirName = " + f.getAbsolutePath()); + } + + /** + * Checks if this directory has a file with suffix suffix + * @param f - directory + * @return + */ + public static boolean hasFileWithSuffix(File f, String suffix){ + if(f.isDirectory()){ + for(String s : f.list()){ + if(s.endsWith(suffix)) return true; + } + return false; + }else{ + return false; + } + } + + /** + * Gives back all dirs which contain a file with suffix fileSuffix + * @param c + * @param path + * @param fileSuffix + * @return + */ + public static String[] getDirsWithFileSuffix(Context c, String path, String fileSuffix){ + File[] files = getFilesFromRelativeDir(c,path); + String[] validFiles = new String[files.length]; + int validCounter = 0; + + for(File f : files){ + if(hasFileWithSuffix(f, fileSuffix)) validFiles[validCounter++] = f.getName(); + } + String[] ret = new String[validCounter]; + System.arraycopy(validFiles, 0, ret, 0, validCounter); + return ret; + } + + /** + * Get all files from directory dir which have the given suffix + * @param c + * @param dir + * @param suffix + * @param removeSuffix + * @return + */ + public static ArrayList getFilesFromDirWithSuffix(Context c, String dir, String suffix, boolean removeSuffix){ + String[] files = Utils.getFileNamesFromRelativeDir(c, dir); + ArrayList ret = new ArrayList(); + for(String s : files){ + if(s.endsWith(suffix)){ + if(removeSuffix) ret.add(s.substring(0, s.length()-suffix.length())); + else ret.add(s); + } + } + return ret; + } + + /** + * Moves resources pointed to by sourceResId (from @res/raw/) to the app's private data directory + * @param c + * @param sourceResId + * @param directory + */ + public static void resRawToFilesDir(Context c, int sourceResId, String directory){ + byte[] buffer = new byte[1024]; + InputStream bis = null; + BufferedOutputStream bos = null; + File schemesDirFile = new File(c.getFilesDir().getAbsolutePath() + '/' + directory); + schemesDirFile.mkdirs(); + String schemesDirPath = schemesDirFile.getAbsolutePath() + '/'; + + //Get an array with the resource files ID + TypedArray ta = c.getResources().obtainTypedArray(sourceResId); + int[] resIds = new int[ta.length()]; + for(int i = 0; i < ta.length(); i++){ + resIds[i] = ta.getResourceId(i, 0); + } + + for(int id : resIds){ + String fileName = c.getResources().getResourceEntryName(id); + File f = new File(schemesDirPath + fileName); + try { + if(!f.createNewFile()){ + f.delete(); + f.createNewFile(); + } + + bis = c.getResources().openRawResource(id); + bos = new BufferedOutputStream(new FileOutputStream(f), 1024); + int read = 0; + while((read = bis.read(buffer)) != -1){ + bos.write(buffer, 0, read); + } + + } catch (IOException e) { + e.printStackTrace(); + }finally{ + if(bis != null) + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + if(bos != null) + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } +}