X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Fprofiles%2FProfileDetailFragment.java;h=e43e20e35a4d7585fa6c84d37c6173ddf4e13c10;hp=1efdb965408c3bd278883767000f1a4a517ac381;hb=HEAD;hpb=4db312e69578236dbfca979b840222b751da2f8c diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailFragment.java b/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailFragment.java index 1efdb965..99934543 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailFragment.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailFragment.java @@ -1,5 +1,5 @@ /* - * Copyright © 2020 Damyan Ivanov. + * Copyright © 2021 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 @@ -19,6 +19,7 @@ package net.ktnx.mobileledger.ui.profiles; import android.app.Activity; import android.app.AlertDialog; +import android.app.backup.BackupManager; import android.graphics.Typeface; import android.os.Bundle; import android.text.Editable; @@ -40,19 +41,21 @@ 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 com.google.android.material.textfield.TextInputLayout; import net.ktnx.mobileledger.BuildConfig; import net.ktnx.mobileledger.R; +import net.ktnx.mobileledger.dao.BaseDAO; +import net.ktnx.mobileledger.dao.ProfileDAO; import net.ktnx.mobileledger.databinding.ProfileDetailBinding; +import net.ktnx.mobileledger.db.DB; +import net.ktnx.mobileledger.db.Profile; import net.ktnx.mobileledger.json.API; import net.ktnx.mobileledger.model.Data; -import net.ktnx.mobileledger.model.MobileLedgerProfile; +import net.ktnx.mobileledger.model.FutureDates; import net.ktnx.mobileledger.ui.CurrencySelectorFragment; import net.ktnx.mobileledger.ui.HueRingDialog; -import net.ktnx.mobileledger.ui.activity.ProfileDetailActivity; import net.ktnx.mobileledger.utils.Colors; import net.ktnx.mobileledger.utils.Misc; @@ -61,9 +64,8 @@ import org.jetbrains.annotations.NotNull; import java.net.MalformedURLException; import java.net.URL; -import java.util.ArrayList; +import java.util.List; import java.util.Objects; -import java.util.UUID; import static net.ktnx.mobileledger.utils.Logger.debug; @@ -81,7 +83,6 @@ public class ProfileDetailFragment extends Fragment { public static final String ARG_HUE = "hue"; @NonNls - private MobileLedgerProfile mProfile; private boolean defaultCommoditySet; private boolean syncingModelFromUI = false; private ProfileDetailBinding binding; @@ -99,31 +100,39 @@ public class ProfileDetailFragment extends Fragment { inflater.inflate(R.menu.profile_details, menu); final MenuItem menuDeleteProfile = menu.findItem(R.id.menuDelete); menuDeleteProfile.setOnMenuItemClickListener(item -> onDeleteProfile()); - final ArrayList profiles = Data.profiles.getValue(); + final List profiles = Data.profiles.getValue(); - if (BuildConfig.DEBUG) { - final MenuItem menuWipeProfileData = menu.findItem(R.id.menuWipeData); + final MenuItem menuWipeProfileData = menu.findItem(R.id.menuWipeData); + if (BuildConfig.DEBUG) menuWipeProfileData.setOnMenuItemClickListener(ignored -> onWipeDataMenuClicked()); - menuWipeProfileData.setVisible(mProfile != null); - } + + getModel().getProfileId() + .observe(getViewLifecycleOwner(), id -> { + menuDeleteProfile.setVisible(id > 0); + if (BuildConfig.DEBUG) + menuWipeProfileData.setVisible(id > 0); + }); } private boolean onDeleteProfile() { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(mProfile.getName()); + @NotNull ProfileDetailModel model = getModel(); + builder.setTitle(model.getProfileName()); builder.setMessage(R.string.remove_profile_dialog_message); builder.setPositiveButton(R.string.Remove, (dialog, which) -> { - debug("profiles", String.format("[fragment] removing profile %s", mProfile.getUuid())); - mProfile.removeFromDB(); - ArrayList oldList = Data.profiles.getValue(); - if (oldList == null) - throw new AssertionError(); - ArrayList newList = new ArrayList<>(oldList); - newList.remove(mProfile); - Data.profiles.setValue(newList); - if (mProfile.equals(Data.getProfile())) { - debug("profiles", "[fragment] setting current profile to 0"); - Data.setCurrentProfile(newList.get(0)); - } + final long profileId = Objects.requireNonNull(model.getProfileId() + .getValue()); + debug("profiles", String.format("[fragment] removing profile %s", profileId)); + ProfileDAO dao = DB.get() + .getProfileDAO(); + dao.getById(profileId) + .observe(getViewLifecycleOwner(), profile -> { + if (profile != null) + BaseDAO.runAsync(() -> DB.get() + .runInTransaction(() -> { + dao.deleteSync(profile); + dao.updateOrderSync(dao.getAllOrderedSync()); + })); + }); final FragmentActivity activity = getActivity(); if (activity != null) @@ -134,25 +143,16 @@ public class ProfileDetailFragment extends Fragment { } private boolean onWipeDataMenuClicked() { // this is a development option, so no confirmation - mProfile.wipeAllData(); - if (mProfile.equals(Data.getProfile())) - triggerProfileChange(); + DB.get() + .getProfileDAO() + .getById(Objects.requireNonNull(getModel().getProfileId() + .getValue())) + .observe(getViewLifecycleOwner(), profile -> { + if (profile != null) + profile.wipeAllData(); + }); return true; } - private void triggerProfileChange() { - int index = Data.getProfileIndex(mProfile); - MobileLedgerProfile newProfile = new MobileLedgerProfile(mProfile); - final ArrayList profiles = - Objects.requireNonNull(Data.profiles.getValue()); - profiles.set(index, newProfile); - - ProfilesRecyclerViewAdapter viewAdapter = ProfilesRecyclerViewAdapter.getInstance(); - if (viewAdapter != null) - viewAdapter.notifyItemChanged(index); - - if (mProfile.equals(Data.getProfile())) - Data.setCurrentProfile(newProfile); - } private void hookTextChangeSyncRoutine(TextView view, TextChangeSyncRoutine syncRoutine) { view.addTextChangedListener(new TextWatcher() { @Override @@ -178,35 +178,17 @@ public class ProfileDetailFragment extends Fragment { if (context == null) return; - if ((getArguments() != null) && getArguments().containsKey(ARG_ITEM_ID)) { - int index = getArguments().getInt(ARG_ITEM_ID, -1); - ArrayList profiles = Data.profiles.getValue(); - if ((profiles != null) && (index != -1) && (index < profiles.size())) - mProfile = profiles.get(index); - - Activity activity = this.getActivity(); - if (activity == null) - throw new AssertionError(); - CollapsingToolbarLayout appBarLayout = activity.findViewById(R.id.toolbar_layout); - if (appBarLayout != null) { - if (mProfile != null) - appBarLayout.setTitle(mProfile.getName()); - else - appBarLayout.setTitle(getResources().getString(R.string.new_profile_title)); - } - } - final LifecycleOwner viewLifecycleOwner = getViewLifecycleOwner(); final ProfileDetailModel model = getModel(); model.observeDefaultCommodity(viewLifecycleOwner, c -> { if (c != null) - setDefaultCommodity(c.getName()); + setDefaultCommodity(c); else resetDefaultCommodity(); }); - FloatingActionButton fab = context.findViewById(R.id.fab); + FloatingActionButton fab = context.findViewById(R.id.fabAdd); fab.setOnClickListener(v -> onSaveFabClicked()); hookTextChangeSyncRoutine(binding.profileName, model::setProfileName); @@ -327,11 +309,6 @@ public class ProfileDetailFragment extends Fragment { hookClearErrorOnFocusListener(binding.authUserName, binding.authUserNameLayout); hookClearErrorOnFocusListener(binding.password, binding.passwordLayout); - if (savedInstanceState == null) { - model.setValuesFromProfile(mProfile, getArguments().getInt(ARG_HUE, -1)); - } - checkInsecureSchemeWithAuth(); - binding.url.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @@ -360,22 +337,24 @@ public class ProfileDetailFragment extends Fragment { menu.inflate(R.menu.api_version); menu.setOnMenuItemClickListener(item -> { API apiVer; - switch (item.getItemId()) { - case R.id.api_version_menu_html: - apiVer = API.html; - break; - case R.id.api_version_menu_1_19_1: - apiVer = API.v1_19_1; - break; - case R.id.api_version_menu_1_15: - apiVer = API.v1_15; - break; - case R.id.api_version_menu_1_14: - apiVer = API.v1_14; - break; - case R.id.api_version_menu_auto: - default: - apiVer = API.auto; + int itemId = item.getItemId(); + if (itemId == R.id.api_version_menu_html) { + apiVer = API.html; + } + else if (itemId == R.id.api_version_menu_1_23) { + apiVer = API.v1_23; + } + else if (itemId == R.id.api_version_menu_1_19_1) { + apiVer = API.v1_19_1; + } + else if (itemId == R.id.api_version_menu_1_15) { + apiVer = API.v1_15; + } + else if (itemId == R.id.api_version_menu_1_14) { + apiVer = API.v1_14; + } + else { + apiVer = API.auto; } model.setApiVersion(apiVer); binding.apiVersionText.setText(apiVer.getDescription(getResources())); @@ -383,27 +362,32 @@ public class ProfileDetailFragment extends Fragment { }); menu.show(); } - 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; + private FutureDates futureDatesSettingFromMenuItemId(int itemId) { + if (itemId == R.id.menu_future_dates_7) { + return FutureDates.OneWeek; } + else if (itemId == R.id.menu_future_dates_14) { + return FutureDates.TwoWeeks; + } + else if (itemId == R.id.menu_future_dates_30) { + return FutureDates.OneMonth; + } + else if (itemId == R.id.menu_future_dates_60) { + return FutureDates.TwoMonths; + } + else if (itemId == R.id.menu_future_dates_90) { + return FutureDates.ThreeMonths; + } + else if (itemId == R.id.menu_future_dates_180) { + return FutureDates.SixMonths; + } + else if (itemId == R.id.menu_future_dates_365) { + return FutureDates.OneYear; + } + else if (itemId == R.id.menu_future_dates_all) { + return FutureDates.All; + } + return FutureDates.None; } @NotNull private ProfileDetailModel getModel() { @@ -414,44 +398,22 @@ public class ProfileDetailFragment extends Fragment { return; ProfileDetailModel model = getModel(); - final ArrayList profiles = - Objects.requireNonNull(Data.profiles.getValue()); - - if (mProfile != null) { - int pos = Data.profiles.getValue() - .indexOf(mProfile); - mProfile = new MobileLedgerProfile(mProfile); - model.updateProfile(mProfile); - mProfile.storeInDB(); + ProfileDAO dao = DB.get() + .getProfileDAO(); + + Profile profile = new Profile(); + model.updateProfile(profile); + if (profile.getId() > 0) { + dao.update(profile); debug("profiles", "profile stored in DB"); - profiles.set(pos, mProfile); // debug("profiles", String.format("Selected item is %d", mProfile.getThemeHue())); - - final MobileLedgerProfile currentProfile = Data.getProfile(); - if (mProfile.getUuid() - .equals(currentProfile.getUuid())) - { - Data.setCurrentProfile(mProfile); - } - - ProfilesRecyclerViewAdapter viewAdapter = ProfilesRecyclerViewAdapter.getInstance(); - if (viewAdapter != null) - viewAdapter.notifyItemChanged(pos); } else { - mProfile = new MobileLedgerProfile(String.valueOf(UUID.randomUUID())); - model.updateProfile(mProfile); - mProfile.storeInDB(); - final ArrayList newList = new ArrayList<>(profiles); - newList.add(mProfile); - Data.profiles.setValue(newList); - MobileLedgerProfile.storeProfilesOrder(); - - // first profile ever? - if (newList.size() == 1) - Data.setCurrentProfile(mProfile); + dao.insertLast(profile, null); } + BackupManager.dataChanged(BuildConfig.APPLICATION_ID); + Activity activity = getActivity(); if (activity != null) activity.finish(); @@ -493,7 +455,8 @@ public class ProfileDetailFragment extends Fragment { if (model.getUseAuthentication()) { String urlText = model.getUrl(); - if (urlText.startsWith("http") && !urlText.startsWith("https")) + if (urlText.startsWith("http://") || + urlText.length() >= 8 && !urlText.startsWith("https://")) showWarning = true; }