import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel;
-import net.ktnx.mobileledger.async.SendTransactionTask;
+import net.ktnx.mobileledger.App;
+import net.ktnx.mobileledger.json.API;
import net.ktnx.mobileledger.model.Currency;
import net.ktnx.mobileledger.model.HledgerVersion;
import net.ktnx.mobileledger.model.MobileLedgerProfile;
private final MutableLiveData<Boolean> showCommodityByDefault = new MutableLiveData<>(false);
private final MutableLiveData<Boolean> showCommentsByDefault = new MutableLiveData<>(true);
private final MutableLiveData<Boolean> useAuthentication = new MutableLiveData<>(false);
- private final MutableLiveData<SendTransactionTask.API> apiVersion =
- new MutableLiveData<>(SendTransactionTask.API.auto);
+ private final MutableLiveData<API> apiVersion = new MutableLiveData<>(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);
private final MutableLiveData<HledgerVersion> detectedVersion = new MutableLiveData<>(null);
+ private final MutableLiveData<Boolean> detectingHledgerVersion = new MutableLiveData<>(false);
public int initialThemeHue = Colors.DEFAULT_HUE_DEG;
private VersionDetectionThread versionDetectionThread;
public ProfileDetailModel() {
void observeShowCommodityByDefault(LifecycleOwner lfo, Observer<Boolean> o) {
showCommodityByDefault.observe(lfo, o);
}
- Boolean getUseAuthentication() {
+ public Boolean getUseAuthentication() {
return useAuthentication.getValue();
}
void setUseAuthentication(boolean newValue) {
void observeUseAuthentication(LifecycleOwner lfo, Observer<Boolean> o) {
useAuthentication.observe(lfo, o);
}
- SendTransactionTask.API getApiVersion() {
+ API getApiVersion() {
return apiVersion.getValue();
}
- void setApiVersion(SendTransactionTask.API newValue) {
+ void setApiVersion(API newValue) {
if (newValue != apiVersion.getValue())
apiVersion.setValue(newValue);
}
- void observeApiVersion(LifecycleOwner lfo, Observer<SendTransactionTask.API> o) {
+ void observeApiVersion(LifecycleOwner lfo, Observer<API> o) {
apiVersion.observe(lfo, o);
}
HledgerVersion getDetectedVersion() { return detectedVersion.getValue(); }
void observeDetectedVersion(LifecycleOwner lfo, Observer<HledgerVersion> o) {
detectedVersion.observe(lfo, o);
}
- String getUrl() {
+ public String getUrl() {
return url.getValue();
}
void setUrl(String newValue) {
void observeUrl(LifecycleOwner lfo, Observer<String> o) {
url.observe(lfo, o);
}
- String getAuthUserName() {
+ public String getAuthUserName() {
return authUserName.getValue();
}
void setAuthUserName(String newValue) {
void observeUserName(LifecycleOwner lfo, Observer<String> o) {
authUserName.observe(lfo, o);
}
- String getAuthPassword() {
+ public String getAuthPassword() {
return authPassword.getValue();
}
void setAuthPassword(String newValue) {
void observeThemeId(LifecycleOwner lfo, Observer<Integer> o) {
themeId.observe(lfo, o);
}
+ void observeDetectingHledgerVersion(LifecycleOwner lfo, Observer<Boolean> o) {
+ detectingHledgerVersion.observe(lfo, o);
+ }
void setValuesFromProfile(MobileLedgerProfile mProfile, int newProfileHue) {
final int profileThemeId;
if (mProfile != null) {
showCommentsByDefault.setValue(true);
showCommodityByDefault.setValue(false);
setFutureDates(MobileLedgerProfile.FutureDates.None);
- setApiVersion(SendTransactionTask.API.auto);
+ setApiVersion(API.auto);
useAuthentication.setValue(false);
authUserName.setValue("");
authPassword.setValue("");
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;
}
- @Override
- public void run() {
+ private HledgerVersion detectVersion() {
+ App.setAuthenticationDataFromProfileModel(model);
+ HttpURLConnection http = null;
try {
- HttpURLConnection http = NetworkUtil.prepareConnection(model.getUrl(), "version",
+ http = NetworkUtil.prepareConnection(model.getUrl(), "version",
model.getUseAuthentication());
switch (http.getResponseCode()) {
case 200:
break;
case 404:
- model.detectedVersion.postValue(new HledgerVersion(true));
- return;
+ return new HledgerVersion(true);
default:
Logger.debug("profile", String.format(Locale.US,
"HTTP error detecting hledger-web version: [%d] %s",
http.getResponseCode(), http.getResponseMessage()));
- model.detectedVersion.postValue(null);
- return;
+ return null;
}
InputStream stream = http.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
final boolean hasPatch = m.groupCount() >= 3;
int patch = hasPatch ? Integer.parseInt(Objects.requireNonNull(m.group(3))) : 0;
- model.detectedVersion.postValue(
- hasPatch ? new HledgerVersion(major, minor, patch)
- : new HledgerVersion(major, minor));
+ 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;
+ }
+ finally {
+ App.resetAuthenticationData();
+ }
+ }
+ @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);
}
}
}