X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Fprofiles%2FProfileDetailModel.java;h=4cbbfe3d6fda715fa69b0668995aa51f0b61df97;hb=1059279ca52a15efff01c00a67a2a647fef4a1ba;hp=e64c4bc1dc13c8a19caee33efab7eef631aeaf7d;hpb=aca020bc5f699663a7389f50d5ea4e034e5d6976;p=mobile-ledger.git diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailModel.java b/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailModel.java index e64c4bc1..4cbbfe3d 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailModel.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailModel.java @@ -17,6 +17,8 @@ package net.ktnx.mobileledger.ui.profiles; +import android.text.TextUtils; + import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.Observer; @@ -24,8 +26,22 @@ import androidx.lifecycle.ViewModel; import net.ktnx.mobileledger.async.SendTransactionTask; import net.ktnx.mobileledger.model.Currency; +import net.ktnx.mobileledger.model.HledgerVersion; import net.ktnx.mobileledger.model.MobileLedgerProfile; +import net.ktnx.mobileledger.utils.Colors; +import net.ktnx.mobileledger.utils.Logger; import net.ktnx.mobileledger.utils.Misc; +import net.ktnx.mobileledger.utils.NetworkUtil; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.util.Locale; +import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class ProfileDetailModel extends ViewModel { private static final String HTTPS_URL_START = "https://"; @@ -35,6 +51,7 @@ public class ProfileDetailModel extends ViewModel { private final MutableLiveData futureDates = new MutableLiveData<>(MobileLedgerProfile.FutureDates.None); private final MutableLiveData showCommodityByDefault = new MutableLiveData<>(false); + private final MutableLiveData showCommentsByDefault = new MutableLiveData<>(true); private final MutableLiveData useAuthentication = new MutableLiveData<>(false); private final MutableLiveData apiVersion = new MutableLiveData<>(SendTransactionTask.API.auto); @@ -43,6 +60,10 @@ public class ProfileDetailModel extends ViewModel { private final MutableLiveData authPassword = new MutableLiveData<>(null); private final MutableLiveData preferredAccountsFilter = new MutableLiveData<>(null); private final MutableLiveData themeId = new MutableLiveData<>(-1); + private final MutableLiveData detectedVersion = new MutableLiveData<>(null); + private final MutableLiveData detectingHledgerVersion = new MutableLiveData<>(false); + public int initialThemeHue = Colors.DEFAULT_HUE_DEG; + private VersionDetectionThread versionDetectionThread; public ProfileDetailModel() { } String getProfileName() { @@ -69,6 +90,13 @@ public class ProfileDetailModel extends ViewModel { void observePostingPermitted(LifecycleOwner lfo, Observer o) { postingPermitted.observe(lfo, o); } + public void setShowCommentsByDefault(boolean newValue) { + if (newValue != showCommentsByDefault.getValue()) + showCommentsByDefault.setValue(newValue); + } + void observeShowCommentsByDefault(LifecycleOwner lfo, Observer o) { + showCommentsByDefault.observe(lfo, o); + } MobileLedgerProfile.FutureDates getFutureDates() { return futureDates.getValue(); } @@ -119,6 +147,14 @@ public class ProfileDetailModel extends ViewModel { void observeApiVersion(LifecycleOwner lfo, Observer o) { apiVersion.observe(lfo, o); } + HledgerVersion getDetectedVersion() { return detectedVersion.getValue(); } + void setDetectedVersion(HledgerVersion newValue) { + if (!Objects.equals(detectedVersion.getValue(), newValue)) + detectedVersion.setValue(newValue); + } + void observeDetectedVersion(LifecycleOwner lfo, Observer o) { + detectedVersion.observe(lfo, o); + } String getUrl() { return url.getValue(); } @@ -184,15 +220,19 @@ public class ProfileDetailModel extends ViewModel { void observeThemeId(LifecycleOwner lfo, Observer o) { themeId.observe(lfo, o); } + void observeDetectingHledgerVersion(LifecycleOwner lfo, Observer o) { + detectingHledgerVersion.observe(lfo, o); + } void setValuesFromProfile(MobileLedgerProfile mProfile, int newProfileHue) { final int profileThemeId; if (mProfile != null) { profileName.setValue(mProfile.getName()); postingPermitted.setValue(mProfile.isPostingPermitted()); + showCommentsByDefault.setValue(mProfile.getShowCommentsByDefault()); showCommodityByDefault.setValue(mProfile.getShowCommodityByDefault()); { String comm = mProfile.getDefaultCommodity(); - if (Misc.isEmptyOrNull(comm)) + if (TextUtils.isEmpty(comm)) setDefaultCommodity(null); else setDefaultCommodity(new Currency(-1, comm)); @@ -205,11 +245,13 @@ public class ProfileDetailModel extends ViewModel { authPassword.setValue(mProfile.isAuthEnabled() ? mProfile.getAuthPassword() : ""); preferredAccountsFilter.setValue(mProfile.getPreferredAccountsFilter()); themeId.setValue(mProfile.getThemeHue()); + detectedVersion.setValue(mProfile.getDetectedVersion()); } else { profileName.setValue(null); url.setValue(HTTPS_URL_START); postingPermitted.setValue(true); + showCommentsByDefault.setValue(true); showCommodityByDefault.setValue(false); setFutureDates(MobileLedgerProfile.FutureDates.None); setApiVersion(SendTransactionTask.API.auto); @@ -218,14 +260,14 @@ public class ProfileDetailModel extends ViewModel { authPassword.setValue(""); preferredAccountsFilter.setValue(null); themeId.setValue(newProfileHue); + detectedVersion.setValue(null); } - - } void updateProfile(MobileLedgerProfile mProfile) { mProfile.setName(profileName.getValue()); mProfile.setUrl(url.getValue()); mProfile.setPostingPermitted(postingPermitted.getValue()); + mProfile.setShowCommentsByDefault(showCommentsByDefault.getValue()); Currency c = defaultCommodity.getValue(); mProfile.setDefaultCommodity((c == null) ? null : c.getName()); mProfile.setShowCommodityByDefault(showCommodityByDefault.getValue()); @@ -236,5 +278,86 @@ public class ProfileDetailModel extends ViewModel { mProfile.setThemeHue(themeId.getValue()); mProfile.setFutureDates(futureDates.getValue()); mProfile.setApiVersion(apiVersion.getValue()); + mProfile.setDetectedVersion(detectedVersion.getValue()); + } + synchronized public void triggerVersionDetection() { + if (versionDetectionThread != null) + versionDetectionThread.interrupt(); + + versionDetectionThread = new VersionDetectionThread(this); + versionDetectionThread.start(); + } + static class VersionDetectionThread extends Thread { + static final int TARGET_PROCESS_DURATION = 1000; + private final Pattern versionPattern = + Pattern.compile("^\"(\\d+)\\.(\\d+)(?:\\.(\\d+))?\"$"); + private final ProfileDetailModel model; + public VersionDetectionThread(ProfileDetailModel model) { + this.model = model; + } + private HledgerVersion detectVersion() { + HttpURLConnection http = null; + try { + http = NetworkUtil.prepareConnection(model.getUrl(), "version", + model.getUseAuthentication()); + switch (http.getResponseCode()) { + case 200: + break; + case 404: + return new HledgerVersion(true); + default: + Logger.debug("profile", String.format(Locale.US, + "HTTP error detecting hledger-web version: [%d] %s", + http.getResponseCode(), http.getResponseMessage())); + return null; + } + InputStream stream = http.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + String version = reader.readLine(); + Matcher m = versionPattern.matcher(version); + if (m.matches()) { + int major = Integer.parseInt(Objects.requireNonNull(m.group(1))); + int minor = Integer.parseInt(Objects.requireNonNull(m.group(2))); + final boolean hasPatch = m.groupCount() >= 3; + int patch = hasPatch ? Integer.parseInt(Objects.requireNonNull(m.group(3))) : 0; + + return hasPatch ? new HledgerVersion(major, minor, patch) + : new HledgerVersion(major, minor); + } + else { + Logger.debug("profile", + String.format("Unrecognised version string '%s'", version)); + return null; + } + } + catch (IOException e) { + e.printStackTrace(); + return null; + } + } + @Override + public void run() { + model.detectingHledgerVersion.postValue(true); + try { + long startTime = System.currentTimeMillis(); + + final HledgerVersion version = detectVersion(); + + long elapsed = System.currentTimeMillis() - startTime; + Logger.debug("profile", "Detection duration " + elapsed); + if (elapsed < TARGET_PROCESS_DURATION) { + try { + Thread.sleep(TARGET_PROCESS_DURATION - elapsed); + } + catch (InterruptedException e) { + e.printStackTrace(); + } + } + model.detectedVersion.postValue(version); + } + finally { + model.detectingHledgerVersion.postValue(false); + } + } } }