package biz.bokhorst.xprivacy;
import java.io.File;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Process;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class ActivitySettings extends ActivityBase implements OnCheckedChangeListener, OnClickListener {
private int userId;
private int uid;
private boolean isApp;
private boolean odSystem;
private boolean expert;
private CheckBox cbNotify;
private CheckBox cbOnDemand;
private CheckBox cbBlacklist;
private CheckBox cbUsage;
private CheckBox cbParameters;
private CheckBox cbValues;
private CheckBox cbLog;
private CheckBox cbSystem;
private CheckBox cbExperimental;
private CheckBox cbHttps;
private CheckBox cbAOSP;
private EditText etConfidence;
private EditText etQuirks;
private Button btnFlush;
private Button btnClearDb;
private CheckBox cbRandom;
private EditText etSerial;
private EditText etLat;
private EditText etLon;
private EditText etAlt;
private EditText etSearch;
private EditText etMac;
private EditText etIP;
private EditText etImei;
private EditText etPhone;
private EditText etId;
private EditText etGsfId;
private EditText etAdId;
private EditText etMcc;
private EditText etMnc;
private EditText etCountry;
private EditText etOperator;
private EditText etIccId;
private EditText etCid;
private EditText etLac;
private EditText etSubscriber;
private EditText etSSID;
private EditText etUa;
private CheckBox cbSerial;
private CheckBox cbLat;
private CheckBox cbLon;
private CheckBox cbAlt;
private CheckBox cbMac;
private CheckBox cbImei;
private CheckBox cbPhone;
private CheckBox cbId;
private CheckBox cbGsfId;
private CheckBox cbAdId;
private CheckBox cbCountry;
private CheckBox cbSubscriber;
private CheckBox cbSSID;
public static final String ACTION_SETTINGS = "biz.bokhorst.xprivacy.action.SETTINGS";
public static final String cUid = "Uid";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings);
setSupportActionBar((Toolbar) findViewById(R.id.widgetToolbar));
setTitle(R.string.menu_settings);
userId = Util.getUserId(Process.myUid());
final Bundle extras = getIntent().getExtras();
if (extras != null && extras.containsKey(cUid))
uid = extras.getInt(cUid);
else
uid = userId;
// Reference controls
TextView tvInfo = (TextView) findViewById(R.id.tvInfo);
cbNotify = (CheckBox) findViewById(R.id.cbNotify);
cbOnDemand = (CheckBox) findViewById(R.id.cbOnDemand);
cbBlacklist = (CheckBox) findViewById(R.id.cbBlacklist);
cbUsage = (CheckBox) findViewById(R.id.cbUsage);
cbParameters = (CheckBox) findViewById(R.id.cbParameters);
cbValues = (CheckBox) findViewById(R.id.cbValues);
cbLog = (CheckBox) findViewById(R.id.cbLog);
CheckBox cbExpert = (CheckBox) findViewById(R.id.cbExpert);
cbSystem = (CheckBox) findViewById(R.id.cbSystem);
cbExperimental = (CheckBox) findViewById(R.id.cbExperimental);
cbHttps = (CheckBox) findViewById(R.id.cbHttps);
cbAOSP = (CheckBox) findViewById(R.id.cbAOSP);
LinearLayout llConfidence = (LinearLayout) findViewById(R.id.llConfidence);
etConfidence = (EditText) findViewById(R.id.etConfidence);
etQuirks = (EditText) findViewById(R.id.etQuirks);
btnFlush = (Button) findViewById(R.id.btnFlush);
btnClearDb = (Button) findViewById(R.id.btnClearDb);
cbRandom = (CheckBox) findViewById(R.id.cbRandom);
Button btnRandom = (Button) findViewById(R.id.btnRandom);
Button btnClear = (Button) findViewById(R.id.btnClear);
etSerial = (EditText) findViewById(R.id.etSerial);
etLat = (EditText) findViewById(R.id.etLat);
etLon = (EditText) findViewById(R.id.etLon);
etAlt = (EditText) findViewById(R.id.etAlt);
etSearch = (EditText) findViewById(R.id.etSearch);
Button btnSearch = (Button) findViewById(R.id.btnSearch);
etMac = (EditText) findViewById(R.id.etMac);
etIP = (EditText) findViewById(R.id.etIP);
etImei = (EditText) findViewById(R.id.etImei);
etPhone = (EditText) findViewById(R.id.etPhone);
etId = (EditText) findViewById(R.id.etId);
etGsfId = (EditText) findViewById(R.id.etGsfId);
etAdId = (EditText) findViewById(R.id.etAdId);
etMcc = (EditText) findViewById(R.id.etMcc);
etMnc = (EditText) findViewById(R.id.etMnc);
etCountry = (EditText) findViewById(R.id.etCountry);
etOperator = (EditText) findViewById(R.id.etOperator);
etIccId = (EditText) findViewById(R.id.etIccId);
etCid = (EditText) findViewById(R.id.etCid);
etLac = (EditText) findViewById(R.id.etLac);
etSubscriber = (EditText) findViewById(R.id.etSubscriber);
etSSID = (EditText) findViewById(R.id.etSSID);
etUa = (EditText) findViewById(R.id.etUa);
cbSerial = (CheckBox) findViewById(R.id.cbSerial);
cbLat = (CheckBox) findViewById(R.id.cbLat);
cbLon = (CheckBox) findViewById(R.id.cbLon);
cbAlt = (CheckBox) findViewById(R.id.cbAlt);
cbMac = (CheckBox) findViewById(R.id.cbMac);
cbImei = (CheckBox) findViewById(R.id.cbImei);
cbPhone = (CheckBox) findViewById(R.id.cbPhone);
cbId = (CheckBox) findViewById(R.id.cbId);
cbGsfId = (CheckBox) findViewById(R.id.cbGsfId);
cbAdId = (CheckBox) findViewById(R.id.cbAdId);
cbCountry = (CheckBox) findViewById(R.id.cbCountry);
cbSubscriber = (CheckBox) findViewById(R.id.cbSubscriber);
cbSSID = (CheckBox) findViewById(R.id.cbSSID);
// Listen for changes
cbParameters.setOnCheckedChangeListener(this);
cbValues.setOnCheckedChangeListener(this);
cbExpert.setOnCheckedChangeListener(this);
cbSerial.setOnCheckedChangeListener(this);
cbLat.setOnCheckedChangeListener(this);
cbLon.setOnCheckedChangeListener(this);
cbAlt.setOnCheckedChangeListener(this);
cbMac.setOnCheckedChangeListener(this);
cbImei.setOnCheckedChangeListener(this);
cbPhone.setOnCheckedChangeListener(this);
cbId.setOnCheckedChangeListener(this);
cbGsfId.setOnCheckedChangeListener(this);
cbAdId.setOnCheckedChangeListener(this);
cbCountry.setOnCheckedChangeListener(this);
cbSubscriber.setOnCheckedChangeListener(this);
cbSSID.setOnCheckedChangeListener(this);
// Get current values
boolean usage = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingUsage, true);
boolean parameters = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingParameters, false);
boolean values = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingValues, false);
boolean log = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingLog, false);
boolean components = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingSystem, false);
boolean experimental = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingExperimental, false);
boolean https = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingHttps, true);
boolean aosp = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingAOSPMode, false);
String confidence = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingConfidence, "");
// Get quirks
boolean freeze = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingFreeze, false);
boolean resolve = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingResolve, false);
boolean noresolve = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingNoResolve, false);
boolean permman = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingPermMan, false);
boolean iwall = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingIntentWall, false);
boolean safemode = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingSafeMode, false);
boolean test = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingTestVersions, false);
boolean updates = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingUpdates, false);
boolean odsystem = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingOnDemandSystem, false);
boolean wnomod = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingWhitelistNoModify, false);
boolean nousage = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingNoUsageData, false);
List<String> listQuirks = new ArrayList<String>();
if (freeze)
listQuirks.add("freeze");
if (resolve)
listQuirks.add("resolve");
if (noresolve)
listQuirks.add("noresolve");
if (permman)
listQuirks.add("permman");
if (iwall)
listQuirks.add("iwall");
if (safemode)
listQuirks.add("safemode");
if (test)
listQuirks.add("test");
if (updates)
listQuirks.add("updates");
if (odsystem)
listQuirks.add("odsystem");
if (wnomod)
listQuirks.add("wnomod");
if (nousage)
listQuirks.add("nousage");
Collections.sort(listQuirks);
String quirks = TextUtils.join(",", listQuirks.toArray());
expert = (components || experimental || !https || aosp || !"".equals(confidence) || listQuirks.size() > 0);
// Application specific
boolean notify = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingNotify, true);
boolean ondemand = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingOnDemand, uid == userId);
boolean blacklist = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingBlacklist, false);
boolean enabled = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingRestricted, true);
// Common
boolean random = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingRandom, false);
String serial = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingSerial, "");
String lat = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingLatitude, "");
String lon = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingLongitude, "");
String alt = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingAltitude, "");
String mac = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingMac, "");
String imei = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingImei, "");
String phone = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingPhone, "");
String id = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingId, "");
String gsfid = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingGsfId, "");
String adid = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingAdId, "");
String country = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingCountry, "");
String subscriber = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingSubscriber, "");
String ssid = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingSSID, "");
// Set current values
if (uid == userId) {
// Global settings
tvInfo.setVisibility(View.GONE);
cbUsage.setChecked(usage);
cbParameters.setChecked(parameters);
cbValues.setChecked(values);
if (userId == 0)
cbLog.setChecked(log);
else {
cbLog.setVisibility(View.GONE);
btnFlush.setVisibility(View.GONE);
btnClearDb.setVisibility(View.GONE);
}
cbExpert.setChecked(expert);
if (PrivacyManager.cVersion3
&& (!Util.isSELinuxEnforced() || "true".equals(Util.getXOption("ignoreselinux"))))
cbAOSP.setVisibility(View.VISIBLE);
if (expert) {
cbSystem.setChecked(components);
cbExperimental.setChecked(experimental);
cbHttps.setChecked(https);
cbAOSP.setChecked(aosp);
etConfidence.setText(confidence);
etQuirks.setText(quirks);
} else {
cbSystem.setEnabled(false);
cbExperimental.setEnabled(false);
cbHttps.setEnabled(false);
cbHttps.setChecked(true);
cbAOSP.setEnabled(false);
cbAOSP.setChecked(false);
etConfidence.setEnabled(false);
etQuirks.setEnabled(false);
btnFlush.setEnabled(false);
btnClearDb.setEnabled(false);
}
} else {
// Display application names
ApplicationInfoEx appInfo = new ApplicationInfoEx(this, uid);
getSupportActionBar().setSubtitle(TextUtils.join(", ", appInfo.getApplicationName()));
// Disable global settings
cbUsage.setVisibility(View.GONE);
cbParameters.setVisibility(View.GONE);
cbValues.setVisibility(View.GONE);
cbLog.setVisibility(View.GONE);
cbSystem.setVisibility(View.GONE);
cbExperimental.setVisibility(View.GONE);
cbHttps.setVisibility(View.GONE);
cbAOSP.setVisibility(View.GONE);
llConfidence.setVisibility(View.GONE);
btnFlush.setVisibility(View.GONE);
btnClearDb.setVisibility(View.GONE);
cbExpert.setChecked(expert);
if (expert)
etQuirks.setText(quirks);
else
etQuirks.setEnabled(false);
}
boolean gnotify = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingNotify, true);
if (uid == userId || gnotify)
cbNotify.setChecked(notify);
else
cbNotify.setVisibility(View.GONE);
isApp = PrivacyManager.isApplication(uid);
odSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemandSystem, false);
boolean gondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
if (uid == userId || ((isApp || odSystem) && gondemand)) {
cbOnDemand.setChecked(ondemand);
cbOnDemand.setEnabled(enabled);
} else
cbOnDemand.setVisibility(View.GONE);
String blFileName = Environment.getExternalStorageDirectory().getPath() + "/.xprivacy/blacklist";
if (uid == userId || !new File(blFileName).exists())
cbBlacklist.setVisibility(View.GONE);
else
cbBlacklist.setChecked(blacklist);
// Common
cbRandom.setChecked(random);
// Set randomize on access check boxes
cbSerial.setChecked(serial.equals(PrivacyManager.cValueRandom));
cbLat.setChecked(lat.equals(PrivacyManager.cValueRandom));
cbLon.setChecked(lon.equals(PrivacyManager.cValueRandom));
cbAlt.setChecked(alt.equals(PrivacyManager.cValueRandom));
cbMac.setChecked(mac.equals(PrivacyManager.cValueRandom));
cbImei.setChecked(imei.equals(PrivacyManager.cValueRandom));
cbPhone.setChecked(phone.equals(PrivacyManager.cValueRandom));
cbId.setChecked(id.equals(PrivacyManager.cValueRandom));
cbGsfId.setChecked(gsfid.equals(PrivacyManager.cValueRandom));
cbAdId.setChecked(adid.equals(PrivacyManager.cValueRandom));
cbCountry.setChecked(country.equals(PrivacyManager.cValueRandom));
cbSubscriber.setChecked(subscriber.equals(PrivacyManager.cValueRandom));
cbSSID.setChecked(ssid.equals(PrivacyManager.cValueRandom));
// Set fake values
etSerial.setText(cbSerial.isChecked() ? "" : serial);
etLat.setText(cbLat.isChecked() ? "" : lat);
etLon.setText(cbLon.isChecked() ? "" : lon);
etAlt.setText(cbAlt.isChecked() ? "" : alt);
etMac.setText(cbMac.isChecked() ? "" : mac);
etImei.setText(cbImei.isChecked() ? "" : imei);
etPhone.setText(cbPhone.isChecked() ? "" : phone);
etId.setText(cbId.isChecked() ? "" : id);
etGsfId.setText(cbGsfId.isChecked() ? "" : gsfid);
etAdId.setText(cbAdId.isChecked() ? "" : adid);
etCountry.setText(cbCountry.isChecked() ? "" : country);
etSubscriber.setText(cbSubscriber.isChecked() ? "" : subscriber);
etSSID.setText(cbSSID.isChecked() ? "" : ssid);
etSerial.setEnabled(!cbSerial.isChecked());
etLat.setEnabled(!cbLat.isChecked());
etLon.setEnabled(!cbLon.isChecked());
etAlt.setEnabled(!cbAlt.isChecked());
etSearch.setEnabled(Geocoder.isPresent());
btnSearch.setEnabled(Geocoder.isPresent());
etMac.setEnabled(!cbMac.isChecked());
etImei.setEnabled(!cbImei.isChecked());
etPhone.setEnabled(!cbPhone.isChecked());
etId.setEnabled(!cbId.isChecked());
etGsfId.setEnabled(!cbGsfId.isChecked());
etAdId.setEnabled(!cbAdId.isChecked());
etCountry.setEnabled(!cbCountry.isChecked());
etSubscriber.setEnabled(!cbSubscriber.isChecked());
etSSID.setEnabled(!cbSSID.isChecked());
etIP.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingIP, ""));
etMcc.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingMcc, ""));
etMnc.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingMnc, ""));
etOperator.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingOperator, ""));
etIccId.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingIccId, ""));
etCid.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingCid, ""));
etLac.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingLac, ""));
etUa.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingUa, ""));
btnFlush.setOnClickListener(this);
btnClearDb.setOnClickListener(this);
btnRandom.setOnClickListener(this);
btnClear.setOnClickListener(this);
btnSearch.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
if (inflater != null && PrivacyService.checkClient()) {
inflater.inflate(R.menu.settings, menu);
return true;
} else
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_cancel:
finish();
return true;
case R.id.menu_save:
optionSave();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
switch (buttonView.getId()) {
case R.id.cbParameters:
case R.id.cbValues:
if (isChecked && Util.hasProLicense(this) == null) {
buttonView.setChecked(false);
Util.viewUri(this, ActivityMain.cProUri);
}
break;
case R.id.cbExpert:
cbSystem.setEnabled(isChecked);
cbExperimental.setEnabled(isChecked);
cbHttps.setEnabled(isChecked);
cbAOSP.setEnabled(isChecked);
etConfidence.setEnabled(isChecked);
etQuirks.setEnabled(isChecked);
btnFlush.setEnabled(isChecked);
btnClearDb.setEnabled(isChecked);
if (isChecked) {
if (!expert)
Toast.makeText(this, getString(R.string.msg_expert), Toast.LENGTH_LONG).show();
} else {
cbSystem.setChecked(false);
cbExperimental.setChecked(false);
cbHttps.setChecked(true);
cbAOSP.setChecked(false);
etConfidence.setText("");
etQuirks.setText("");
}
break;
case R.id.cbSerial:
etSerial.setEnabled(!isChecked);
break;
case R.id.cbLat:
etLat.setEnabled(!isChecked);
break;
case R.id.cbLon:
etLon.setEnabled(!isChecked);
break;
case R.id.cbAlt:
etAlt.setEnabled(!isChecked);
break;
case R.id.cbMac:
etMac.setEnabled(!isChecked);
break;
case R.id.cbImei:
etImei.setEnabled(!isChecked);
break;
case R.id.cbPhone:
etPhone.setEnabled(!isChecked);
break;
case R.id.cbId:
etId.setEnabled(!isChecked);
break;
case R.id.cbGsfId:
etGsfId.setEnabled(!isChecked);
break;
case R.id.cbAdId:
etAdId.setEnabled(!isChecked);
break;
case R.id.cbCountry:
etCountry.setEnabled(!isChecked);
break;
case R.id.cbSubscriber:
etSubscriber.setEnabled(!isChecked);
break;
case R.id.cbSSID:
etSSID.setEnabled(!isChecked);
break;
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnFlush:
flush();
break;
case R.id.btnClearDb:
clearDB();
break;
case R.id.btnRandom:
randomize();
break;
case R.id.btnClear:
clear();
break;
case R.id.btnSearch:
search();
break;
}
}
private void clearDB() {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivitySettings.this);
alertDialogBuilder.setTitle(R.string.menu_clear_db);
alertDialogBuilder.setMessage(R.string.msg_sure);
alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
alertDialogBuilder.setPositiveButton(getString(android.R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
PrivacyManager.clear();
Toast.makeText(ActivitySettings.this, getString(R.string.msg_reboot), Toast.LENGTH_LONG).show();
finish();
// Refresh main UI
Intent intent = new Intent(ActivitySettings.this, ActivityMain.class);
intent.putExtra(ActivityMain.cAction, ActivityMain.cActionRefresh);
startActivity(intent);
}
});
alertDialogBuilder.setNegativeButton(getString(android.R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
private void randomize() {
etSerial.setText(PrivacyManager.getRandomProp("SERIAL"));
etLat.setText(PrivacyManager.getRandomProp("LAT"));
etLon.setText(PrivacyManager.getRandomProp("LON"));
etAlt.setText(PrivacyManager.getRandomProp("ALT"));
etMac.setText(PrivacyManager.getRandomProp("MAC"));
etImei.setText(PrivacyManager.getRandomProp("IMEI"));
etPhone.setText(PrivacyManager.getRandomProp("PHONE"));
etId.setText(PrivacyManager.getRandomProp("ANDROID_ID"));
etGsfId.setText(PrivacyManager.getRandomProp("GSF_ID"));
etAdId.setText(PrivacyManager.getRandomProp("AdvertisingId"));
etCountry.setText(PrivacyManager.getRandomProp("ISO3166"));
etSubscriber.setText(PrivacyManager.getRandomProp("SubscriberId"));
etSSID.setText(PrivacyManager.getRandomProp("SSID"));
}
private void clear() {
final EditText[] edits = new EditText[] { etSerial, etLat, etLon, etAlt, etMac, etIP, etImei, etPhone, etId,
etGsfId, etAdId, etMcc, etMnc, etCountry, etOperator, etIccId, etCid, etLac, etSubscriber, etSSID, etUa };
final CheckBox[] boxes = new CheckBox[] { cbSerial, cbLat, cbLon, cbAlt, cbMac, cbImei, cbPhone, cbId, cbGsfId,
cbAdId, cbCountry, cbSubscriber, cbSSID };
for (EditText edit : edits)
edit.setText("");
etSearch.setText("");
for (CheckBox box : boxes)
box.setChecked(false);
}
private void search() {
try {
String search = etSearch.getText().toString();
final List<Address> listAddress = new Geocoder(ActivitySettings.this).getFromLocationName(search, 1);
if (listAddress.size() > 0) {
Address address = listAddress.get(0);
// Get coordinates
if (address.hasLatitude()) {
cbLat.setChecked(false);
etLat.setText(Double.toString(address.getLatitude()));
}
if (address.hasLongitude()) {
cbLon.setChecked(false);
etLon.setText(Double.toString(address.getLongitude()));
}
// Get address
StringBuilder sb = new StringBuilder();
for (int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
if (i != 0)
sb.append(", ");
sb.append(address.getAddressLine(i));
}
etSearch.setText(sb.toString());
}
} catch (Throwable ex) {
Toast.makeText(ActivitySettings.this, ex.getMessage(), Toast.LENGTH_LONG).show();
}
}
private void flush() {
Intent flushIntent = new Intent(UpdateService.cFlush);
flushIntent.setPackage(getPackageName());
startService(flushIntent);
Toast.makeText(ActivitySettings.this, getString(R.string.msg_done), Toast.LENGTH_LONG).show();
}
@SuppressLint("DefaultLocale")
private void optionSave() {
if (uid == userId) {
// Global settings
PrivacyManager.setSetting(uid, PrivacyManager.cSettingUsage, Boolean.toString(cbUsage.isChecked()));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingParameters,
Boolean.toString(cbParameters.isChecked()));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingValues, Boolean.toString(cbValues.isChecked()));
if (userId == 0)
PrivacyManager.setSetting(uid, PrivacyManager.cSettingLog, Boolean.toString(cbLog.isChecked()));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingSystem, Boolean.toString(cbSystem.isChecked()));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingExperimental,
Boolean.toString(cbExperimental.isChecked()));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingHttps, Boolean.toString(cbHttps.isChecked()));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingAOSPMode, Boolean.toString(cbAOSP.isChecked()));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingConfidence, etConfidence.getText().toString());
}
// Quirks
List<String> listQuirks = Arrays
.asList(etQuirks.getText().toString().toLowerCase().replace(" ", "").split(","));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingFreeze, Boolean.toString(listQuirks.contains("freeze")));
PrivacyManager
.setSetting(uid, PrivacyManager.cSettingResolve, Boolean.toString(listQuirks.contains("resolve")));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingNoResolve,
Boolean.toString(listQuirks.contains("noresolve")));
PrivacyManager
.setSetting(uid, PrivacyManager.cSettingPermMan, Boolean.toString(listQuirks.contains("permman")));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingIntentWall,
Boolean.toString(listQuirks.contains("iwall")));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingSafeMode,
Boolean.toString(listQuirks.contains("safemode")));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingTestVersions,
Boolean.toString(listQuirks.contains("test")));
PrivacyManager
.setSetting(uid, PrivacyManager.cSettingUpdates, Boolean.toString(listQuirks.contains("updates")));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingOnDemandSystem,
Boolean.toString(listQuirks.contains("odsystem")));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingWhitelistNoModify,
Boolean.toString(listQuirks.contains("wnomod")));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingNoUsageData,
Boolean.toString(listQuirks.contains("nousage")));
// Notifications
PrivacyManager.setSetting(uid, PrivacyManager.cSettingNotify, Boolean.toString(cbNotify.isChecked()));
// On demand restricting
if (uid == userId || (isApp || odSystem))
PrivacyManager.setSetting(uid, PrivacyManager.cSettingOnDemand, Boolean.toString(cbOnDemand.isChecked()));
if (uid != userId)
PrivacyManager.setSetting(uid, PrivacyManager.cSettingBlacklist, Boolean.toString(cbBlacklist.isChecked()));
// Random at boot
PrivacyManager.setSetting(uid, PrivacyManager.cSettingRandom, cbRandom.isChecked() ? Boolean.toString(true)
: null);
// Serial#
PrivacyManager.setSetting(uid, PrivacyManager.cSettingSerial, getValue(cbSerial, etSerial));
// Set latitude
if (cbLat.isChecked())
PrivacyManager.setSetting(uid, PrivacyManager.cSettingLatitude, PrivacyManager.cValueRandom);
else
try {
float lat = Float.parseFloat(etLat.getText().toString().replace(',', '.'));
if (lat < -90 || lat > 90)
throw new InvalidParameterException();
PrivacyManager.setSetting(uid, PrivacyManager.cSettingLatitude, Float.toString(lat));
} catch (Throwable ignored) {
PrivacyManager.setSetting(uid, PrivacyManager.cSettingLatitude, null);
}
// Set longitude
if (cbLon.isChecked())
PrivacyManager.setSetting(uid, PrivacyManager.cSettingLongitude, PrivacyManager.cValueRandom);
else
try {
float lon = Float.parseFloat(etLon.getText().toString().replace(',', '.'));
if (lon < -180 || lon > 180)
throw new InvalidParameterException();
PrivacyManager.setSetting(uid, PrivacyManager.cSettingLongitude, Float.toString(lon));
} catch (Throwable ignored) {
PrivacyManager.setSetting(uid, PrivacyManager.cSettingLongitude, null);
}
// Set altitude
if (cbAlt.isChecked())
PrivacyManager.setSetting(uid, PrivacyManager.cSettingAltitude, PrivacyManager.cValueRandom);
else
try {
float alt = Float.parseFloat(etAlt.getText().toString().replace(',', '.'));
if (alt < -10000 || alt > 10000)
throw new InvalidParameterException();
PrivacyManager.setSetting(uid, PrivacyManager.cSettingAltitude, Float.toString(alt));
} catch (Throwable ignored) {
PrivacyManager.setSetting(uid, PrivacyManager.cSettingAltitude, null);
}
// Check Gsf ID
try {
String value = etGsfId.getText().toString();
if (!"".equals(value))
Long.parseLong(value.toLowerCase(), 16);
} catch (NumberFormatException ignored) {
etGsfId.setText("");
}
// Other settings
PrivacyManager.setSetting(uid, PrivacyManager.cSettingMac, getValue(cbMac, etMac));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingIP, getValue(null, etIP));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingImei, getValue(cbImei, etImei));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingPhone, getValue(cbPhone, etPhone));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingId, getValue(cbId, etId));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingGsfId, getValue(cbGsfId, etGsfId));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingAdId, getValue(cbAdId, etAdId));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingMcc, getValue(null, etMcc));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingMnc, getValue(null, etMnc));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingCountry, getValue(cbCountry, etCountry));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingOperator, getValue(null, etOperator));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingIccId, getValue(null, etIccId));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingCid, getValue(null, etCid));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingLac, getValue(null, etLac));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingSubscriber, getValue(cbSubscriber, etSubscriber));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingSSID, getValue(cbSSID, etSSID));
PrivacyManager.setSetting(uid, PrivacyManager.cSettingUa, getValue(null, etUa));
finish();
// Refresh view
if (uid == userId) {
Intent intent = new Intent(ActivitySettings.this, ActivityMain.class);
startActivity(intent);
} else {
Intent intent = new Intent(ActivitySettings.this, ActivityApp.class);
intent.putExtra(ActivityApp.cUid, uid);
intent.putExtra(ActivityApp.cAction, ActivityApp.cActionRefresh);
startActivity(intent);
}
}
private static String getValue(CheckBox check, EditText edit) {
if (check != null && check.isChecked())
return PrivacyManager.cValueRandom;
String value = edit.getText().toString().trim();
return ("".equals(value) ? null : value);
}
}