Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-notes.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Niedermann <info@niedermann.it>2021-06-28 11:06:50 +0300
committerStefan Niedermann <info@niedermann.it>2021-06-28 11:06:50 +0300
commit9fe1b079efa58a822c3432859abbc9565739543b (patch)
tree7dd87a5a9b838832374084d20770d20b2d4ff3d5 /app/src/main/java/it/niedermann/owncloud/notes/shared
parent0d1136aad3cae384e7a9c636f79e4d121b28dd89 (diff)
parent7c5cb1b2552ee711eeaec98e3e8928e8e033cb0a (diff)
Merge branch 'master' into 916-settings
# Conflicts: # app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java # app/src/main/java/it/niedermann/owncloud/notes/shared/model/ApiVersion.java # app/src/main/res/values/strings.xml
Diffstat (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared')
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/account/AccountChooserViewHolder.java2
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/model/ApiVersion.java7
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java86
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/model/CategorySortingMethod.java8
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java30
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsUser.java16
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java105
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/CustomAppGlideModule.java19
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/DatabaseIndexUtil.java41
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/DeviceCredentialUtil.java2
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java47
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java4
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java1
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/SSOUtil.java2
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/ShareUtil.java5
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java2
16 files changed, 224 insertions, 153 deletions
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/ApiVersion.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/ApiVersion.java
index ee2fdc3a..589f2571 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
@@ -42,10 +42,6 @@ public class ApiVersion implements Comparable<ApiVersion> {
return minor;
}
- public String getOriginalVersion() {
- return originalVersion;
- }
-
public static ApiVersion of(String versionString) {
int major = 0, minor = 0;
if (versionString != null) {
@@ -90,6 +86,9 @@ public class ApiVersion implements Comparable<ApiVersion> {
// return getMajor() >= 1 && getMinor() >= 2;
}
+ /**
+ * Checks only the <strong>{@link #major}</strong> version.
+ */
@Override
public boolean equals(Object o) {
if (this == o) return true;
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..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,103 +1,21 @@
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;
+ private int color = -16743735; // #0082C9
@ColorInt
- private int textColor = -16777216;
+ private int textColor = Color.WHITE;
@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/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)
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..0fea9a92
--- /dev/null
+++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java
@@ -0,0 +1,30 @@
+package it.niedermann.owncloud.notes.shared.model;
+
+import com.google.gson.annotations.Expose;
+
+/**
+ * <a href="https://www.open-collaboration-services.org/">OpenCollaborationServices</a>
+ *
+ * @param <T> defines the payload of this {@link OcsResponse}.
+ */
+public class OcsResponse<T> {
+
+ @Expose
+ public OcsWrapper<T> ocs;
+
+ public static class OcsWrapper<T> {
+ @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/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 <code><a href="https://docs.nextcloud.com/server/latest/developer_manual/client_apis/OCS/ocs-api-overview.html?highlight=ocs#user-metadata">OcsUser</a></code>
+ */
+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/util/ApiVersionUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java
new file mode 100644
index 00000000..57788472
--- /dev/null
+++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ApiVersionUtil.java
@@ -0,0 +1,105 @@
+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 ApiVersionUtil() {
+ throw new UnsupportedOperationException("Do not instantiate this util class.");
+ }
+
+ /**
+ * @return a {@link Collection} of all valid {@link ApiVersion}s which have been found in {@param raw}.
+ */
+ @NonNull
+ public static Collection<ApiVersion> 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<ApiVersion> 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 <code>null</code>.
+ */
+ @Nullable
+ public static String serialize(@Nullable Collection<ApiVersion> 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 <code>null</code> 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);
+ }
+}
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
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));
- }
- }
- }
- }
-}
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..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,27 +2,21 @@ package it.niedermann.owncloud.notes.shared.util;
import android.content.Context;
import android.content.res.Resources;
-import android.graphics.Color;
-import android.text.Spannable;
-import android.text.TextPaint;
-import android.text.TextUtils;
-import android.text.style.MetricAffectingSpan;
+import android.graphics.Rect;
+import android.os.Build;
+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;
@@ -30,7 +24,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<NavigationItem.CategoryNavigationItem> convertToCategoryNavigationItem(@NonNull Context context, @NonNull Collection<CategoryWithNotesCount> counter) {
@@ -52,4 +46,29 @@ public class DisplayUtils {
}
return new NavigationItem.CategoryNavigationItem("category:" + counter.getCategory(), counter.getCategory(), counter.getTotalNotes(), icon, counter.getAccountId(), counter.getCategory());
}
+
+ /**
+ * 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(@NonNull View parentView) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ final WindowInsetsCompat insets = ViewCompat.getRootWindowInsets(parentView);
+ if (insets != null) {
+ return insets.isVisible(WindowInsets.Type.ime());
+ }
+ }
+
+ //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();
+ final int estimatedKeyboardHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, EstimatedKeyboardDP, parentView.getResources().getDisplayMetrics());
+ parentView.getWindowVisibleDisplayFrame(rect);
+ final int heightDiff = parentView.getRootView().getHeight() - (rect.bottom - rect.top);
+ return heightDiff >= estimatedKeyboardHeight;
+ }
}
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..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
@@ -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.");
}
/**
@@ -117,7 +117,7 @@ public class NoteUtil {
line = removeMarkdown(lines[currentLine]);
}
} else {
- line = content;
+ line = removeMarkdown(content);
}
return line;
}
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<ColorPair, Boolean> 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.");
}
/**