/* Copyright 2009 David Revell This file is part of SwiFTP. SwiFTP 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. SwiFTP 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 SwiFTP. If not, see <http://www.gnu.org/licenses/>. */ package org.swiftp; import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.UnknownHostException; import org.json.JSONException; import org.json.JSONObject; import android.content.ContentResolver; import android.content.Context; import android.content.pm.PackageManager.NameNotFoundException; import android.media.MediaScannerConnection; import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.net.Uri; import android.provider.Settings; import android.util.Log; abstract public class Util { static MyLog myLog = new MyLog(Util.class.getName()); static String getAndroidId() { ContentResolver cr = Globals.getContext().getContentResolver(); return Settings.Secure.getString(cr, Settings.Secure.ANDROID_ID); } /** * Get the SwiFTP version from the manifest. * @return The version as a String. */ public static String getVersion() { String packageName = Globals.getContext().getPackageName(); try { return Globals.getContext().getPackageManager().getPackageInfo(packageName, 0).versionName; } catch ( NameNotFoundException e) { myLog.l(Log.ERROR, "NameNotFoundException looking up SwiFTP version"); return null; } } public static byte byteOfInt(int value, int which) { int shift = which * 8; return (byte)(value >> shift); } public static String ipToString(int addr, String sep) { //myLog.l(Log.DEBUG, "IP as int: " + addr); if(addr > 0) { StringBuffer buf = new StringBuffer(); buf. append(byteOfInt(addr, 0)).append(sep). append(byteOfInt(addr, 1)).append(sep). append(byteOfInt(addr, 2)).append(sep). append(byteOfInt(addr, 3)); myLog.l(Log.DEBUG, "ipToString returning: " + buf.toString()); return buf.toString(); } else { return null; } } public static InetAddress intToInet(int value) { byte[] bytes = new byte[4]; for(int i = 0; i<4; i++) { bytes[i] = byteOfInt(value, i); } try { return InetAddress.getByAddress(bytes); } catch (UnknownHostException e) { // This only happens if the byte array has a bad length return null; } } public static String ipToString(int addr) { if(addr == 0) { // This can only occur due to an error, we shouldn't blindly // convert 0 to string. myLog.l(Log.INFO, "ipToString won't convert value 0"); return null; } return ipToString(addr, "."); } // This exists to avoid cluttering up other code with // UnsupportedEncodingExceptions. static byte[] jsonToByteArray(JSONObject json) throws JSONException { try { return json.toString().getBytes(Defaults.STRING_ENCODING); } catch (UnsupportedEncodingException e) { return null; } } // This exists to avoid cluttering up other code with // UnsupportedEncodingExceptions. static JSONObject byteArrayToJson(byte[] bytes) throws JSONException { try { return new JSONObject(new String(bytes, Defaults.STRING_ENCODING)); } catch (UnsupportedEncodingException e) { // This will never happen because we use valid encodings return null; } } public static void newFileNotify(String path) { if(Defaults.do_mediascanner_notify) { myLog.l(Log.DEBUG, "Notifying others about new file: " + path); new MediaScannerNotifier(Globals.getContext(), path); } } public static void deletedFileNotify(String path) { // This might not work, I couldn't find an API call for this. if(Defaults.do_mediascanner_notify) { myLog.l(Log.DEBUG, "Notifying others about deleted file: " + path); new MediaScannerNotifier(Globals.getContext(), path); } } // A class to help notify the Music Player and other media services when // a file has been uploaded. Thanks to Dave Sparks in his post to the // Android Developers mailing list on 14 Feb 2009. private static class MediaScannerNotifier implements MediaScannerConnectionClient { private MediaScannerConnection connection; private String path; public MediaScannerNotifier(Context context, String path) { this.path = path; connection = new MediaScannerConnection(context, this); connection.connect(); } public void onMediaScannerConnected() { connection.scanFile(path, null); // null: we don't know MIME type } public void onScanCompleted(String path, Uri uri) { connection.disconnect(); } } public static String[] concatStrArrays(String[] a1, String[] a2) { String[] retArr = new String[a1.length + a2.length]; System.arraycopy(a1, 0, retArr, 0, a1.length); System.arraycopy(a2, 0, retArr, a1.length, a2.length); return retArr; } public static void sleepIgnoreInterupt(long millis) { try { Thread.sleep(millis); } catch(InterruptedException e) {} } }