package org.fdroid.fdroid.views.fragments;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.support.v4.preference.PreferenceFragment;
import android.text.TextUtils;
import org.fdroid.fdroid.AppDetails;
import org.fdroid.fdroid.CleanCacheService;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.PreferencesActivity;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.installer.InstallHistoryService;
import org.fdroid.fdroid.installer.PrivilegedInstaller;
import info.guardianproject.netcipher.NetCipher;
import info.guardianproject.netcipher.proxy.OrbotHelper;
public class PreferencesFragment extends PreferenceFragment
implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String[] SUMMARIES_TO_UPDATE = {
Preferences.PREF_UPD_INTERVAL,
Preferences.PREF_UPD_WIFI_ONLY,
Preferences.PREF_UPD_NOTIFY,
Preferences.PREF_UPD_HISTORY,
Preferences.PREF_ROOTED,
Preferences.PREF_HIDE_ANTI_FEATURE_APPS,
Preferences.PREF_INCOMP_VER,
Preferences.PREF_THEME,
Preferences.PREF_IGN_TOUCH,
Preferences.PREF_LOCAL_REPO_NAME,
Preferences.PREF_LANGUAGE,
Preferences.PREF_KEEP_CACHE_TIME,
Preferences.PREF_EXPERT,
Preferences.PREF_PRIVILEGED_INSTALLER,
Preferences.PREF_ENABLE_PROXY,
Preferences.PREF_PROXY_HOST,
Preferences.PREF_PROXY_PORT,
};
private static final int REQUEST_INSTALL_ORBOT = 0x1234;
private CheckBoxPreference enableProxyCheckPref;
private CheckBoxPreference useTorCheckPref;
private Preference updateAutoDownloadPref;
private Preference updatePrivilegedExtensionPref;
private long currentKeepCacheTime;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
useTorCheckPref = (CheckBoxPreference) findPreference(Preferences.PREF_USE_TOR);
enableProxyCheckPref = (CheckBoxPreference) findPreference(Preferences.PREF_ENABLE_PROXY);
updateAutoDownloadPref = findPreference(Preferences.PREF_AUTO_DOWNLOAD_INSTALL_UPDATES);
updatePrivilegedExtensionPref = findPreference(Preferences.PREF_UNINSTALL_PRIVILEGED_APP);
}
private void checkSummary(String key, int resId) {
CheckBoxPreference pref = (CheckBoxPreference) findPreference(key);
pref.setSummary(resId);
}
private void entrySummary(String key) {
ListPreference pref = (ListPreference) findPreference(key);
pref.setSummary(pref.getEntry());
}
private void textSummary(String key, int resId) {
EditTextPreference pref = (EditTextPreference) findPreference(key);
pref.setSummary(getString(resId, pref.getText()));
}
private void updateSummary(String key, boolean changing) {
int result = 0;
switch (key) {
case Preferences.PREF_UPD_INTERVAL:
ListPreference listPref = (ListPreference) findPreference(
Preferences.PREF_UPD_INTERVAL);
int interval = Integer.parseInt(listPref.getValue());
Preference onlyOnWifi = findPreference(
Preferences.PREF_UPD_WIFI_ONLY);
onlyOnWifi.setEnabled(interval > 0);
if (interval == 0) {
listPref.setSummary(R.string.update_interval_zero);
} else {
listPref.setSummary(listPref.getEntry());
}
break;
case Preferences.PREF_UPD_WIFI_ONLY:
checkSummary(key, R.string.automatic_scan_wifi_on);
break;
case Preferences.PREF_UPD_NOTIFY:
checkSummary(key, R.string.notify_on);
break;
case Preferences.PREF_UPD_HISTORY:
textSummary(key, R.string.update_history_summ);
break;
case Preferences.PREF_THEME:
entrySummary(key);
if (changing) {
result |= PreferencesActivity.RESULT_RESTART;
getActivity().setResult(result);
}
break;
case Preferences.PREF_INCOMP_VER:
checkSummary(key, R.string.show_incompat_versions_on);
break;
case Preferences.PREF_ROOTED:
checkSummary(key, R.string.rooted_on);
break;
case Preferences.PREF_HIDE_ANTI_FEATURE_APPS:
checkSummary(key, R.string.hide_anti_feature_apps_on);
break;
case Preferences.PREF_IGN_TOUCH:
checkSummary(key, R.string.ignoreTouch_on);
break;
case Preferences.PREF_LOCAL_REPO_NAME:
textSummary(key, R.string.local_repo_name_summary);
break;
case Preferences.PREF_LOCAL_REPO_HTTPS:
checkSummary(key, R.string.local_repo_https_on);
break;
case Preferences.PREF_LANGUAGE:
entrySummary(key);
if (changing) {
result |= PreferencesActivity.RESULT_RESTART;
Activity activity = getActivity();
activity.setResult(result);
((FDroidApp) activity.getApplication()).updateLanguage();
}
break;
case Preferences.PREF_KEEP_CACHE_TIME:
entrySummary(key);
if (changing
&& currentKeepCacheTime != Preferences.get().getKeepCacheTime()) {
CleanCacheService.schedule(getContext());
}
break;
case Preferences.PREF_EXPERT:
checkSummary(key, R.string.expert_on);
break;
case Preferences.PREF_PRIVILEGED_INSTALLER:
checkSummary(key, R.string.system_installer_on);
break;
case Preferences.PREF_ENABLE_PROXY:
CheckBoxPreference checkPref = (CheckBoxPreference) findPreference(key);
checkPref.setSummary(R.string.enable_proxy_summary);
break;
case Preferences.PREF_PROXY_HOST:
EditTextPreference textPref = (EditTextPreference) findPreference(key);
String text = Preferences.get().getProxyHost();
if (TextUtils.isEmpty(text) || text.equals(Preferences.DEFAULT_PROXY_HOST)) {
textPref.setSummary(R.string.proxy_host_summary);
} else {
textPref.setSummary(text);
}
break;
case Preferences.PREF_PROXY_PORT:
EditTextPreference textPref2 = (EditTextPreference) findPreference(key);
int port = Preferences.get().getProxyPort();
if (port == Preferences.DEFAULT_PROXY_PORT) {
textPref2.setSummary(R.string.proxy_port_summary);
} else {
textPref2.setSummary(String.valueOf(port));
}
break;
case Preferences.PREF_KEEP_INSTALL_HISTORY:
CheckBoxPreference p = (CheckBoxPreference) findPreference(key);
if (p.isChecked()) {
InstallHistoryService.register(getContext());
} else {
InstallHistoryService.unregister(getContext());
}
break;
}
}
/**
* Initializes SystemInstaller preference, which can only be enabled when F-Droid is installed as a system-app
*/
private void initPrivilegedInstallerPreference() {
final CheckBoxPreference pref = (CheckBoxPreference) findPreference(Preferences.PREF_PRIVILEGED_INSTALLER);
Preferences p = Preferences.get();
boolean enabled = p.isPrivilegedInstallerEnabled();
boolean installed = PrivilegedInstaller.isExtensionInstalledCorrectly(getActivity())
== PrivilegedInstaller.IS_EXTENSION_INSTALLED_YES;
pref.setEnabled(installed);
pref.setDefaultValue(installed);
pref.setChecked(enabled && installed);
pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
SharedPreferences.Editor editor = pref.getSharedPreferences().edit();
if (pref.isChecked()) {
editor.remove(Preferences.PREF_PRIVILEGED_INSTALLER);
} else {
editor.putBoolean(Preferences.PREF_PRIVILEGED_INSTALLER, false);
}
editor.apply();
return true;
}
});
}
private void initUpdatePrivilegedExtensionPreference() {
if (Build.VERSION.SDK_INT > 19) {
// this will never work on newer Android versions, so hide it
PreferenceCategory other = (PreferenceCategory) findPreference("pref_category_other");
other.removePreference(updatePrivilegedExtensionPref);
return;
}
updatePrivilegedExtensionPref.setPersistent(false);
updatePrivilegedExtensionPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
// Open details of F-Droid Privileged
Intent intent = new Intent(getActivity(), AppDetails.class);
intent.putExtra(AppDetails.EXTRA_APPID,
PrivilegedInstaller.PRIVILEGED_EXTENSION_PACKAGE_NAME);
startActivity(intent);
return true;
}
});
}
@Override
public void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
for (final String key : SUMMARIES_TO_UPDATE) {
updateSummary(key, false);
}
currentKeepCacheTime = Preferences.get().getKeepCacheTime();
initPrivilegedInstallerPreference();
initUpdatePrivilegedExtensionPreference();
// this pref's default is dynamically set based on whether Orbot is installed
boolean useTor = Preferences.get().isTorEnabled();
useTorCheckPref.setDefaultValue(useTor);
useTorCheckPref.setChecked(useTor);
useTorCheckPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object enabled) {
if ((Boolean) enabled) {
final Activity activity = getActivity();
enableProxyCheckPref.setEnabled(false);
if (OrbotHelper.isOrbotInstalled(activity)) {
NetCipher.useTor();
} else {
Intent intent = OrbotHelper.getOrbotInstallIntent(activity);
activity.startActivityForResult(intent, REQUEST_INSTALL_ORBOT);
}
} else {
enableProxyCheckPref.setEnabled(true);
NetCipher.clearProxy();
}
return true;
}
});
if (PrivilegedInstaller.isDefault(getContext())) {
updateAutoDownloadPref.setTitle(R.string.update_auto_install);
updateAutoDownloadPref.setSummary(R.string.update_auto_install_summary);
}
}
@Override
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
Preferences.get().configureProxy();
}
@Override
public void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String key) {
updateSummary(key, true);
}
}