package com.greenaddress.greenbits.ui.preferences;
import android.app.Activity;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.greenaddress.greenbits.GaService;
import com.greenaddress.greenbits.ui.R;
import com.greenaddress.greenbits.ui.UI;
public class SPVPreferenceFragment extends GAPreferenceFragment
implements Preference.OnPreferenceChangeListener,
Preference.OnPreferenceClickListener {
private EditTextPreference mTrustedPeer;
private Preference mResetSPV;
private CheckBoxPreference mSPVEnabled;
private CheckBoxPreference mSPVSyncOnMobile;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference_spv);
setHasOptionsMenu(true);
mTrustedPeer = find("trusted_peer");
mResetSPV = find("reset_spv");
mSPVEnabled = find("spvEnabled");
mSPVSyncOnMobile = find("spvSyncMobile");
if (mService.isWatchOnly()) {
// Do not allow editing of SPV prefs from watch only logins
mTrustedPeer.setEnabled(false);
mResetSPV.setEnabled(false);
mSPVEnabled.setEnabled(false);
mSPVSyncOnMobile.setEnabled(false);
UI.toast(getActivity(), R.string.spvSettingsWatchOnly, Toast.LENGTH_LONG);
} else {
// Initialise values and bindings for preference changes
bindPreferenceSummaryToValue(mTrustedPeer);
mSPVEnabled.setChecked(mService.isSPVEnabled());
mSPVSyncOnMobile.setChecked(mService.isSPVSyncOnMobileEnabled());
mTrustedPeer.setEnabled(mService.isSPVEnabled());
final boolean setTextValue = true;
setTrustedPeersPreference(mService.getSPVTrustedPeers(), setTextValue);
mResetSPV.setOnPreferenceClickListener(this);
mSPVEnabled.setOnPreferenceChangeListener(this);
mSPVSyncOnMobile.setOnPreferenceChangeListener(this);
mTrustedPeer.setOnPreferenceChangeListener(this);
}
getActivity().setResult(Activity.RESULT_OK, null);
}
private void setTrustedPeersPreference(final String peers, final boolean setTextValue) {
if (peers.isEmpty()) {
mTrustedPeer.setSummary(R.string.trustedspvExample);
return;
}
if (setTextValue)
mTrustedPeer.setText(peers);
mTrustedPeer.setSummary(peers);
}
private void setTrustedPeers(final String peers) {
final boolean setTextValue = false;
setTrustedPeersPreference(peers, setTextValue);
mService.setSPVTrustedPeersAsync(peers);
}
private boolean onSPVEnabledChanged(final Boolean newValue) {
mTrustedPeer.setEnabled(newValue);
mService.setSPVEnabledAsync(newValue);
return true;
}
private boolean onSPVSyncOnMobileChanged(final Boolean newValue) {
mService.setSPVSyncOnMobileEnabledAsync(newValue);
return true;
}
private boolean onTrustedPeerChange(final String newValue) {
final String peers = newValue.trim().replaceAll("\\s","");
if (mService.getSPVTrustedPeers().equals(peers))
return false;
if (peers.isEmpty()) {
setTrustedPeers(peers);
return true;
}
for (final String peer: peers.split(","))
if (GaService.isBadAddress(peer)) {
UI.popup(getActivity(), R.string.enterValidAddressTitle, android.R.string.ok)
.content(R.string.enterValidAddressText).build().show();
return false;
}
if (peers.toLowerCase().contains(".onion")) {
// Tor address
if (!mService.isProxyEnabled()) {
UI.popup(getActivity(), R.string.enterValidAddressTitleTorDisabled, android.R.string.ok)
.content(R.string.enterValidAddressTextTorDisabled).build().show();
return false;
}
setTrustedPeers(peers);
return true;
}
// Force the user to confirm that they want to use a non-Tor host
UI.popup(getActivity(), R.string.changingWarnOnionTitle)
.content(R.string.changingWarnOnionText)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(final MaterialDialog dlg, final DialogAction which) {
setTrustedPeers(peers);
}
}).build().show();
return true;
}
@Override
public boolean onPreferenceChange(final Preference preference, final Object newValue) {
if (preference == mSPVEnabled)
return onSPVEnabledChanged((Boolean) newValue);
if (preference == mSPVSyncOnMobile)
return onSPVSyncOnMobileChanged((Boolean) newValue);
if (preference == mTrustedPeer)
return onTrustedPeerChange((String) newValue);
return false;
}
@Override
public boolean onPreferenceClick(final Preference preference) {
if (preference == mResetSPV)
mService.resetSPVAsync();
return false;
}
}