package org.sugr.gearshift; import android.app.backup.BackupManager; import android.content.Context; import android.util.Log; import java.io.PrintWriter; import java.io.StringWriter; import java.text.DecimalFormat; import java.util.Comparator; public final class G { public static final String PREF_DEBUG = "debug"; public static final String PREF_SHOW_STATUS = "show_status"; public static final String PREF_SHOW_ADD_DIALOG = "show_add_dialog"; public static final String PREF_DELETE_DATA = "delete_data"; public static final String PREF_AUTO_UPDATE_CHECK = "auto_update_check"; public static final String PREF_PROFILES = "profiles"; public static final String PREF_CURRENT_PROFILE = "default_profile"; public static final String PREF_NAME = "profile_name"; public static final String PREF_HOST = "profile_host"; public static final String PREF_PORT = "profile_port"; public static final String PREF_PATH = "profile_path"; public static final String PREF_USER = "profile_username"; public static final String PREF_PASS = "profile_password"; public static final String PREF_SSL = "profile_use_ssl"; public static final String PREF_TIMEOUT = "profile_timeout"; public static final String PREF_RETRIES = "profile_retries"; public static final String PREF_DIRECTORIES = "profile_directories"; public static final String PREF_LAST_DIRECTORY = "profile_last_directory"; public static final String PREF_MOVE_DATA = "profile_move_data"; public static final String PREF_DELETE_LOCAL = "profile_delete_local"; public static final String PREF_START_PAUSED = "profile_start_paused"; public static final String PREF_PROXY = "profile_use_proxy"; public static final String PREF_PROXY_HOST = "profile_proxy_host"; public static final String PREF_PROXY_PORT = "profile_proxy_port"; public static final String PREF_UPDATE_INTERVAL = "profile_update_interval"; public static final String PREF_FULL_UPDATE = "profile_full_update"; public static final String PREF_COLOR = "profile_color"; public static final String[] UNPREFIXED_PROFILE_PREFERENCE_KEYS = new String[] { G.PREF_NAME, G.PREF_HOST, G.PREF_PORT, G.PREF_PATH, G.PREF_USER, G.PREF_PASS, G.PREF_SSL, G.PREF_TIMEOUT, G.PREF_RETRIES, G.PREF_PROXY, G.PREF_PROXY_HOST, G.PREF_PROXY_PORT, G.PREF_DIRECTORIES, G.PREF_UPDATE_INTERVAL, G.PREF_FULL_UPDATE, G.PREF_COLOR, }; public static final String PREF_LIST_SORT_BY = "torrents_sort_by"; public static final String PREF_LIST_SORT_ORDER = "torrents_sort_order"; public static final String PREF_LIST_FILTER = "torrents_filter"; public static final String PREF_LIST_DIRECTORY = "torrents_directory"; public static final String PREF_LIST_TRACKER = "torrents_tracker"; public static final String PREF_LIST_SEARCH = "torrents_search"; public static final String PREF_FILTER_ALL = "filter_all"; public static final String PREF_FILTER_DOWNLOADING = "filter_downloading"; public static final String PREF_FILTER_SEEDING = "filter_seeding"; public static final String PREF_FILTER_PAUSED = "filter_paused"; public static final String PREF_FILTER_COMPLETE = "filter_complete"; public static final String PREF_FILTER_INCOMPLETE = "filter_incomplete"; public static final String PREF_FILTER_ACTIVE = "filter_active"; public static final String PREF_FILTER_CHECKING = "filter_checking"; public static final String PREF_FILTER_ERRORS = "filter_errors"; public static final String PREF_FILTER_DIRECTORIES = "filter_directories"; public static final String PREF_FILTER_TRACKERS = "filter_trackers"; public static final String PREF_FILTER_UNTRACKED = "filter_untracked"; public static final String PREF_SORT_PREFIX = "sort_"; public static final String PREF_SORT_NAME = "sort_name"; public static final String PREF_SORT_SIZE = "sort_size"; public static final String PREF_SORT_STATUS = "sort_status"; public static final String PREF_SORT_ACTIVITY = "sort_activity"; public static final String PREF_SORT_AGE = "sort_age"; public static final String PREF_SORT_PROGRESS = "sort_progress"; public static final String PREF_SORT_RATIO = "sort_ratio"; public static final String PREF_SORT_LOCATION = "sort_location"; public static final String PREF_SORT_PEERS = "sort_peers"; public static final String PREF_SORT_RATE_DOWNLOAD = "sort_rate_download"; public static final String PREF_SORT_RATE_UPLOAD = "sort_rate_upload"; public static final String PREF_SORT_QUEUE = "sort_queue"; public static final String PREF_BASE_SORT = "base_sort"; public static final String PREF_BASE_SORT_ORDER = "base_sort_order"; public static final String PREF_FILTER_MATCH_TEST = "^(?:filter_|sort_).+$"; public static final String ARG_SESSION = "session"; public static final String ARG_PROFILE = "profile"; public static final String ARG_PROFILE_ID = "profile_id"; public static final String ARG_DIRECTORIES = "directories"; public static final String ARG_NEW_PROFILE = "new_profile"; public static final String ARG_PAGE_POSITION = "page_position"; public static final String ARG_TORRENT_HASH_STRING = "torrent_hash_string"; public static final String ARG_REFRESH_TYPE = "refresh_type"; public static final String ARG_LAST_SERVER_ACTIVITY = "last_server_activity"; public static final String DETAIL_FRAGMENT_TAG = "detail_fragment"; public static final String PROFILES_PREF_NAME = "profiles"; public static final String INTENT_TORRENT_UPDATE = "org.sugr.gearshift.TORRENT_UPDATE"; public static final String INTENT_PAGE_UNSELECTED = "org.sugr.gearshift.PAGE_UNSELECTED"; public static final String INTENT_SERVICE_ACTION_COMPLETE = "org.sugr.gearshift.service.SERVICE_ACTION_COMPLETE"; public static final String ARG_REQUEST_TYPE = "request_type"; public static final String ARG_REQUEST_ARGS = "request_args"; public static final String ARG_ADDED = "added"; public static final String ARG_REMOVED = "removed"; public static final String ARG_STATUS_CHANGED = "status_changed"; public static final String ARG_INCOMPLETE_METADATA = "incomplete_metadata"; public static final String ARG_ADDED_HASH = "added_hash"; public static final String ARG_TORRENT_FIELD = "torrent_field"; public static final String ARG_FREE_SPACE = "free_space"; public static final String ARG_PORT_IS_OPEN = "port_is_open"; public static final String ARG_BLOCKLIST_SIZE = "blocklist_size"; public static final String INTENT_SESSION_INVALIDATED = "org.sugr.gearshift.SESSION_INVALIDATED"; public static final String ARG_SESSION_VALID = "session_valid"; public static final String ARG_ERROR = "error"; public static final String ARG_ERROR_CODE = "error_code"; public static final String ARG_ERROR_STRING = "error_string"; public static final int PROFILES_LOADER_ID = 1; public static final int TORRENT_LIST_TRAFFIC_LOADER_ID = 2; public static final int TORRENT_MENU_TRAFFIC_LOADER_ID = 3; private static final String LogTag = "GearShift"; public static final String FILTER_UNTRACKED = "|__untracked__|"; public enum FilterBy { ALL, DOWNLOADING, SEEDING, PAUSED, COMPLETE, INCOMPLETE, ACTIVE, CHECKING, ERRORS, } public enum SortBy { NAME, SIZE, STATUS, RATE_DOWNLOAD, RATE_UPLOAD, AGE, PROGRESS, RATIO, ACTIVITY, LOCATION, PEERS, QUEUE } public enum SortOrder { ASCENDING, DESCENDING } public enum TorrentAction { START("torrent-start"), START_NOW("torrent-start-now"), STOP("torrent-stop"), VERIFY("torrent-verify"), REANNOUNCE("torrent-reannounce"), QUEUE_MOVE_TOP("queue-move-top"), QUEUE_MOVE_UP("queue-move-up"), QUEUE_MOVE_DOWN("queue-move-down"), QUEUE_MOVE_BOTTOM("queue-move-bottom"); private final String action; TorrentAction(String action) { this.action = action; } public String action() { return action; } } public static Comparator<String> SIMPLE_STRING_COMPARATOR = new Comparator<String>() { @Override public int compare(String lhs, String rhs) { if (lhs == null && rhs == null) { return 0; } else if (lhs == null) { return -1; } else if (rhs == null) { return 1; } else { return lhs.compareToIgnoreCase(rhs); } } }; public static boolean DEBUG = false; public static void logE(String message, Object[] args, Exception e) { Log.e(LogTag, String.format(message, args), e); } public static void logE(String message, Exception e) { Log.e(LogTag, message, e); } public static void logD(String message, Object[] args) { if (!DEBUG) return; Log.d(LogTag, String.format(message, args)); } public static void logD(String message) { if (!DEBUG) return; Log.d(LogTag, message); } public static void logDTrace() { if (!DEBUG) return; StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); Throwable t = new Throwable(); t.printStackTrace(pw); Log.d(LogTag, sw.toString()); } public static String readableFileSize(long size) { if(size <= 0) return "0 B"; final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" }; int digitGroups = (int) (Math.log10(size)/Math.log10(1024)); float scaledSize = size / (float) Math.pow(1024, digitGroups); if (scaledSize < 100) { return new DecimalFormat("#,##0.##").format(scaledSize) + " " + units[digitGroups]; } else { return new DecimalFormat("#,##0.#").format(scaledSize) + " " + units[digitGroups]; } } public static String readablePercent(float percent) { if (percent < 10.0) { return new DecimalFormat("#.##").format(percent); } else if (percent < 100.0) { return new DecimalFormat("#.#").format(percent); } else { return new DecimalFormat("#").format(percent); } } public static String readableRemainingTime(long eta, Context context) { if (eta < 0) { return context.getString(R.string.traffic_remaining_time_unknown); } int days = (int) Math.floor(eta / 86400); int hours = (int) Math.floor((eta % 86400) / 3600); int minutes = (int) Math.floor((eta % 3600) / 60); int seconds = (int) Math.floor(eta % 60); String d = Integer.toString(days) + ' ' + context.getString(days > 1 ? R.string.time_days : R.string.time_day); String h = Integer.toString(hours) + ' ' + context.getString(hours > 1 ? R.string.time_hours : R.string.time_hour); String m = Integer.toString(minutes) + ' ' + context.getString(minutes > 1 ? R.string.time_minutes : R.string.time_minute); String s = Integer.toString(seconds) + ' ' + context.getString(seconds > 1 ? R.string.time_seconds : R.string.time_second); if (days > 0) { if (days >= 4 || hours == 0) return d; return d + ", " + h; } if (hours > 0) { if (hours >= 4 || minutes == 0) return h; return h + ", " + m; } if (minutes > 0) { if (minutes >= 4 || seconds == 0) return m; return m + ", " + s; } return s; } public static void requestBackup(Context context) { BackupManager bm = new BackupManager(context); bm.dataChanged(); } public static String[] concat(String[]... arrays) { int len = 0; for (final String[] array : arrays) { len += array.length; } final String[] result = new String[len]; int currentPos = 0; for (final String[] array : arrays) { System.arraycopy(array, 0, result, currentPos, array.length); currentPos += array.length; } return result; } public static CharSequence trimTrailingWhitespace(CharSequence source) { if (source == null) return ""; int i = 0; while (Character.isWhitespace(i) && i < source.length()) { ++i; } source = source.subSequence(i, source.length()); int j = source.length() - 1; while (Character.isWhitespace(source.charAt(j)) && j > 0) { --j; } return source.subSequence(0, j + 1); } }