mirror of
https://github.com/nextcloud/notes-android.git
synced 2024-11-27 09:46:50 +03:00
#768 Support API v1.0
Try to find highest supported API version and fallback to API version 0.2
This commit is contained in:
parent
e1c0774d3b
commit
25d9b35a10
8 changed files with 75 additions and 37 deletions
|
@ -686,15 +686,16 @@ public class NotesListViewActivity extends LockedActivity implements ItemAdapter
|
||||||
}
|
}
|
||||||
listView.scrollToPosition(0);
|
listView.scrollToPosition(0);
|
||||||
} else if (requestCode == server_settings) {
|
} else if (requestCode == server_settings) {
|
||||||
// Recreate activity completely, because theme switchting makes problems when only invalidating the views.
|
// Recreate activity completely, because theme switching makes problems when only invalidating the views.
|
||||||
// @see https://github.com/stefan-niedermann/nextcloud-notes/issues/529
|
// @see https://github.com/stefan-niedermann/nextcloud-notes/issues/529
|
||||||
recreate();
|
recreate();
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
AccountImporter.onActivityResult(requestCode, resultCode, data, this, (SingleSignOnAccount account) -> {
|
AccountImporter.onActivityResult(requestCode, resultCode, data, this, (SingleSignOnAccount account) -> {
|
||||||
Log.v(TAG, "Added account: " + "name:" + account.name + ", " + account.url + ", userId" + account.userId);
|
Log.i(TAG, "Added account: " + "name:" + account.name + ", " + account.url + ", userId" + account.userId);
|
||||||
try {
|
try {
|
||||||
db.addAccount(account.url, account.userId, account.name);
|
db.addAccount(account.url, account.userId, account.name);
|
||||||
|
CapabilitiesWorker.update(this);
|
||||||
} catch (SQLiteConstraintException e) {
|
} catch (SQLiteConstraintException e) {
|
||||||
if (db.getAccounts().size() > 1) { // TODO ideally only show snackbar when this is a not migrated account
|
if (db.getAccounts().size() > 1) { // TODO ideally only show snackbar when this is a not migrated account
|
||||||
Snackbar.make(coordinatorLayout, R.string.account_already_imported, Snackbar.LENGTH_LONG).show();
|
Snackbar.make(coordinatorLayout, R.string.account_already_imported, Snackbar.LENGTH_LONG).show();
|
||||||
|
|
|
@ -13,17 +13,15 @@ public class ApiVersion implements Comparable<ApiVersion> {
|
||||||
private String originalVersion = "?";
|
private String originalVersion = "?";
|
||||||
private int major = 0;
|
private int major = 0;
|
||||||
private int minor = 0;
|
private int minor = 0;
|
||||||
private int patch = 0;
|
|
||||||
|
|
||||||
public ApiVersion(String originalVersion, int major, int minor, int patch) {
|
public ApiVersion(String originalVersion, int major, int minor) {
|
||||||
this(major, minor, patch);
|
this(major, minor);
|
||||||
this.originalVersion = originalVersion;
|
this.originalVersion = originalVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ApiVersion(int major, int minor, int patch) {
|
public ApiVersion(int major, int minor) {
|
||||||
this.major = major;
|
this.major = major;
|
||||||
this.minor = minor;
|
this.minor = minor;
|
||||||
this.patch = patch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMajor() {
|
public int getMajor() {
|
||||||
|
@ -34,10 +32,6 @@ public class ApiVersion implements Comparable<ApiVersion> {
|
||||||
return minor;
|
return minor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getPatch() {
|
|
||||||
return patch;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isGreaterOrEqualTo(ApiVersion v) {
|
public boolean isGreaterOrEqualTo(ApiVersion v) {
|
||||||
return compareTo(v) >= 0;
|
return compareTo(v) >= 0;
|
||||||
}
|
}
|
||||||
|
@ -54,13 +48,10 @@ public class ApiVersion implements Comparable<ApiVersion> {
|
||||||
major = extractNumber(split[0]);
|
major = extractNumber(split[0]);
|
||||||
if (split.length > 1) {
|
if (split.length > 1) {
|
||||||
minor = extractNumber(split[1]);
|
minor = extractNumber(split[1]);
|
||||||
if (split.length > 2) {
|
|
||||||
micro = extractNumber(split[2]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
return new ApiVersion(versionString, major, minor);
|
||||||
return new ApiVersion(versionString, major, minor, micro);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int extractNumber(String containsNumbers) {
|
private static int extractNumber(String containsNumbers) {
|
||||||
|
@ -87,10 +78,6 @@ public class ApiVersion implements Comparable<ApiVersion> {
|
||||||
return -1;
|
return -1;
|
||||||
} else if (compare.getMinor() < getMinor()) {
|
} else if (compare.getMinor() < getMinor()) {
|
||||||
return 1;
|
return 1;
|
||||||
} else if (compare.getPatch() > getPatch()) {
|
|
||||||
return -1;
|
|
||||||
} else if (compare.getPatch() < getPatch()) {
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -102,7 +89,6 @@ public class ApiVersion implements Comparable<ApiVersion> {
|
||||||
"originalVersion='" + originalVersion + '\'' +
|
"originalVersion='" + originalVersion + '\'' +
|
||||||
", major=" + major +
|
", major=" + major +
|
||||||
", minor=" + minor +
|
", minor=" + minor +
|
||||||
", patch=" + patch +
|
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,17 @@ package it.niedermann.owncloud.notes.model;
|
||||||
|
|
||||||
import androidx.annotation.ColorInt;
|
import androidx.annotation.ColorInt;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
|
import it.niedermann.owncloud.notes.persistence.NotesClient;
|
||||||
|
|
||||||
public class LocalAccount {
|
public class LocalAccount {
|
||||||
|
|
||||||
|
@ -12,7 +23,7 @@ public class LocalAccount {
|
||||||
private String url;
|
private String url;
|
||||||
private String etag;
|
private String etag;
|
||||||
private long modified;
|
private long modified;
|
||||||
private String apiVersion;
|
private ApiVersion preferredApiVersion;
|
||||||
@ColorInt
|
@ColorInt
|
||||||
private int color;
|
private int color;
|
||||||
@ColorInt
|
@ColorInt
|
||||||
|
@ -66,12 +77,36 @@ public class LocalAccount {
|
||||||
this.modified = modified;
|
this.modified = modified;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getApiVersion() {
|
public ApiVersion getPreferredApiVersion() {
|
||||||
return apiVersion;
|
return preferredApiVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setApiVersion(String apiVersion) {
|
/**
|
||||||
this.apiVersion = apiVersion;
|
* @param availableApiVersions <code>["0.2", "1.0", ...]</code>
|
||||||
|
*/
|
||||||
|
public void setPreferredApiVersion(@Nullable String availableApiVersions) {
|
||||||
|
// TODO move this logic to NotesClient?
|
||||||
|
try {
|
||||||
|
if(availableApiVersions == null) {
|
||||||
|
this.preferredApiVersion = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
JSONArray versionsArray = new JSONArray(availableApiVersions);
|
||||||
|
Collection<ApiVersion> supportedApiVersions = new ArrayList<>(versionsArray.length());
|
||||||
|
for (int i = 0; i < versionsArray.length(); i++) {
|
||||||
|
ApiVersion parsedApiVersion = ApiVersion.of(versionsArray.getString(i));
|
||||||
|
for (ApiVersion temp : NotesClient.SUPPORTED_API_VERSIONS) {
|
||||||
|
if (temp.compareTo(parsedApiVersion) == 0) {
|
||||||
|
supportedApiVersions.add(parsedApiVersion);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.preferredApiVersion = Collections.max(supportedApiVersions);
|
||||||
|
} catch (JSONException | NoSuchElementException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
this.preferredApiVersion = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getColor() {
|
public int getColor() {
|
||||||
|
@ -100,7 +135,7 @@ public class LocalAccount {
|
||||||
", url='" + url + '\'' +
|
", url='" + url + '\'' +
|
||||||
", etag='" + etag + '\'' +
|
", etag='" + etag + '\'' +
|
||||||
", modified=" + modified +
|
", modified=" + modified +
|
||||||
", apiVersion='" + apiVersion + '\'' +
|
", apiVersion='" + preferredApiVersion + '\'' +
|
||||||
", color=" + color +
|
", color=" + color +
|
||||||
", textColor=" + textColor +
|
", textColor=" + textColor +
|
||||||
'}';
|
'}';
|
||||||
|
|
|
@ -19,7 +19,6 @@ import java.util.Map;
|
||||||
|
|
||||||
import it.niedermann.owncloud.notes.model.Capabilities;
|
import it.niedermann.owncloud.notes.model.Capabilities;
|
||||||
|
|
||||||
@SuppressWarnings("WeakerAccess")
|
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
public class CapabilitiesClient {
|
public class CapabilitiesClient {
|
||||||
|
|
||||||
|
|
|
@ -40,10 +40,10 @@ public class CapabilitiesWorker extends Worker {
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public Result doWork() {
|
public Result doWork() {
|
||||||
NotesDatabase db = NotesDatabase.getInstance(getApplicationContext());
|
final NotesDatabase db = NotesDatabase.getInstance(getApplicationContext());
|
||||||
for (LocalAccount account : db.getAccounts()) {
|
for (LocalAccount account : db.getAccounts()) {
|
||||||
try {
|
try {
|
||||||
SingleSignOnAccount ssoAccount = AccountImporter.getSingleSignOnAccount(getApplicationContext(), account.getAccountName());
|
final SingleSignOnAccount ssoAccount = AccountImporter.getSingleSignOnAccount(getApplicationContext(), account.getAccountName());
|
||||||
Log.i(TAG, "Refreshing capabilities for " + ssoAccount.name);
|
Log.i(TAG, "Refreshing capabilities for " + ssoAccount.name);
|
||||||
final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplicationContext(), ssoAccount);
|
final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplicationContext(), ssoAccount);
|
||||||
db.updateBrand(account.getId(), capabilities);
|
db.updateBrand(account.getId(), capabilities);
|
||||||
|
@ -59,7 +59,7 @@ public class CapabilitiesWorker extends Worker {
|
||||||
|
|
||||||
public static void update(@NonNull Context context) {
|
public static void update(@NonNull Context context) {
|
||||||
deregister(context);
|
deregister(context);
|
||||||
Log.i(TAG, "Registering worker running each 24 hours.");
|
Log.i(TAG, "Registering capabilities worker running each 24 hours.");
|
||||||
WorkManager.getInstance(context.getApplicationContext()).enqueueUniquePeriodicWork(WORKER_TAG, ExistingPeriodicWorkPolicy.REPLACE, work);
|
WorkManager.getInstance(context.getApplicationContext()).enqueueUniquePeriodicWork(WORKER_TAG, ExistingPeriodicWorkPolicy.REPLACE, work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -218,9 +218,10 @@ public class NoteServerSyncHelper {
|
||||||
Log.e(TAG, LocalAccount.class.getSimpleName() + " for ssoAccount \"" + ssoAccount.name + "\" is null. Cannot synchronize.", new IllegalStateException());
|
Log.e(TAG, LocalAccount.class.getSimpleName() + " for ssoAccount \"" + ssoAccount.name + "\" is null. Cannot synchronize.", new IllegalStateException());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// TODO should each LocalAccount have a NotesClient instance? This way we could save the Map<>
|
||||||
final NotesClient notesClient;
|
final NotesClient notesClient;
|
||||||
if (!notesClients.containsKey(ssoAccount.name)) {
|
if (!notesClients.containsKey(ssoAccount.name)) {
|
||||||
notesClients.put(ssoAccount.name, NotesClient.newInstance(localAccount, context));
|
notesClients.put(ssoAccount.name, NotesClient.newInstance(localAccount.getPreferredApiVersion(), context));
|
||||||
}
|
}
|
||||||
notesClient = notesClients.get(ssoAccount.name);
|
notesClient = notesClients.get(ssoAccount.name);
|
||||||
if (notesClient == null) {
|
if (notesClient == null) {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import android.content.pm.PackageInfo;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.WorkerThread;
|
import androidx.annotation.WorkerThread;
|
||||||
|
|
||||||
import com.nextcloud.android.sso.aidl.NextcloudRequest;
|
import com.nextcloud.android.sso.aidl.NextcloudRequest;
|
||||||
|
@ -24,8 +25,8 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import it.niedermann.owncloud.notes.model.ApiVersion;
|
||||||
import it.niedermann.owncloud.notes.model.CloudNote;
|
import it.niedermann.owncloud.notes.model.CloudNote;
|
||||||
import it.niedermann.owncloud.notes.model.LocalAccount;
|
|
||||||
import it.niedermann.owncloud.notes.util.ServerResponse.NoteResponse;
|
import it.niedermann.owncloud.notes.util.ServerResponse.NoteResponse;
|
||||||
import it.niedermann.owncloud.notes.util.ServerResponse.NotesResponse;
|
import it.niedermann.owncloud.notes.util.ServerResponse.NotesResponse;
|
||||||
|
|
||||||
|
@ -60,9 +61,24 @@ public abstract class NotesClient {
|
||||||
public static final String JSON_ETAG = "etag";
|
public static final String JSON_ETAG = "etag";
|
||||||
public static final String JSON_MODIFIED = "modified";
|
public static final String JSON_MODIFIED = "modified";
|
||||||
|
|
||||||
public static NotesClient newInstance(@NonNull LocalAccount localAccount,
|
public static final ApiVersion[] SUPPORTED_API_VERSIONS = new ApiVersion[]{
|
||||||
|
new ApiVersion(1, 0),
|
||||||
|
new ApiVersion(0, 2)
|
||||||
|
};
|
||||||
|
|
||||||
|
public static NotesClient newInstance(@Nullable ApiVersion preferredApiVersion,
|
||||||
@NonNull Context appContext) {
|
@NonNull Context appContext) {
|
||||||
// TODO check localAccount API_VERSION and create another instance if necessary
|
if (preferredApiVersion == null) {
|
||||||
|
Log.i(TAG, "apiVersion is null, using " + NotesClient_0_2.class.getSimpleName());
|
||||||
|
return new NotesClient_0_2(appContext);
|
||||||
|
// } else if (preferredApiVersion.compareTo(SUPPORTED_API_VERSIONS[0]) == 0) {
|
||||||
|
// Log.i(TAG, "Using " + NotesClient_1_0.class.getSimpleName());
|
||||||
|
// return new NotesClient_1_0(appContext);
|
||||||
|
} else if (preferredApiVersion.compareTo(SUPPORTED_API_VERSIONS[1]) == 0) {
|
||||||
|
Log.i(TAG, "Using " + NotesClient_0_2.class.getSimpleName());
|
||||||
|
return new NotesClient_0_2(appContext);
|
||||||
|
}
|
||||||
|
Log.w(TAG, "Unsupported API version " + preferredApiVersion + " - try using " + NotesClient_0_2.class.getSimpleName());
|
||||||
return new NotesClient_0_2(appContext);
|
return new NotesClient_0_2(appContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -669,7 +669,7 @@ public class NotesDatabase extends AbstractNotesDatabase {
|
||||||
account.setUserName(cursor.getString(3));
|
account.setUserName(cursor.getString(3));
|
||||||
account.setETag(cursor.getString(4));
|
account.setETag(cursor.getString(4));
|
||||||
account.setModified(cursor.getLong(5));
|
account.setModified(cursor.getLong(5));
|
||||||
account.setApiVersion(cursor.getString(6));
|
account.setPreferredApiVersion(cursor.getString(6));
|
||||||
account.setColor(Color.parseColor('#' + cursor.getString(7)));
|
account.setColor(Color.parseColor('#' + cursor.getString(7)));
|
||||||
account.setTextColor(Color.parseColor('#' + cursor.getString(8)));
|
account.setTextColor(Color.parseColor('#' + cursor.getString(8)));
|
||||||
}
|
}
|
||||||
|
@ -689,7 +689,7 @@ public class NotesDatabase extends AbstractNotesDatabase {
|
||||||
account.setUserName(cursor.getString(3));
|
account.setUserName(cursor.getString(3));
|
||||||
account.setETag(cursor.getString(4));
|
account.setETag(cursor.getString(4));
|
||||||
account.setModified(cursor.getLong(5));
|
account.setModified(cursor.getLong(5));
|
||||||
account.setApiVersion(cursor.getString(6));
|
account.setPreferredApiVersion(cursor.getString(6));
|
||||||
account.setColor(Color.parseColor('#' + cursor.getString(7)));
|
account.setColor(Color.parseColor('#' + cursor.getString(7)));
|
||||||
account.setTextColor(Color.parseColor('#' + cursor.getString(8)));
|
account.setTextColor(Color.parseColor('#' + cursor.getString(8)));
|
||||||
accounts.add(account);
|
accounts.add(account);
|
||||||
|
@ -714,7 +714,7 @@ public class NotesDatabase extends AbstractNotesDatabase {
|
||||||
account.setUserName(cursor.getString(3));
|
account.setUserName(cursor.getString(3));
|
||||||
account.setETag(cursor.getString(4));
|
account.setETag(cursor.getString(4));
|
||||||
account.setModified(cursor.getLong(5));
|
account.setModified(cursor.getLong(5));
|
||||||
account.setApiVersion(cursor.getString(6));
|
account.setPreferredApiVersion(cursor.getString(6));
|
||||||
account.setColor(Color.parseColor('#' + cursor.getString(7)));
|
account.setColor(Color.parseColor('#' + cursor.getString(7)));
|
||||||
account.setTextColor(Color.parseColor('#' + cursor.getString(8)));
|
account.setTextColor(Color.parseColor('#' + cursor.getString(8)));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue