package org.sugr.gearshift.core;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import org.sugr.gearshift.G;
import org.sugr.gearshift.GearShiftApplication;
import org.sugr.gearshift.ui.util.Colorizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
public class TransmissionProfile implements Parcelable, Comparable<TransmissionProfile> {
private String id;
private String name = "";
private String host = "";
private int port = 9091;
private String path = "/transmission/rpc";
private String username = "";
private String password = "";
private boolean useSSL = false;
private int timeout = 40;
private int retries = 3;
private String lastDirectory;
private boolean moveData = true;
private boolean deleteLocal = false;
private boolean startPaused = false;
private Set<String> directories = new HashSet<>();
private boolean useProxy = false;
private String proxyHost = "";
private int proxyPort = 8080;
private int updateInterval = 1;
private int fullUpdate = 2;
private int color;
private SharedPreferences defaultPrefs;
public static TransmissionProfile[] readProfiles(SharedPreferences prefs) {
Set<String> profile_ids = prefs.getStringSet(G.PREF_PROFILES, new HashSet<String>());
TransmissionProfile[] profiles = new TransmissionProfile[profile_ids.size()];
int index = 0;
for (String id : profile_ids) {
profiles[index++] = new TransmissionProfile(id, prefs);
}
Arrays.sort(profiles);
return profiles;
}
public static String getCurrentProfileId(SharedPreferences prefs) {
return prefs.getString(G.PREF_CURRENT_PROFILE, null);
}
public static void setCurrentProfile(TransmissionProfile profile, SharedPreferences prefs) {
Editor e = prefs.edit();
if (profile == null) {
e.putString(G.PREF_CURRENT_PROFILE, null);
} else {
e.putString(G.PREF_CURRENT_PROFILE, profile.getId());
}
e.commit();
}
public static String generateId() {
return UUID.randomUUID().toString();
}
public static String getPreferencesName() {
return G.PROFILES_PREF_NAME;
}
public static void cleanTemporaryPreferences() {
SharedPreferences prefs = GearShiftApplication.get().getSharedPreferences(getPreferencesName(),
Activity.MODE_PRIVATE);
Editor e = prefs.edit();
for (String key : G.UNPREFIXED_PROFILE_PREFERENCE_KEYS) {
e.remove(key);
}
e.apply();
}
public TransmissionProfile(SharedPreferences prefs) {
id = generateId();
this.defaultPrefs = prefs;
}
public TransmissionProfile(String id, SharedPreferences prefs) {
this.id = id;
this.defaultPrefs = prefs;
load();
}
public boolean isValid() {
return !TextUtils.isEmpty(name) && (!TextUtils.isEmpty(host) && !host.equals("example.com")) &&
(!useProxy || ((!TextUtils.isEmpty(proxyHost) && !proxyHost.equals("example.com")) &&
proxyPort > 0 && proxyPort < 65535));
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getHost() {
return host;
}
public int getPort() {
return port;
}
public String getPath() {
return path;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public boolean isUseSSL() {
return useSSL;
}
public int getTimeout() {
return timeout;
}
public int getRetries() {
return retries;
}
public Set<String> getDirectories() {
return directories;
}
public void setName(String name) {
this.name = name;
}
public void setHost(String host) {
this.host = host;
}
public void setPort(int port) {
this.port = port;
}
public void setPath(String path) {
this.path = path;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setUseSSL(boolean useSSL) {
this.useSSL = useSSL;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public void setRetries(int retries) {
this.retries = retries;
}
public void setDirectories(Set<String> directories) {
this.directories = directories;
}
public boolean isUseProxy() {
return useProxy;
}
public void setUseProxy(boolean useProxy) {
this.useProxy = useProxy;
}
public String getProxyHost() {
return proxyHost;
}
public void setProxyHost(String host) {
this.proxyHost = host;
}
public void setProxyPort(int port) {
this.proxyPort = port;
}
public int getProxyPort() {
return proxyPort;
}
public int getUpdateInterval() {
return updateInterval;
}
public void setUpdateInterval(int interval) {
updateInterval = interval;
}
public int getFullUpdate() {
return fullUpdate;
}
public void setFullUpdate(int every) {
fullUpdate = every;
}
public boolean updateActiveTorrentsOnly() {
return fullUpdate > 0;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public void load() {
SharedPreferences pref = getPreferences();
name = pref.getString(G.PREF_NAME + id, "").trim();
host = pref.getString(G.PREF_HOST + id, "").trim();
try {
port = Integer.parseInt(pref.getString(G.PREF_PORT + id, "9091"));
if (port < 1) {
port = 1;
} else if ( port > 65535) {
port = 65535;
}
} catch (NumberFormatException e) {
port = 65535;
}
path = pref.getString(G.PREF_PATH + id, "").trim();
username = pref.getString(G.PREF_USER + id, "").trim();
password = pref.getString(G.PREF_PASS + id, "").trim();
useSSL = pref.getBoolean(G.PREF_SSL + id, false);
try {
timeout = Integer.parseInt(pref.getString(G.PREF_TIMEOUT + id, "-1"));
} catch (NumberFormatException e) {
timeout = Integer.MAX_VALUE;
}
try {
retries = Integer.parseInt(pref.getString(G.PREF_RETRIES + id, "-1"));
} catch (NumberFormatException e) {
retries = Integer.MAX_VALUE;
}
directories = pref.getStringSet(G.PREF_DIRECTORIES + id, new HashSet<String>());
lastDirectory = pref.getString(G.PREF_LAST_DIRECTORY + id, "");
moveData = pref.getBoolean(G.PREF_MOVE_DATA + id, true);
deleteLocal = pref.getBoolean(G.PREF_DELETE_LOCAL + id, false);
startPaused = pref.getBoolean(G.PREF_START_PAUSED + id, false);
useProxy = pref.getBoolean(G.PREF_PROXY + id, false);
proxyHost = pref.getString(G.PREF_PROXY_HOST + id, "").trim();
try {
proxyPort = Integer.parseInt(pref.getString(G.PREF_PROXY_PORT + id, "8080"));
if (proxyPort < 1) {
proxyPort = 1;
} else if ( proxyPort > 65535) {
proxyPort = 65535;
}
} catch (NumberFormatException e) {
proxyPort = 65535;
}
try {
updateInterval = Integer.parseInt(pref.getString(G.PREF_UPDATE_INTERVAL + id, "1"));
} catch (NumberFormatException e) {
updateInterval = 1;
}
try {
fullUpdate = Integer.parseInt(pref.getString(G.PREF_FULL_UPDATE + id, "2"));
} catch (NumberFormatException e) {
fullUpdate = 2;
}
color = pref.getInt(G.PREF_COLOR + id, 0);
if (color == 0) {
color = Colorizer.defaultColor(GearShiftApplication.get());
}
}
public void save() {
SharedPreferences pref = getPreferences();
Editor e = pref.edit();
e.putString(G.PREF_NAME + id, name);
e.putString(G.PREF_HOST + id, host);
e.putString(G.PREF_PORT + id, Integer.toString(port));
e.putString(G.PREF_PATH + id, path);
e.putString(G.PREF_USER + id, username);
e.putString(G.PREF_PASS + id, password);
e.putBoolean(G.PREF_SSL + id, useSSL);
e.putString(G.PREF_TIMEOUT + id, Integer.toString(timeout));
e.putString(G.PREF_RETRIES + id, Integer.toString(retries));
e.putStringSet(G.PREF_DIRECTORIES + id, directories);
e.putBoolean(G.PREF_PROXY + id, useProxy);
e.putString(G.PREF_PROXY_HOST + id, proxyHost);
e.putString(G.PREF_PROXY_PORT + id, Integer.toString(proxyPort));
e.putString(G.PREF_UPDATE_INTERVAL + id, Integer.toString(updateInterval));
e.putString(G.PREF_FULL_UPDATE + id, Integer.toString(fullUpdate));
e.putInt(G.PREF_COLOR + id, color);
e.commit();
G.logD("Saving profile to prefs: id %s, name %s, host %s, port %d",
new Object[] {id, name, host, port});
e = defaultPrefs.edit();
Set<String> ids = defaultPrefs.getStringSet(G.PREF_PROFILES, new HashSet<String>());
if (ids.add(id)) {
e.remove(G.PREF_PROFILES);
e.apply();
if (ids.size() == 1 && !defaultPrefs.getString(G.PREF_CURRENT_PROFILE, "").equals(id)) {
e.putString(G.PREF_CURRENT_PROFILE, id);
}
e.putStringSet(G.PREF_PROFILES, ids);
e.commit();
G.logD("Adding the profile %s to the set of profiles",
new Object[] {id});
}
}
public void delete() {
SharedPreferences pref = getPreferences();
Editor e = pref.edit();
for (String key : G.UNPREFIXED_PROFILE_PREFERENCE_KEYS) {
e.remove(key + id);
}
e.commit();
e = defaultPrefs.edit();
Set<String> ids = defaultPrefs.getStringSet(G.PREF_PROFILES, new HashSet<String>());
if (ids.remove(id)) {
e.remove(G.PREF_PROFILES);
e.apply();
e.putStringSet(G.PREF_PROFILES, ids);
e.commit();
G.logD("Removing the profile %s from the set of profiles",
new Object[] {id});
}
G.logD("Deleting profile from prefs: id %s, name %s, host %s, port %d",
new Object[] {id, name, host, port});
}
public void fillTemporatyPreferences() {
SharedPreferences pref = getPreferences();
Editor e = pref.edit();
e.putString(G.PREF_NAME, name);
e.putString(G.PREF_HOST, host);
e.putString(G.PREF_PORT, Integer.toString(port));
e.putString(G.PREF_PATH, path);
e.putString(G.PREF_USER, username);
e.putString(G.PREF_PASS, password);
e.putBoolean(G.PREF_SSL, useSSL);
e.putString(G.PREF_TIMEOUT, Integer.toString(timeout));
e.putString(G.PREF_RETRIES, Integer.toString(retries));
e.putStringSet(G.PREF_DIRECTORIES, directories);
e.putBoolean(G.PREF_PROXY, useProxy);
e.putString(G.PREF_PROXY_HOST, proxyHost);
e.putString(G.PREF_PROXY_PORT, Integer.toString(proxyPort));
e.putString(G.PREF_UPDATE_INTERVAL, Integer.toString(updateInterval));
e.putString(G.PREF_FULL_UPDATE, Integer.toString(fullUpdate));
e.putInt(G.PREF_COLOR, color);
e.apply();
}
public String getLastDownloadDirectory() {
return getPreferences().getString(G.PREF_LAST_DIRECTORY + id, "");
}
public void setLastDownloadDirectory(String directory) {
SharedPreferences pref = getPreferences();
Editor e = pref.edit();
lastDirectory = directory;
e.putString(G.PREF_LAST_DIRECTORY + id, directory);
e.apply();
}
public boolean getMoveData() {
return moveData;
}
public void setMoveData(boolean move) {
SharedPreferences pref = getPreferences();
Editor e = pref.edit();
moveData = move;
e.putBoolean(G.PREF_MOVE_DATA + id, move);
e.apply();
}
public boolean getDeleteLocal() {
return deleteLocal;
}
public void setDeleteLocal(boolean delete) {
SharedPreferences pref = getPreferences();
Editor e = pref.edit();
deleteLocal = delete;
e.putBoolean(G.PREF_DELETE_LOCAL + id, delete);
e.apply();
}
public boolean getStartPaused() {
return startPaused;
}
public void setStartPaused(boolean paused) {
SharedPreferences pref = getPreferences();
Editor e = pref.edit();
startPaused = paused;
e.putBoolean(G.PREF_START_PAUSED + id, paused);
e.commit();
}
@Override public int compareTo(TransmissionProfile another) {
return name.compareToIgnoreCase(another.getName());
}
@Override public String toString() {
return name + "://" + username + '@' + host + ':' + port;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TransmissionProfile that = (TransmissionProfile) o;
if (id != null ? !id.equals(that.id) : that.id != null) return false;
return true;
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel in, int flags) {
in.writeString(id);
in.writeString(name);
in.writeString(host);
in.writeInt(port);
in.writeString(path);
in.writeString(username);
in.writeString(password);
in.writeInt(useSSL ? 1 : 0);
in.writeInt(timeout);
in.writeInt(retries);
in.writeStringList(new ArrayList<>(directories));
in.writeString(lastDirectory);
in.writeInt(moveData ? 1 : 0);
in.writeInt(deleteLocal ? 1 : 0);
in.writeInt(startPaused ? 1 : 0);
in.writeInt(useProxy ? 1 : 0);
in.writeString(proxyHost);
in.writeInt(proxyPort);
in.writeInt(updateInterval);
in.writeInt(fullUpdate);
in.writeInt(color);
}
public static final Parcelable.Creator<TransmissionProfile> CREATOR
= new Parcelable.Creator<TransmissionProfile>() {
@Override
public TransmissionProfile createFromParcel(Parcel in) {
return new TransmissionProfile(in);
}
@Override
public TransmissionProfile[] newArray(int size) {
return new TransmissionProfile[size];
}
};
private TransmissionProfile(Parcel in) {
id = in.readString();
name = in.readString();
host = in.readString();
port = in.readInt();
path = in.readString();
username = in.readString();
password = in.readString();
useSSL = in.readInt() == 1;
timeout = in.readInt();
retries = in.readInt();
ArrayList<String> directories = new ArrayList<>();
in.readStringList(directories);
this.directories = new HashSet<>(directories);
lastDirectory = in.readString();
moveData = in.readInt() == 1;
deleteLocal = in.readInt() == 1;
startPaused = in.readInt() == 1;
useProxy = in.readInt() == 1;
proxyHost = in.readString();
proxyPort = in.readInt();
updateInterval = in.readInt();
fullUpdate = in.readInt();
color = in.readInt();
}
private SharedPreferences getPreferences() {
return GearShiftApplication.get().getSharedPreferences(
getPreferencesName(), Activity.MODE_PRIVATE);
}
}