From ccc812dc6edb0b42976ab0199f87e804ef5b2f74 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Tue, 11 May 2021 14:45:22 +0200 Subject: #1079 Show DisplayName instead of uid attribute for LDAP users --- .../shared/account/AccountChooserViewHolder.java | 2 +- .../owncloud/notes/shared/model/OcsResponse.java | 32 ++++++++++++++++++++++ .../owncloud/notes/shared/model/User.java | 15 ++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/shared/model/User.java (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/account/AccountChooserViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/account/AccountChooserViewHolder.java index 7688b1b1..5d3d2963 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/account/AccountChooserViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/account/AccountChooserViewHolder.java @@ -31,7 +31,7 @@ public class AccountChooserViewHolder extends RecyclerView.ViewHolder { .into(binding.accountItemAvatar); binding.accountLayout.setOnClickListener((v) -> targetAccountConsumer.accept(localAccount)); - binding.accountName.setText(localAccount.getUserName()); + binding.accountName.setText(localAccount.getDisplayName()); binding.accountHost.setText(Uri.parse(localAccount.getUrl()).getHost()); } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java new file mode 100644 index 00000000..c47b4151 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java @@ -0,0 +1,32 @@ +package it.niedermann.owncloud.notes.shared.model; + +import com.google.gson.annotations.Expose; + +import java.io.Serializable; + +/** + * OpenCollaborationServices + * + * @param defines the payload of this {@link OcsResponse}. + */ +public class OcsResponse implements Serializable { + + @Expose + public OcsWrapper ocs; + + public static class OcsWrapper { + @Expose + public OcsMeta meta; + @Expose + public T data; + } + + public static class OcsMeta { + @Expose + public String status; + @Expose + public int statuscode; + @Expose + public String message; + } +} \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/User.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/User.java new file mode 100644 index 00000000..0033b610 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/User.java @@ -0,0 +1,15 @@ +package it.niedermann.owncloud.notes.shared.model; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +public class User implements Serializable { + @Expose + @SerializedName("id") + public String userId; + @Expose + @SerializedName("displayname") + public String displayName; +} \ No newline at end of file -- cgit v1.2.3 From 02cb22dc1d0380043b10c84a2873af3e4c514098 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Tue, 11 May 2021 16:12:42 +0200 Subject: #1079 Reuse OcsResponse wrapper also for Capabilities --- .../owncloud/notes/shared/model/Capabilities.java | 84 ---------------------- .../owncloud/notes/shared/model/OcsResponse.java | 4 +- .../owncloud/notes/shared/model/OcsUser.java | 16 +++++ .../owncloud/notes/shared/model/User.java | 15 ---- 4 files changed, 17 insertions(+), 102 deletions(-) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsUser.java delete mode 100644 app/src/main/java/it/niedermann/owncloud/notes/shared/model/User.java (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java index 5514a91b..70234aab 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java @@ -1,43 +1,12 @@ package it.niedermann.owncloud.notes.shared.model; -import android.graphics.Color; -import android.util.Log; - import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; - -import com.bumptech.glide.load.HttpException; -import com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException; - -import org.json.JSONException; -import org.json.JSONObject; - -import it.niedermann.android.util.ColorUtil; -import static java.net.HttpURLConnection.HTTP_UNAVAILABLE; - -/** - * This entity class is used to return relevant data of the HTTP response. - */ public class Capabilities { - private static final String TAG = Capabilities.class.getSimpleName(); - - private static final String JSON_OCS = "ocs"; - private static final String JSON_OCS_META = "meta"; - private static final String JSON_OCS_META_STATUSCODE = "statuscode"; - private static final String JSON_OCS_DATA = "data"; - private static final String JSON_OCS_DATA_CAPABILITIES = "capabilities"; - private static final String JSON_OCS_DATA_CAPABILITIES_NOTES = "notes"; - private static final String JSON_OCS_DATA_CAPABILITIES_NOTES_API_VERSION = "api_version"; - private static final String JSON_OCS_DATA_CAPABILITIES_THEMING = "theming"; - private static final String JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR = "color"; - private static final String JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR_TEXT = "color-text"; - private String apiVersion = null; - @ColorInt private int color = -16743735; @ColorInt @@ -45,59 +14,6 @@ public class Capabilities { @Nullable private String eTag; - public Capabilities() { - - } - - @VisibleForTesting - public Capabilities(@NonNull String response, @Nullable String eTag) throws NextcloudHttpRequestFailedException { - this.eTag = eTag; - final JSONObject ocs; - try { - ocs = new JSONObject(response).getJSONObject(JSON_OCS); - if (ocs.has(JSON_OCS_META)) { - final JSONObject meta = ocs.getJSONObject(JSON_OCS_META); - if (meta.has(JSON_OCS_META_STATUSCODE)) { - if (meta.getInt(JSON_OCS_META_STATUSCODE) == HTTP_UNAVAILABLE) { - Log.i(TAG, "Capabilities Endpoint: This instance is currently in maintenance mode."); - throw new NextcloudHttpRequestFailedException(HTTP_UNAVAILABLE, new HttpException(HTTP_UNAVAILABLE)); - } - } - } - if (ocs.has(JSON_OCS_DATA)) { - final JSONObject data = ocs.getJSONObject(JSON_OCS_DATA); - if (data.has(JSON_OCS_DATA_CAPABILITIES)) { - final JSONObject capabilities = data.getJSONObject(JSON_OCS_DATA_CAPABILITIES); - if (capabilities.has(JSON_OCS_DATA_CAPABILITIES_NOTES)) { - final JSONObject notes = capabilities.getJSONObject(JSON_OCS_DATA_CAPABILITIES_NOTES); - if (notes.has(JSON_OCS_DATA_CAPABILITIES_NOTES_API_VERSION)) { - this.apiVersion = notes.getString(JSON_OCS_DATA_CAPABILITIES_NOTES_API_VERSION); - } - } - if (capabilities.has(JSON_OCS_DATA_CAPABILITIES_THEMING)) { - final JSONObject theming = capabilities.getJSONObject(JSON_OCS_DATA_CAPABILITIES_THEMING); - if (theming.has(JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR)) { - try { - this.color = Color.parseColor(ColorUtil.INSTANCE.formatColorToParsableHexString(theming.getString(JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR))); - } catch (Exception e) { - e.printStackTrace(); - } - } - if (theming.has(JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR_TEXT)) { - try { - this.textColor = Color.parseColor(ColorUtil.INSTANCE.formatColorToParsableHexString(theming.getString(JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR_TEXT))); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - } - } catch (JSONException e) { - e.printStackTrace(); - } - } - public void setApiVersion(String apiVersion) { this.apiVersion = apiVersion; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java index c47b4151..0fea9a92 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java @@ -2,14 +2,12 @@ package it.niedermann.owncloud.notes.shared.model; import com.google.gson.annotations.Expose; -import java.io.Serializable; - /** * OpenCollaborationServices * * @param defines the payload of this {@link OcsResponse}. */ -public class OcsResponse implements Serializable { +public class OcsResponse { @Expose public OcsWrapper ocs; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsUser.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsUser.java new file mode 100644 index 00000000..9248abdf --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsUser.java @@ -0,0 +1,16 @@ +package it.niedermann.owncloud.notes.shared.model; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +/** + * Equivalent of an OcsUser + */ +public class OcsUser { + @Expose + @SerializedName("id") + public String userId; + @Expose + @SerializedName("displayname") + public String displayName; +} \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/User.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/User.java deleted file mode 100644 index 0033b610..00000000 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/User.java +++ /dev/null @@ -1,15 +0,0 @@ -package it.niedermann.owncloud.notes.shared.model; - -import com.google.gson.annotations.Expose; -import com.google.gson.annotations.SerializedName; - -import java.io.Serializable; - -public class User implements Serializable { - @Expose - @SerializedName("id") - public String userId; - @Expose - @SerializedName("displayname") - public String displayName; -} \ No newline at end of file -- cgit v1.2.3 From 757d7272ca58ed63cae83605e512e454f3af05f2 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Tue, 11 May 2021 18:00:57 +0200 Subject: #1079 Do not refresh displayName on Pull 2 Refresh --- .../java/it/niedermann/owncloud/notes/shared/model/Capabilities.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java index 70234aab..7640899e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java @@ -8,9 +8,9 @@ public class Capabilities { private String apiVersion = null; @ColorInt - private int color = -16743735; + private int color = -16743735; // #0082C9 @ColorInt - private int textColor = -16777216; + private int textColor = -16777216; // #000000 @Nullable private String eTag; -- cgit v1.2.3 From 59c99f7de45e0ed35761f675852c60b5cb8a9714 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Tue, 11 May 2021 20:28:50 +0200 Subject: Enhance handling, parsing, sanitizing and serialization of supported ApiVersions --- .../owncloud/notes/shared/model/ApiVersion.java | 3 + .../owncloud/notes/shared/util/ApiVersionUtil.java | 107 +++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/ApiVersion.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/ApiVersion.java index 94c5408d..0f8b7c1c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/ApiVersion.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/ApiVersion.java @@ -83,6 +83,9 @@ public class ApiVersion implements Comparable { return 0; } + /** + * Checks only the {@link #major} version. + */ @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java new file mode 100644 index 00000000..50d1b4ea --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java @@ -0,0 +1,107 @@ +package it.niedermann.owncloud.notes.shared.util; + +import android.text.TextUtils; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.json.JSONArray; +import org.json.JSONException; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Objects; +import java.util.stream.Collectors; + +import it.niedermann.owncloud.notes.shared.model.ApiVersion; + +public class ApiVersionUtil { + + private static final String TAG = ApiVersionUtil.class.getSimpleName(); + + private ApiVersionUtil() { + + } + + /** + * @return a {@link Collection} of all valid {@link ApiVersion}s which have been found in {@param raw}. + */ + @NonNull + public static Collection parse(@Nullable String raw) { + if (TextUtils.isEmpty(raw)) { + return Collections.emptyList(); + } + + JSONArray a; + try { + a = new JSONArray(raw); + } catch (JSONException e) { + try { + a = new JSONArray("[" + raw + "]"); + } catch (JSONException e1) { + return Collections.emptyList(); + } + } + + final Collection result = new ArrayList<>(); + for (int i = 0; i < a.length(); i++) { + try { + final ApiVersion version = ApiVersion.of(a.getString(i)); + if (version.getMajor() != 0 || version.getMinor() != 0) { + result.add(version); + } + } catch (Exception ignored) { + } + } + return result; + } + + /** + * @return a serialized {@link String} of the given {@param apiVersions} or null. + */ + @Nullable + public static String serialize(@Nullable Collection apiVersions) { + if (apiVersions == null || apiVersions.isEmpty()) { + return null; + } + return "[" + + apiVersions + .stream() + .filter(Objects::nonNull) + .map(v -> v.getMajor() + "." + v.getMinor()) + .collect(Collectors.joining(",")) + + "]"; + } + + @Nullable + public static String sanitize(@Nullable String raw) { + return serialize(parse(raw)); + } + + /** + * @return the highest {@link ApiVersion} that is supported by the server according to {@param raw}, + * whose major version is also supported by this app (see {@link ApiVersion#SUPPORTED_API_VERSIONS}). + * Returns null if no better version could be found. + */ + @Nullable + public static ApiVersion getPreferredApiVersion(@Nullable String raw) { + return parse(raw) + .stream() + .filter(version -> Arrays.asList(ApiVersion.SUPPORTED_API_VERSIONS).contains(version)) + .max((o1, o2) -> { + if (o2.getMajor() > o1.getMajor()) { + return -1; + } else if (o2.getMajor() < o1.getMajor()) { + return 1; + } else if (o2.getMinor() > o1.getMinor()) { + return -1; + } else if (o2.getMinor() < o1.getMinor()) { + return 1; + } + return 0; + }) + .orElse(null); + } +} -- cgit v1.2.3 From 3ddfde9a5418ba23aef752162c73d423a5e207a3 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Tue, 11 May 2021 21:15:56 +0200 Subject: Sanitize API versions while migrating the database --- .../notes/shared/util/DatabaseIndexUtil.java | 41 ---------------------- 1 file changed, 41 deletions(-) delete mode 100644 app/src/main/java/it/niedermann/owncloud/notes/shared/util/DatabaseIndexUtil.java (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DatabaseIndexUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DatabaseIndexUtil.java deleted file mode 100644 index 8506c713..00000000 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DatabaseIndexUtil.java +++ /dev/null @@ -1,41 +0,0 @@ -package it.niedermann.owncloud.notes.shared.util; - -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.util.Log; - -import androidx.annotation.NonNull; -import androidx.sqlite.db.SupportSQLiteDatabase; - -public class DatabaseIndexUtil { - - private static final String TAG = DatabaseIndexUtil.class.getSimpleName(); - - private DatabaseIndexUtil() { - - } - - public static void createIndex(@NonNull SupportSQLiteDatabase db, @NonNull String table, @NonNull String... columns) { - for (String column : columns) { - createIndex(db, table, column); - } - } - - public static void createIndex(@NonNull SupportSQLiteDatabase db, @NonNull String table, @NonNull String column) { - String indexName = table + "_" + column + "_idx"; - Log.v(TAG, "Creating database index: CREATE INDEX IF NOT EXISTS " + indexName + " ON " + table + "(" + column + ")"); - db.execSQL("CREATE INDEX " + indexName + " ON " + table + "(" + column + ")"); - } - - public static void dropIndexes(@NonNull SupportSQLiteDatabase db) { - try (Cursor c = db.query("SELECT name, sql FROM sqlite_master WHERE type = 'index'")) { - while (c.moveToNext()) { - // Skip automatic indexes which we can't drop manually - if (c.getString(1) != null) { - Log.v(TAG, "Deleting database index: DROP INDEX " + c.getString(0)); - db.execSQL("DROP INDEX " + c.getString(0)); - } - } - } - } -} -- cgit v1.2.3 From 6d0e9bc310ace7564cbe65b2e7dddf24134c56f1 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Wed, 12 May 2021 12:00:36 +0200 Subject: Throw exception when instantiating an util class --- .../it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java | 4 +--- .../niedermann/owncloud/notes/shared/util/DeviceCredentialUtil.java | 2 +- .../java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java | 2 +- .../main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java | 2 +- .../it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java | 1 + .../main/java/it/niedermann/owncloud/notes/shared/util/SSOUtil.java | 2 +- .../java/it/niedermann/owncloud/notes/shared/util/ShareUtil.java | 5 +++++ .../java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java | 2 +- 8 files changed, 12 insertions(+), 8 deletions(-) (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java index 50d1b4ea..57788472 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java @@ -19,10 +19,8 @@ import it.niedermann.owncloud.notes.shared.model.ApiVersion; public class ApiVersionUtil { - private static final String TAG = ApiVersionUtil.class.getSimpleName(); - private ApiVersionUtil() { - + throw new UnsupportedOperationException("Do not instantiate this util class."); } /** diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DeviceCredentialUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DeviceCredentialUtil.java index 034eea5a..14163e91 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DeviceCredentialUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DeviceCredentialUtil.java @@ -12,7 +12,7 @@ public class DeviceCredentialUtil { private static final String TAG = DeviceCredentialUtil.class.getSimpleName(); private DeviceCredentialUtil() { - // utility class -> private constructor + throw new UnsupportedOperationException("Do not instantiate this util class."); } public static boolean areCredentialsAvailable(Context context) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java index ad6b6793..b0adc011 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java @@ -30,7 +30,7 @@ import it.niedermann.owncloud.notes.persistence.entity.CategoryWithNotesCount; public class DisplayUtils { private DisplayUtils() { - + throw new UnsupportedOperationException("Do not instantiate this util class."); } public static List convertToCategoryNavigationItem(@NonNull Context context, @NonNull Collection counter) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java index e5b8afae..e8493614 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java @@ -22,7 +22,7 @@ public class NoteUtil { public static final String EXCERPT_LINE_SEPARATOR = " "; private NoteUtil() { - + throw new UnsupportedOperationException("Do not instantiate this util class."); } /** diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java index a445208b..42aaf79d 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java @@ -14,6 +14,7 @@ public final class NotesColorUtil { private static final Map CONTRAST_RATIO_SUFFICIENT_CACHE = new HashMap<>(); private NotesColorUtil() { + throw new UnsupportedOperationException("Do not instantiate this util class."); } public static boolean contrastRatioIsSufficient(@ColorInt int colorOne, @ColorInt int colorTwo) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SSOUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SSOUtil.java index da529136..1e2542b0 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SSOUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SSOUtil.java @@ -19,7 +19,7 @@ public class SSOUtil { private static final String TAG = SSOUtil.class.getSimpleName(); private SSOUtil() { - + throw new UnsupportedOperationException("Do not instantiate this util class."); } /** diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ShareUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ShareUtil.java index 115d18dd..4b7aebd9 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ShareUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ShareUtil.java @@ -14,6 +14,11 @@ import it.niedermann.android.markdown.MarkdownUtil; import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN; public class ShareUtil { + + private ShareUtil() { + throw new UnsupportedOperationException("Do not instantiate this util class."); + } + public static void openShareDialog(@NonNull Context context, @Nullable String subject, @Nullable String text) { context.startActivity(Intent.createChooser(new Intent() .setAction(Intent.ACTION_SEND) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java index 8bf80cb9..27fec716 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java @@ -13,7 +13,7 @@ import androidx.core.text.HtmlCompat; public class SupportUtil { private SupportUtil() { - + throw new UnsupportedOperationException("Do not instantiate this util class."); } /** -- cgit v1.2.3 From 3bf57cd2850962045ec5cd8ff8575850770bf029 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Wed, 12 May 2021 15:24:07 +0200 Subject: Fix #1205 Also remove markdown from title when the note only has one line Includes a few more unit tests for this method --- .../main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java index e8493614..3d5a118c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java @@ -117,7 +117,7 @@ public class NoteUtil { line = removeMarkdown(lines[currentLine]); } } else { - line = content; + line = removeMarkdown(content); } return line; } -- cgit v1.2.3 From c07b7717430c7afdf3bed8f2ad288d9921f6df7d Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Wed, 12 May 2021 18:15:09 +0200 Subject: Add unit test for NotesRepository#getInstance() --- .../it/niedermann/owncloud/notes/shared/model/ApiVersion.java | 4 ---- .../owncloud/notes/shared/model/CategorySortingMethod.java | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/ApiVersion.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/ApiVersion.java index 0f8b7c1c..0a42012b 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/ApiVersion.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/ApiVersion.java @@ -41,10 +41,6 @@ public class ApiVersion implements Comparable { return minor; } - public String getOriginalVersion() { - return originalVersion; - } - public static ApiVersion of(String versionString) { int major = 0, minor = 0; if (versionString != null) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/CategorySortingMethod.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/CategorySortingMethod.java index 94bcda38..6a36ade1 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/CategorySortingMethod.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/CategorySortingMethod.java @@ -7,7 +7,7 @@ public enum CategorySortingMethod { private final int id; private final String title; // sorting method OrderBy for SQL - /*** + /** * Constructor * @param title given sorting method OrderBy */ @@ -16,7 +16,7 @@ public enum CategorySortingMethod { this.title = title; } - /*** + /** * Retrieve the sorting method id represented in database * @return the sorting method id for the enum item */ @@ -24,7 +24,7 @@ public enum CategorySortingMethod { return this.id; } - /*** + /** * Retrieve the sorting method order for SQL * @return the sorting method order for the enum item */ @@ -32,7 +32,7 @@ public enum CategorySortingMethod { return this.title; } - /*** + /** * Retrieve the corresponding enum value with given the index (ordinal) * @param id the id of the corresponding enum value stored in DB * @return the corresponding enum item with the index (ordinal) -- cgit v1.2.3 From 58b291856875f2b6596ff585abf8ec6bfd4d9e9b Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Thu, 20 May 2021 10:35:57 +0200 Subject: =?UTF-8?q?-=20=F0=9F=8E=A8=20Fix=20theming=20issue=20when=20themi?= =?UTF-8?q?ng=20app=20is=20disabled=20on=20the=20server?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Niedermann --- .../java/it/niedermann/owncloud/notes/shared/model/Capabilities.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java index 7640899e..06bd867d 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java @@ -1,5 +1,7 @@ package it.niedermann.owncloud.notes.shared.model; +import android.graphics.Color; + import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -10,7 +12,7 @@ public class Capabilities { @ColorInt private int color = -16743735; // #0082C9 @ColorInt - private int textColor = -16777216; // #000000 + private int textColor = Color.WHITE; @Nullable private String eTag; -- cgit v1.2.3 From 115a3c030fbb53dc667fb26599dacf9d0f5fe510 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Mon, 24 May 2021 17:20:10 +0200 Subject: Extract logic to clear Glide cache into CustomAppGlideModule Signed-off-by: Stefan Niedermann --- .../notes/shared/util/CustomAppGlideModule.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/CustomAppGlideModule.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/CustomAppGlideModule.java index 03eb1097..35625119 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/CustomAppGlideModule.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/CustomAppGlideModule.java @@ -1,18 +1,37 @@ package it.niedermann.owncloud.notes.shared.util; import android.content.Context; +import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.UiThread; import com.bumptech.glide.Glide; import com.bumptech.glide.Registry; import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.module.AppGlideModule; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + @GlideModule public class CustomAppGlideModule extends AppGlideModule { + + private static final String TAG = CustomAppGlideModule.class.getSimpleName(); + private static final ExecutorService clearDiskCacheExecutor = Executors.newSingleThreadExecutor(); + @Override public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) { super.registerComponents(context, glide, registry); } + + @UiThread + public static void clearCache(@NonNull Context context) { + Log.i(TAG, "Clearing Glide memory cache"); + Glide.get(context).clearMemory(); + clearDiskCacheExecutor.submit(() -> { + Log.i(TAG, "Clearing Glide disk cache"); + Glide.get(context.getApplicationContext()).clearDiskCache(); + }); + } } \ No newline at end of file -- cgit v1.2.3 From d68f2dfef20688874d6b836fdee9c602816adbab Mon Sep 17 00:00:00 2001 From: drhaal Date: Tue, 8 Jun 2021 21:45:32 +0200 Subject: refactoring --- .../owncloud/notes/shared/util/DisplayUtils.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java index b0adc011..80ac7de4 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java @@ -3,10 +3,14 @@ package it.niedermann.owncloud.notes.shared.util; import android.content.Context; import android.content.res.Resources; import android.graphics.Color; +import android.graphics.Rect; +import android.os.Build; import android.text.Spannable; import android.text.TextPaint; import android.text.TextUtils; import android.text.style.MetricAffectingSpan; +import android.util.TypedValue; +import android.view.View; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; @@ -52,4 +56,21 @@ public class DisplayUtils { } return new NavigationItem.CategoryNavigationItem("category:" + counter.getCategory(), counter.getCategory(), counter.getTotalNotes(), icon, counter.getAccountId(), counter.getCategory()); } + + /** + * Android does not provide a way to get keyboard visibility prior to API 30 so we use a workaround + * @param parentView View + * @return keyboardVisibility Boolean + */ + public static boolean isSoftKeyboardVisible(View parentView){ + //Arbitrary keyboard height + final int defaultKeyboardHeightDP = 100; + final int EstimatedKeyboardDP = defaultKeyboardHeightDP + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 48 : 0); + final Rect rect = new Rect(); + + int estimatedKeyboardHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, EstimatedKeyboardDP, parentView.getResources().getDisplayMetrics()); + parentView.getWindowVisibleDisplayFrame(rect); + int heightDiff = parentView.getRootView().getHeight() - (rect.bottom - rect.top); + return heightDiff >= estimatedKeyboardHeight; + } } -- cgit v1.2.3 From 988ce872ccbfb5f96825d90eea811e5e1a713cfc Mon Sep 17 00:00:00 2001 From: drhaal Date: Tue, 8 Jun 2021 21:58:08 +0200 Subject: reformat code --- .../java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java index 80ac7de4..297c843c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java @@ -58,11 +58,12 @@ public class DisplayUtils { } /** - * Android does not provide a way to get keyboard visibility prior to API 30 so we use a workaround + * Android does not provide a way to get keyboard visibility prior to API 30 so we use a workaround + * * @param parentView View * @return keyboardVisibility Boolean */ - public static boolean isSoftKeyboardVisible(View parentView){ + public static boolean isSoftKeyboardVisible(View parentView) { //Arbitrary keyboard height final int defaultKeyboardHeightDP = 100; final int EstimatedKeyboardDP = defaultKeyboardHeightDP + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 48 : 0); -- cgit v1.2.3 From 7a59c808a34b7fe472cc681065154bba2098ae2d Mon Sep 17 00:00:00 2001 From: drhaal Date: Thu, 10 Jun 2021 20:46:56 +0200 Subject: check for nulls + use proper keyboard detection on API 30+ --- .../owncloud/notes/shared/util/DisplayUtils.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java index 297c843c..ffea98b1 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java @@ -11,11 +11,14 @@ import android.text.TextUtils; import android.text.style.MetricAffectingSpan; import android.util.TypedValue; import android.view.View; +import android.view.WindowInsets; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import java.util.Collection; import java.util.List; @@ -58,12 +61,21 @@ public class DisplayUtils { } /** - * Android does not provide a way to get keyboard visibility prior to API 30 so we use a workaround + * Detect if the soft keyboard is open. + * On API prior to 30 we fall back to workaround which might be less reliable * * @param parentView View * @return keyboardVisibility Boolean */ - public static boolean isSoftKeyboardVisible(View parentView) { + public static boolean isSoftKeyboardVisible(@NonNull View parentView) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + WindowInsetsCompat insets = ViewCompat.getRootWindowInsets(parentView); + if(insets != null){ + return insets.isVisible(WindowInsets.Type.ime()); + } + } + //Fall Back to workaround + //Arbitrary keyboard height final int defaultKeyboardHeightDP = 100; final int EstimatedKeyboardDP = defaultKeyboardHeightDP + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 48 : 0); -- cgit v1.2.3 From 35605e4a0ae0dd27adeceec568183ca728d5d428 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Thu, 17 Jun 2021 16:30:59 +0200 Subject: Minor code improvements Signed-off-by: Stefan Niedermann --- .../owncloud/notes/shared/util/DisplayUtils.java | 23 ++++------------------ 1 file changed, 4 insertions(+), 19 deletions(-) (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java index ffea98b1..06cbf57d 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java @@ -2,34 +2,21 @@ package it.niedermann.owncloud.notes.shared.util; import android.content.Context; import android.content.res.Resources; -import android.graphics.Color; import android.graphics.Rect; import android.os.Build; -import android.text.Spannable; -import android.text.TextPaint; -import android.text.TextUtils; -import android.text.style.MetricAffectingSpan; import android.util.TypedValue; import android.view.View; import android.view.WindowInsets; -import androidx.annotation.ColorInt; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import java.util.Collection; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import java.util.stream.Collectors; -import it.niedermann.android.util.ColorUtil; -import it.niedermann.owncloud.notes.NotesApplication; import it.niedermann.owncloud.notes.R; -import it.niedermann.owncloud.notes.branding.BrandingUtil; import it.niedermann.owncloud.notes.main.navigation.NavigationAdapter; import it.niedermann.owncloud.notes.main.navigation.NavigationItem; import it.niedermann.owncloud.notes.persistence.entity.CategoryWithNotesCount; @@ -69,21 +56,19 @@ public class DisplayUtils { */ public static boolean isSoftKeyboardVisible(@NonNull View parentView) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - WindowInsetsCompat insets = ViewCompat.getRootWindowInsets(parentView); - if(insets != null){ + final WindowInsetsCompat insets = ViewCompat.getRootWindowInsets(parentView); + if (insets != null) { return insets.isVisible(WindowInsets.Type.ime()); } } - //Fall Back to workaround //Arbitrary keyboard height final int defaultKeyboardHeightDP = 100; final int EstimatedKeyboardDP = defaultKeyboardHeightDP + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 48 : 0); final Rect rect = new Rect(); - - int estimatedKeyboardHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, EstimatedKeyboardDP, parentView.getResources().getDisplayMetrics()); + final int estimatedKeyboardHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, EstimatedKeyboardDP, parentView.getResources().getDisplayMetrics()); parentView.getWindowVisibleDisplayFrame(rect); - int heightDiff = parentView.getRootView().getHeight() - (rect.bottom - rect.top); + final int heightDiff = parentView.getRootView().getHeight() - (rect.bottom - rect.top); return heightDiff >= estimatedKeyboardHeight; } } -- cgit v1.2.3