import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.ViewModelProvider;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import net.ktnx.mobileledger.BuildConfig;
import net.ktnx.mobileledger.R;
import net.ktnx.mobileledger.async.SendTransactionTask;
-import net.ktnx.mobileledger.model.Currency;
import net.ktnx.mobileledger.model.Data;
import net.ktnx.mobileledger.model.MobileLedgerProfile;
import net.ktnx.mobileledger.ui.CurrencySelectorFragment;
import net.ktnx.mobileledger.ui.HueRingDialog;
-import net.ktnx.mobileledger.ui.OnCurrencySelectedListener;
import net.ktnx.mobileledger.ui.activity.ProfileDetailActivity;
import net.ktnx.mobileledger.utils.Colors;
import net.ktnx.mobileledger.utils.Misc;
import java.util.ArrayList;
import java.util.Objects;
+import static net.ktnx.mobileledger.utils.Colors.profileThemeId;
import static net.ktnx.mobileledger.utils.Logger.debug;
/**
* a {@link ProfileDetailActivity}
* on handsets.
*/
-public class ProfileDetailFragment extends Fragment
- implements HueRingDialog.HueSelectedListener, OnCurrencySelectedListener {
+public class ProfileDetailFragment extends Fragment {
/**
* The fragment argument representing the item ID that this fragment
* represents.
public static final String ARG_ITEM_ID = "item_id";
public static final String ARG_HUE = "hue";
@NonNls
- private static final String HTTPS_URL_START = "https://";
/**
* The content this fragment is presenting.
- */
- private MobileLedgerProfile mProfile;
+ */ private MobileLedgerProfile mProfile;
private TextView url;
- private Switch postingPermitted;
- private Switch showCommodityByDefault;
private TextView defaultCommodity;
+ private View defaultCommodityLayout;
private boolean defaultCommoditySet;
private TextInputLayout urlLayout;
private LinearLayout authParams;
private View huePickerView;
private View insecureWarningText;
private TextView futureDatesText;
- private MobileLedgerProfile.FutureDates futureDates;
private View futureDatesLayout;
private TextView apiVersionText;
- private SendTransactionTask.API apiVersion;
-
+ private boolean syncingModelFromUI = false;
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
if (mProfile.equals(Data.profile.getValue()))
Data.profile.setValue(newProfile);
}
+ private void hookTextChangeSyncRoutine(TextView view, TextChangeSyncProc syncRoutine) {
+ view.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {}
+ @Override
+ public void afterTextChanged(Editable s) { syncRoutine.onTextChanged(s.toString());}
+ });
+ }
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
}
+ final LifecycleOwner viewLifecycleOwner = getViewLifecycleOwner();
+ final ProfileDetailModel model = getModel();
+
+ model.observeDefaultCommodity(viewLifecycleOwner, c -> {
+ if (c != null)
+ setDefaultCommodity(c.getName());
+ else
+ resetDefaultCommodity();
+ });
+
FloatingActionButton fab = context.findViewById(R.id.fab);
fab.setOnClickListener(v -> onSaveFabClicked());
+
profileName = context.findViewById(R.id.profile_name);
+ hookTextChangeSyncRoutine(profileName, model::setProfileName);
+ model.observeProfileName(viewLifecycleOwner, pn -> {
+ if (!Misc.equalStrings(pn, profileName.getText()))
+ profileName.setText(pn);
+ });
+
profileNameLayout = context.findViewById(R.id.profile_name_layout);
+
url = context.findViewById(R.id.url);
+ hookTextChangeSyncRoutine(url, model::setUrl);
+ model.observeUrl(viewLifecycleOwner, u -> {
+ if (!Misc.equalStrings(u, url.getText()))
+ url.setText(u);
+ });
+
urlLayout = context.findViewById(R.id.url_layout);
- postingPermitted = context.findViewById(R.id.profile_permit_posting);
- showCommodityByDefault = context.findViewById(R.id.profile_show_commodity);
+
+ defaultCommodityLayout = context.findViewById(R.id.default_commodity_layout);
+ defaultCommodityLayout.setOnClickListener(v -> {
+ CurrencySelectorFragment cpf = CurrencySelectorFragment.newInstance(
+ CurrencySelectorFragment.DEFAULT_COLUMN_COUNT, false);
+ cpf.setOnCurrencySelectedListener(model::setDefaultCommodity);
+ final AppCompatActivity activity = (AppCompatActivity) v.getContext();
+ cpf.show(activity.getSupportFragmentManager(), "currency-selector");
+ });
+
+ Switch showCommodityByDefault = context.findViewById(R.id.profile_show_commodity);
+ showCommodityByDefault.setOnCheckedChangeListener(
+ (buttonView, isChecked) -> model.setShowCommodityByDefault(isChecked));
+ model.observeShowCommodityByDefault(viewLifecycleOwner, showCommodityByDefault::setChecked);
+
+ Switch postingPermitted = context.findViewById(R.id.profile_permit_posting);
+ model.observePostingPermitted(viewLifecycleOwner, isChecked -> {
+ postingPermitted.setChecked(isChecked);
+ defaultCommodityLayout.setVisibility(isChecked ? View.VISIBLE : View.GONE);
+ showCommodityByDefault.setVisibility(isChecked ? View.VISIBLE : View.GONE);
+ preferredAccountsFilterLayout.setVisibility(isChecked ? View.VISIBLE : View.GONE);
+ futureDatesLayout.setVisibility(isChecked ? View.VISIBLE : View.GONE);
+ });
+ postingPermitted.setOnCheckedChangeListener(
+ ((buttonView, isChecked) -> model.setPostingPermitted(isChecked)));
+
defaultCommodity = context.findViewById(R.id.default_commodity_text);
+
futureDatesLayout = context.findViewById(R.id.future_dates_layout);
futureDatesText = context.findViewById(R.id.future_dates_text);
context.findViewById(R.id.future_dates_layout)
PopupMenu menu = new PopupMenu(context, v);
menu.inflate(R.menu.future_dates);
menu.setOnMenuItemClickListener(item -> {
- switch (item.getItemId()) {
- case R.id.menu_future_dates_7:
- futureDates = MobileLedgerProfile.FutureDates.OneWeek;
- break;
- case R.id.menu_future_dates_14:
- futureDates = MobileLedgerProfile.FutureDates.TwoWeeks;
- break;
- case R.id.menu_future_dates_30:
- futureDates = MobileLedgerProfile.FutureDates.OneMonth;
- break;
- case R.id.menu_future_dates_60:
- futureDates = MobileLedgerProfile.FutureDates.TwoMonths;
- break;
- case R.id.menu_future_dates_90:
- futureDates = MobileLedgerProfile.FutureDates.ThreeMonths;
- break;
- case R.id.menu_future_dates_180:
- futureDates = MobileLedgerProfile.FutureDates.SixMonths;
- break;
- case R.id.menu_future_dates_365:
- futureDates = MobileLedgerProfile.FutureDates.OneYear;
- break;
- case R.id.menu_future_dates_all:
- futureDates = MobileLedgerProfile.FutureDates.All;
- break;
- default:
- futureDates = MobileLedgerProfile.FutureDates.None;
- }
- futureDatesText.setText(futureDates.getText(getResources()));
+ model.setFutureDates(futureDatesSettingFromMenuItemId(item.getItemId()));
return true;
});
menu.show();
});
+ model.observeFutureDates(viewLifecycleOwner,
+ v -> futureDatesText.setText(v.getText(getResources())));
+
apiVersionText = context.findViewById(R.id.api_version_text);
+ model.observeApiVersion(viewLifecycleOwner, apiVer -> {
+ apiVersionText.setText(apiVer.getDescription(getResources()));
+ });
context.findViewById(R.id.api_version_layout)
.setOnClickListener(v -> {
MenuInflater mi = new MenuInflater(context);
PopupMenu menu = new PopupMenu(context, v);
menu.inflate(R.menu.api_version);
menu.setOnMenuItemClickListener(item -> {
+ SendTransactionTask.API apiVer;
switch (item.getItemId()) {
case R.id.api_version_menu_html:
- apiVersion = SendTransactionTask.API.html;
+ apiVer = SendTransactionTask.API.html;
break;
case R.id.api_version_menu_post_1_14:
- apiVersion = SendTransactionTask.API.post_1_14;
+ apiVer = SendTransactionTask.API.post_1_14;
break;
case R.id.api_version_menu_pre_1_15:
- apiVersion = SendTransactionTask.API.pre_1_15;
+ apiVer = SendTransactionTask.API.pre_1_15;
break;
case R.id.api_version_menu_auto:
default:
- apiVersion = SendTransactionTask.API.auto;
+ apiVer = SendTransactionTask.API.auto;
}
- apiVersionText.setText(apiVersion.getDescription(getResources()));
+ model.setApiVersion(apiVer);
+ apiVersionText.setText(apiVer.getDescription(getResources()));
return true;
});
menu.show();
});
authParams = context.findViewById(R.id.auth_params);
+
useAuthentication = context.findViewById(R.id.enable_http_auth);
+ useAuthentication.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ model.setUseAuthentication(isChecked);
+ authParams.setVisibility(isChecked ? View.VISIBLE : View.GONE);
+ if (isChecked)
+ userName.requestFocus();
+ checkInsecureSchemeWithAuth();
+ });
+ model.observeUseAuthentication(viewLifecycleOwner, useAuthentication::setChecked);
+
userName = context.findViewById(R.id.auth_user_name);
+ model.observeUserName(viewLifecycleOwner, text -> {
+ if (!Misc.equalStrings(text, userName.getText()))
+ userName.setText(text);
+ });
+ hookTextChangeSyncRoutine(userName, model::setAuthUserName);
userNameLayout = context.findViewById(R.id.auth_user_name_layout);
+
password = context.findViewById(R.id.password);
+ model.observePassword(viewLifecycleOwner, text -> {
+ if (!Misc.equalStrings(text, password.getText()))
+ password.setText(text);
+ });
+ hookTextChangeSyncRoutine(password, model::setAuthPassword);
passwordLayout = context.findViewById(R.id.password_layout);
+
huePickerView = context.findViewById(R.id.btn_pick_ring_color);
+ model.observeThemeId(viewLifecycleOwner, themeId -> {
+ final int hue = (themeId == -1) ? Colors.DEFAULT_HUE_DEG : themeId;
+ final int profileColor = Colors.getPrimaryColorForHue(hue);
+ huePickerView.setBackgroundColor(profileColor);
+ huePickerView.setTag(hue);
+ });
+
preferredAccountsFilter = context.findViewById(R.id.preferred_accounts_filter_filter);
+ model.observePreferredAccountsFilter(viewLifecycleOwner, text -> {
+ if (!Misc.equalStrings(text, preferredAccountsFilter.getText()))
+ preferredAccountsFilter.setText(text);
+ });
+ hookTextChangeSyncRoutine(preferredAccountsFilter, model::setPreferredAccountsFilter);
preferredAccountsFilterLayout =
context.findViewById(R.id.preferred_accounts_accounts_filter_layout);
- insecureWarningText = context.findViewById(R.id.insecure_scheme_text);
-
- useAuthentication.setOnCheckedChangeListener((buttonView, isChecked) -> {
- debug("profiles", isChecked ? "auth enabled " : "auth disabled");
- authParams.setVisibility(isChecked ? View.VISIBLE : View.GONE);
- if (isChecked)
- userName.requestFocus();
- checkInsecureSchemeWithAuth();
- });
- postingPermitted.setOnCheckedChangeListener(((buttonView, isChecked) -> {
- preferredAccountsFilterLayout.setVisibility(isChecked ? View.VISIBLE : View.GONE);
- futureDatesLayout.setVisibility(isChecked ? View.VISIBLE : View.GONE);
- }));
+ insecureWarningText = context.findViewById(R.id.insecure_scheme_text);
hookClearErrorOnFocusListener(profileName, profileNameLayout);
hookClearErrorOnFocusListener(url, urlLayout);
hookClearErrorOnFocusListener(userName, userNameLayout);
hookClearErrorOnFocusListener(password, passwordLayout);
- final int profileThemeId;
- if (mProfile != null) {
- profileName.setText(mProfile.getName());
- postingPermitted.setChecked(mProfile.isPostingPermitted());
- showCommodityByDefault.setChecked(mProfile.getShowCommodityByDefault());
- {
- String comm = mProfile.getDefaultCommodity();
- if (Misc.isEmptyOrNull(comm))
- resetDefaultCommodity();
- else
- setDefaultCommodity(comm);
- }
- futureDates = mProfile.getFutureDates();
- futureDatesText.setText(futureDates.getText(getResources()));
- apiVersion = mProfile.getApiVersion();
- apiVersionText.setText(apiVersion.getDescription(getResources()));
- url.setText(mProfile.getUrl());
- useAuthentication.setChecked(mProfile.isAuthEnabled());
- authParams.setVisibility(mProfile.isAuthEnabled() ? View.VISIBLE : View.GONE);
- userName.setText(mProfile.isAuthEnabled() ? mProfile.getAuthUserName() : "");
- password.setText(mProfile.isAuthEnabled() ? mProfile.getAuthPassword() : "");
- preferredAccountsFilter.setText(mProfile.getPreferredAccountsFilter());
- profileThemeId = mProfile.getThemeHue();
+ if (savedInstanceState == null) {
+ model.setValuesFromProfile(mProfile, getArguments().getInt(ARG_HUE, -1));
}
- else {
- profileName.setText("");
- url.setText(HTTPS_URL_START);
- postingPermitted.setChecked(true);
- showCommodityByDefault.setChecked(false);
- resetDefaultCommodity();
- futureDates = MobileLedgerProfile.FutureDates.None;
- futureDatesText.setText(futureDates.getText(getResources()));
- apiVersion = SendTransactionTask.API.auto;
- apiVersionText.setText(apiVersion.getDescription(getResources()));
- useAuthentication.setChecked(false);
- authParams.setVisibility(View.GONE);
- userName.setText("");
- password.setText("");
- preferredAccountsFilter.setText(null);
- profileThemeId = getArguments().getInt(ARG_HUE, -1);
- }
-
checkInsecureSchemeWithAuth();
url.addTextChangedListener(new TextWatcher() {
@Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-
- }
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
-
- }
+ public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
checkInsecureSchemeWithAuth();
}
});
- final int hue = (profileThemeId == -1) ? Colors.DEFAULT_HUE_DEG : profileThemeId;
- final int profileColor = Colors.getPrimaryColorForHue(hue);
-
- huePickerView.setBackgroundColor(profileColor);
- huePickerView.setTag(profileThemeId);
huePickerView.setOnClickListener(v -> {
HueRingDialog d = new HueRingDialog(
Objects.requireNonNull(ProfileDetailFragment.this.getContext()), profileThemeId,
(Integer) v.getTag());
d.show();
- d.setColorSelectedListener(this);
+ d.setColorSelectedListener(model::setThemeId);
});
- context.findViewById(R.id.default_commodity_layout).setOnClickListener(v -> {
- CurrencySelectorFragment cpf = CurrencySelectorFragment.newInstance(CurrencySelectorFragment.DEFAULT_COLUMN_COUNT, false);
- cpf.setOnCurrencySelectedListener(this);
- final AppCompatActivity activity = (AppCompatActivity) v.getContext();
- cpf.show(activity.getSupportFragmentManager(), "currency-selector");
- });
profileName.requestFocus();
}
+ private MobileLedgerProfile.FutureDates futureDatesSettingFromMenuItemId(int itemId) {
+ switch (itemId) {
+ case R.id.menu_future_dates_7:
+ return MobileLedgerProfile.FutureDates.OneWeek;
+ case R.id.menu_future_dates_14:
+ return MobileLedgerProfile.FutureDates.TwoWeeks;
+ case R.id.menu_future_dates_30:
+ return MobileLedgerProfile.FutureDates.OneMonth;
+ case R.id.menu_future_dates_60:
+ return MobileLedgerProfile.FutureDates.TwoMonths;
+ case R.id.menu_future_dates_90:
+ return MobileLedgerProfile.FutureDates.ThreeMonths;
+ case R.id.menu_future_dates_180:
+ return MobileLedgerProfile.FutureDates.SixMonths;
+ case R.id.menu_future_dates_365:
+ return MobileLedgerProfile.FutureDates.OneYear;
+ case R.id.menu_future_dates_all:
+ return MobileLedgerProfile.FutureDates.All;
+ default:
+ return MobileLedgerProfile.FutureDates.None;
+ }
+ }
+ @NotNull
+ private ProfileDetailModel getModel() {
+ return new ViewModelProvider(this).get(ProfileDetailModel.class);
+ }
private void onSaveFabClicked() {
if (!checkValidity())
return;
+ ProfileDetailModel model = getModel();
+
if (mProfile != null) {
- updateProfileFromUI();
+ model.updateProfile(mProfile);
// debug("profiles", String.format("Selected item is %d", mProfile.getThemeHue()));
mProfile.storeInDB();
debug("profiles", "profile stored in DB");
}
else {
mProfile = new MobileLedgerProfile();
- updateProfileFromUI();
+ model.updateProfile(mProfile);
mProfile.storeInDB();
final ArrayList<MobileLedgerProfile> profiles = Data.profiles.getValue();
if (profiles == null)
if (activity != null)
activity.finish();
}
- private void updateProfileFromUI() {
- mProfile.setName(profileName.getText());
- mProfile.setUrl(url.getText());
- mProfile.setPostingPermitted(postingPermitted.isChecked());
- mProfile.setDefaultCommodity(defaultCommoditySet ? defaultCommodity.getText() : null);
- mProfile.setShowCommodityByDefault(showCommodityByDefault.isChecked());
- mProfile.setPreferredAccountsFilter(preferredAccountsFilter.getText());
- mProfile.setAuthEnabled(useAuthentication.isChecked());
- mProfile.setAuthUserName(userName.getText());
- mProfile.setAuthPassword(password.getText());
- mProfile.setThemeHue(huePickerView.getTag());
- mProfile.setFutureDates(futureDates);
- mProfile.setApiVersion(apiVersion);
- }
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
private boolean checkUrlValidity() {
boolean valid = true;
- String val = String.valueOf(url.getText())
- .trim();
+ ProfileDetailModel model = getModel();
+
+ String val = model.getUrl()
+ .trim();
if (val.isEmpty()) {
valid = false;
urlLayout.setError(getResources().getText(R.string.err_profile_url_empty));
private void checkInsecureSchemeWithAuth() {
boolean showWarning = false;
- if (useAuthentication.isChecked()) {
- String urlText = url.getText()
- .toString();
+ final ProfileDetailModel model = getModel();
+
+ if (model.getUseAuthentication()) {
+ String urlText = model.getUrl();
if (urlText.startsWith("http") && !urlText.startsWith("https"))
showWarning = true;
}
}
});
}
+ private void syncModelFromUI() {
+ if (syncingModelFromUI)
+ return;
+
+ syncingModelFromUI = true;
+
+ try {
+ ProfileDetailModel model = getModel();
+
+ model.setProfileName(profileName.getText());
+ model.setUrl(url.getText());
+ model.setPreferredAccountsFilter(preferredAccountsFilter.getText());
+ model.setAuthUserName(userName.getText());
+ model.setAuthPassword(password.getText());
+ }
+ finally {
+ syncingModelFromUI = false;
+ }
+ }
private boolean checkValidity() {
boolean valid = true;
return valid;
}
- @Override
- public void onHueSelected(int hue) {
- huePickerView.setBackgroundColor(Colors.getPrimaryColorForHue(hue));
- huePickerView.setTag(hue);
- }
- @Override
- public void onCurrencySelected(Currency item) {
- if (item == null)
- resetDefaultCommodity();
- else
- setDefaultCommodity(item.getName());
- }
private void resetDefaultCommodity() {
defaultCommoditySet = false;
defaultCommodity.setText(R.string.btn_no_currency);
defaultCommodity.setText(name);
defaultCommodity.setTypeface(defaultCommodity.getTypeface(), Typeface.BOLD);
}
+ interface TextChangeSyncProc {
+ void onTextChanged(String text);
+ }
}
--- /dev/null
+/*
+ * Copyright © 2020 Damyan Ivanov.
+ * This file is part of MoLe.
+ * MoLe is free software: you can distribute it and/or modify it
+ * under the term of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your opinion), any later version.
+ *
+ * MoLe is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License terms for details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MoLe. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package net.ktnx.mobileledger.ui.profiles;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.Observer;
+import androidx.lifecycle.ViewModel;
+
+import net.ktnx.mobileledger.async.SendTransactionTask;
+import net.ktnx.mobileledger.model.Currency;
+import net.ktnx.mobileledger.model.MobileLedgerProfile;
+import net.ktnx.mobileledger.utils.Misc;
+
+public class ProfileDetailModel extends ViewModel {
+ private static final String HTTPS_URL_START = "https://";
+ private final MutableLiveData<String> profileName = new MutableLiveData<>();
+ private final MutableLiveData<Boolean> postingPermitted = new MutableLiveData<>(true);
+ private final MutableLiveData<Currency> defaultCommodity = new MutableLiveData<>(null);
+ private final MutableLiveData<MobileLedgerProfile.FutureDates> futureDates =
+ new MutableLiveData<>(MobileLedgerProfile.FutureDates.None);
+ private final MutableLiveData<Boolean> showCommodityByDefault = new MutableLiveData<>(false);
+ private final MutableLiveData<Boolean> useAuthentication = new MutableLiveData<>(false);
+ private final MutableLiveData<SendTransactionTask.API> apiVersion =
+ new MutableLiveData<>(SendTransactionTask.API.auto);
+ private final MutableLiveData<String> url = new MutableLiveData<>(null);
+ private final MutableLiveData<String> authUserName = new MutableLiveData<>(null);
+ private final MutableLiveData<String> authPassword = new MutableLiveData<>(null);
+ private final MutableLiveData<String> preferredAccountsFilter = new MutableLiveData<>(null);
+ private final MutableLiveData<Integer> themeId = new MutableLiveData<>(-1);
+ public ProfileDetailModel() {
+ }
+ String getProfileName() {
+ return profileName.getValue();
+ }
+ void setProfileName(String newValue) {
+ if (!Misc.nullIsEmpty(newValue)
+ .equals(Misc.nullIsEmpty(profileName.getValue())))
+ profileName.setValue(newValue);
+ }
+ void setProfileName(CharSequence newValue) {
+ setProfileName(String.valueOf(newValue));
+ }
+ void observeProfileName(LifecycleOwner lfo, Observer<String> o) {
+ profileName.observe(lfo, o);
+ }
+ Boolean getPostingPermitted() {
+ return postingPermitted.getValue();
+ }
+ void setPostingPermitted(boolean newValue) {
+ if (newValue != postingPermitted.getValue())
+ postingPermitted.setValue(newValue);
+ }
+ void observePostingPermitted(LifecycleOwner lfo, Observer<Boolean> o) {
+ postingPermitted.observe(lfo, o);
+ }
+ MobileLedgerProfile.FutureDates getFutureDates() {
+ return futureDates.getValue();
+ }
+ void setFutureDates(MobileLedgerProfile.FutureDates newValue) {
+ if (newValue != futureDates.getValue())
+ futureDates.setValue(newValue);
+ }
+ void observeFutureDates(LifecycleOwner lfo, Observer<MobileLedgerProfile.FutureDates> o) {
+ futureDates.observe(lfo, o);
+ }
+ Currency getDefaultCommodity() {
+ return defaultCommodity.getValue();
+ }
+ void setDefaultCommodity(Currency newValue) {
+ if (newValue != defaultCommodity.getValue())
+ defaultCommodity.setValue(newValue);
+ }
+ void observeDefaultCommodity(LifecycleOwner lfo, Observer<Currency> o) {
+ defaultCommodity.observe(lfo, o);
+ }
+ Boolean getShowCommodityByDefault() {
+ return showCommodityByDefault.getValue();
+ }
+ void setShowCommodityByDefault(boolean newValue) {
+ if (newValue != showCommodityByDefault.getValue())
+ showCommodityByDefault.setValue(newValue);
+ }
+ void observeShowCommodityByDefault(LifecycleOwner lfo, Observer<Boolean> o) {
+ showCommodityByDefault.observe(lfo, o);
+ }
+ Boolean getUseAuthentication() {
+ return useAuthentication.getValue();
+ }
+ void setUseAuthentication(boolean newValue) {
+ if (newValue != useAuthentication.getValue())
+ useAuthentication.setValue(newValue);
+ }
+ void observeUseAuthentication(LifecycleOwner lfo, Observer<Boolean> o) {
+ useAuthentication.observe(lfo, o);
+ }
+ SendTransactionTask.API getApiVersion() {
+ return apiVersion.getValue();
+ }
+ void setApiVersion(SendTransactionTask.API newValue) {
+ if (newValue != apiVersion.getValue())
+ apiVersion.setValue(newValue);
+ }
+ void observeApiVersion(LifecycleOwner lfo, Observer<SendTransactionTask.API> o) {
+ apiVersion.observe(lfo, o);
+ }
+ String getUrl() {
+ return url.getValue();
+ }
+ void setUrl(String newValue) {
+ if (!Misc.nullIsEmpty(newValue)
+ .equals(Misc.nullIsEmpty(url.getValue())))
+ url.setValue(newValue);
+ }
+ void setUrl(CharSequence newValue) {
+ setUrl(String.valueOf(newValue));
+ }
+ void observeUrl(LifecycleOwner lfo, Observer<String> o) {
+ url.observe(lfo, o);
+ }
+ String getAuthUserName() {
+ return authUserName.getValue();
+ }
+ void setAuthUserName(String newValue) {
+ if (!Misc.nullIsEmpty(newValue)
+ .equals(Misc.nullIsEmpty(authUserName.getValue())))
+ authUserName.setValue(newValue);
+ }
+ void setAuthUserName(CharSequence newValue) {
+ setAuthUserName(String.valueOf(newValue));
+ }
+ void observeUserName(LifecycleOwner lfo, Observer<String> o) {
+ authUserName.observe(lfo, o);
+ }
+ String getAuthPassword() {
+ return authPassword.getValue();
+ }
+ void setAuthPassword(String newValue) {
+ if (!Misc.nullIsEmpty(newValue)
+ .equals(Misc.nullIsEmpty(authPassword.getValue())))
+ authPassword.setValue(newValue);
+ }
+ void setAuthPassword(CharSequence newValue) {
+ setAuthPassword(String.valueOf(newValue));
+ }
+ void observePassword(LifecycleOwner lfo, Observer<String> o) {
+ authPassword.observe(lfo, o);
+ }
+ String getPreferredAccountsFilter() {
+ return preferredAccountsFilter.getValue();
+ }
+ void setPreferredAccountsFilter(String newValue) {
+ if (!Misc.nullIsEmpty(newValue)
+ .equals(Misc.nullIsEmpty(preferredAccountsFilter.getValue())))
+ preferredAccountsFilter.setValue(newValue);
+ }
+ void setPreferredAccountsFilter(CharSequence newValue) {
+ setPreferredAccountsFilter(String.valueOf(newValue));
+ }
+ void observePreferredAccountsFilter(LifecycleOwner lfo, Observer<String> o) {
+ preferredAccountsFilter.observe(lfo, o);
+ }
+ int getThemeId() {
+ return themeId.getValue();
+ }
+ void setThemeId(int newValue) {
+ themeId.setValue(newValue);
+ }
+ void observeThemeId(LifecycleOwner lfo, Observer<Integer> o) {
+ themeId.observe(lfo, o);
+ }
+ void setValuesFromProfile(MobileLedgerProfile mProfile, int newProfileHue) {
+ final int profileThemeId;
+ if (mProfile != null) {
+ profileName.setValue(mProfile.getName());
+ postingPermitted.setValue(mProfile.isPostingPermitted());
+ showCommodityByDefault.setValue(mProfile.getShowCommodityByDefault());
+ {
+ String comm = mProfile.getDefaultCommodity();
+ if (Misc.isEmptyOrNull(comm))
+ setDefaultCommodity(null);
+ else
+ setDefaultCommodity(new Currency(-1, comm));
+ }
+ futureDates.setValue(mProfile.getFutureDates());
+ apiVersion.setValue(mProfile.getApiVersion());
+ url.setValue(mProfile.getUrl());
+ useAuthentication.setValue(mProfile.isAuthEnabled());
+ authUserName.setValue(mProfile.isAuthEnabled() ? mProfile.getAuthUserName() : "");
+ authPassword.setValue(mProfile.isAuthEnabled() ? mProfile.getAuthPassword() : "");
+ preferredAccountsFilter.setValue(mProfile.getPreferredAccountsFilter());
+ themeId.setValue(mProfile.getThemeHue());
+ }
+ else {
+ profileName.setValue(null);
+ url.setValue(HTTPS_URL_START);
+ postingPermitted.setValue(true);
+ showCommodityByDefault.setValue(false);
+ setFutureDates(MobileLedgerProfile.FutureDates.None);
+ setApiVersion(SendTransactionTask.API.auto);
+ useAuthentication.setValue(false);
+ authUserName.setValue("");
+ authPassword.setValue("");
+ preferredAccountsFilter.setValue(null);
+ themeId.setValue(newProfileHue);
+ }
+
+
+ }
+ void updateProfile(MobileLedgerProfile mProfile) {
+ mProfile.setName(profileName.getValue());
+ mProfile.setUrl(url.getValue());
+ mProfile.setPostingPermitted(postingPermitted.getValue());
+ Currency c = defaultCommodity.getValue();
+ mProfile.setDefaultCommodity((c == null) ? null : c.getName());
+ mProfile.setShowCommodityByDefault(showCommodityByDefault.getValue());
+ mProfile.setPreferredAccountsFilter(preferredAccountsFilter.getValue());
+ mProfile.setAuthEnabled(useAuthentication.getValue());
+ mProfile.setAuthUserName(authUserName.getValue());
+ mProfile.setAuthPassword(authPassword.getValue());
+ mProfile.setThemeHue(themeId.getValue());
+ mProfile.setFutureDates(futureDates.getValue());
+ mProfile.setApiVersion(apiVersion.getValue());
+ }
+}