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

github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com>2020-10-03 23:47:12 +0300
committerGitHub <noreply@github.com>2020-10-03 23:47:12 +0300
commit04d85196c4dc37b5ab237191d9f73792fb33a484 (patch)
treec1fd5e6e10034b335b35680c4d517369a7e2234f /app/src/main
parent8e0b4546aa33b3215a394e55a8fbee33f72621fb (diff)
🎨 Store colors as integer in database (#603)
* #556 Store colors as integer in database - UI should only use @ColorInt from model * Merge master Signed-off-by: Stefan Niedermann <info@niedermann.it> * #556 Store colors as integer in database Signed-off-by: Stefan Niedermann <info@niedermann.it> * #556 Store colors as integer in database Signed-off-by: Stefan Niedermann <info@niedermann.it> * merged into branch Co-authored-by: desperateCoder <echotodevnull@gmail.com>
Diffstat (limited to 'app/src/main')
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/api/JsonToEntityParser.java22
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/model/Account.java48
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/model/Board.java20
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/model/Label.java35
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Capabilities.java12
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java17
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java112
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java2
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/PickStackActivity.java2
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/PushNotificationActivity.java3
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/archivedboards/ArchivedBoardViewHolder.java2
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java2
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java5
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/board/accesscontrol/AccessControlAdapter.java7
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/EditLabelDialogFragment.java5
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/ManageLabelsDialogFragment.java3
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/ManageLabelsViewHolder.java3
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandedDeleteAlertDialogBuilder.java3
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandingUtil.java4
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/card/EditActivity.java3
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/card/LabelAutoCompleteAdapter.java5
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java3
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterLabelsAdapter.java3
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/BoardAdapter.java2
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/PrepareCreateActivity.java3
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/view/OverlappingAvatars.java6
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/view/labelchip/LabelChip.java3
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/stack/StackWidgetFactory.java4
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/util/DrawerMenuUtil.java2
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/util/ViewUtil.java8
30 files changed, 248 insertions, 101 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/api/JsonToEntityParser.java b/app/src/main/java/it/niedermann/nextcloud/deck/api/JsonToEntityParser.java
index ebd66a8fa..6a51d226f 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/api/JsonToEntityParser.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/api/JsonToEntityParser.java
@@ -1,5 +1,7 @@
package it.niedermann.nextcloud.deck.api;
+import android.graphics.Color;
+
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@@ -37,6 +39,7 @@ import it.niedermann.nextcloud.deck.model.ocs.projects.OcsProjectResource;
import it.niedermann.nextcloud.deck.model.ocs.user.GroupMemberUIDs;
import it.niedermann.nextcloud.deck.model.ocs.user.OcsUser;
import it.niedermann.nextcloud.deck.model.ocs.user.OcsUserList;
+import it.niedermann.nextcloud.deck.util.ColorUtil;
import static it.niedermann.nextcloud.deck.exceptions.DeckException.Hint.CAPABILITIES_VERSION_NOT_PARSABLE;
import static it.niedermann.nextcloud.deck.exceptions.TraceableException.makeTraceableIfFails;
@@ -543,8 +546,8 @@ public class JsonToEntityParser {
}
if (caps.has("theming")) {
JsonObject theming = caps.getAsJsonObject("theming");
- capabilities.setColor(theming.get("color").getAsString());
- capabilities.setTextColor(theming.get("color-text").getAsString());
+ capabilities.setColor(getColorAsInt(theming, "color"));
+ capabilities.setTextColor(getColorAsInt(theming, "color-text"));
}
}
capabilities.setDeckVersion(Version.of(version));
@@ -553,6 +556,19 @@ public class JsonToEntityParser {
return capabilities;
}
+ private static int getColorAsInt(JsonObject element, String field) {
+ String rawString = getNullAsEmptyString(element.get(field));
+ try {
+ if (!rawString.trim().isEmpty()) {
+ String colorAsString = ColorUtil.formatColorToParsableHexString(rawString);
+ return Color.parseColor(colorAsString);
+ }
+ } catch (Exception e) {
+ // Do mostly nothing, return default value
+ }
+ return Color.parseColor("#757575");
+ }
+
protected static List<Activity> parseActivity(JsonObject e) {
DeckLog.verbose(e.toString());
List<Activity> activityList = new ArrayList<>();
@@ -617,7 +633,7 @@ public class JsonToEntityParser {
//todo: last modified!
// label.setLastModified(get);
label.setTitle(getNullAsEmptyString(e.get("title")));
- label.setColor(getNullAsEmptyString(e.get("color")));
+ label.setColor(getColorAsInt(e, "color"));
}, e);
return label;
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/Account.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/Account.java
index 991a1d495..1c189d162 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/model/Account.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/Account.java
@@ -2,6 +2,7 @@ package it.niedermann.nextcloud.deck.model;
import android.net.Uri;
+import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Px;
import androidx.room.ColumnInfo;
@@ -18,7 +19,6 @@ import it.niedermann.nextcloud.deck.DeckLog;
import it.niedermann.nextcloud.deck.model.ocs.Capabilities;
import it.niedermann.nextcloud.deck.model.ocs.Version;
import it.niedermann.nextcloud.deck.ui.accountswitcher.AccountSwitcherDialog;
-import it.niedermann.nextcloud.deck.util.ColorUtil;
@Entity(indices = {@Index(value = "name", unique = true)})
public class Account implements Serializable {
@@ -38,12 +38,12 @@ public class Account implements Serializable {
private String url;
@NonNull
- @ColumnInfo(defaultValue = "#0082c9")
- private String color = "#0082c9";
+ @ColumnInfo(defaultValue = "0")
+ private Integer color = 0;
@NonNull
- @ColumnInfo(defaultValue = "#ffffff")
- private String textColor = "#ffffff";
+ @ColumnInfo(defaultValue = "0")
+ private Integer textColor = 0;
@NonNull
@ColumnInfo(defaultValue = "0.6.4")
@@ -62,7 +62,7 @@ public class Account implements Serializable {
}
@Ignore
- public Account(String name, String userName, String url) {
+ public Account(@NonNull String name, @NonNull String userName, @NonNull String url) {
this.name = name;
this.userName = userName;
this.url = url;
@@ -86,12 +86,12 @@ public class Account implements Serializable {
try {
// Nextcloud might return color format #000 which cannot be parsed by Color.parseColor()
// https://github.com/stefan-niedermann/nextcloud-deck/issues/466
- color = ColorUtil.formatColorToParsableHexString(capabilities.getColor());
- textColor = ColorUtil.formatColorToParsableHexString(capabilities.getTextColor());
+ color = capabilities.getColor();
+ textColor = capabilities.getTextColor();
} catch (Exception e) {
DeckLog.logError(e);
- color = "#0082c9";
- color = "#ffffff";
+ color = 0;
+ color = 0;
}
if (capabilities.getDeckVersion() != null) {
serverDeckVersion = capabilities.getDeckVersion().getOriginalVersion();
@@ -141,21 +141,23 @@ public class Account implements Serializable {
return serialVersionUID;
}
+ @ColorInt
@NonNull
- public String getColor() {
+ public Integer getColor() {
return color;
}
- public void setColor(@NonNull String color) {
+ public void setColor(@NonNull Integer color) {
this.color = color;
}
@NonNull
- public String getTextColor() {
+ public Integer getTextColor() {
return textColor;
}
- public void setTextColor(@NonNull String textColor) {
+ @Deprecated
+ public void setTextColor(@NonNull Integer textColor) {
this.textColor = textColor;
}
@@ -188,6 +190,15 @@ public class Account implements Serializable {
this.etag = etag;
}
+ /**
+ * A cache buster parameter is added for duplicate account names on different hosts which shall be fetched from the same {@link SingleSignOnAccount} (e. g. {@link AccountSwitcherDialog})
+ *
+ * @return an {@link String} to fetch the avatar for this account.
+ */
+ public String getAvatarUrl(@Px int size) {
+ return getUrl() + "/index.php/avatar/" + Uri.encode(getUserName()) + "/" + size;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -206,15 +217,6 @@ public class Account implements Serializable {
return etag != null ? etag.equals(account.etag) : account.etag == null;
}
- /**
- * A cache buster parameter is added for duplicate account names on different hosts which shall be fetched from the same {@link SingleSignOnAccount} (e. g. {@link AccountSwitcherDialog})
- *
- * @return an {@link String} to fetch the avatar for this account.
- */
- public String getAvatarUrl(@Px int size) {
- return getUrl() + "/index.php/avatar/" + Uri.encode(getUserName()) + "/" + size;
- }
-
@Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/Board.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/Board.java
index 29afe844b..fa69e425e 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/model/Board.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/Board.java
@@ -1,5 +1,8 @@
package it.niedermann.nextcloud.deck.model;
+import android.graphics.Color;
+
+import androidx.annotation.ColorInt;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import androidx.room.Ignore;
@@ -38,10 +41,7 @@ public class Board extends AbstractRemoteEntity implements Serializable {
private String title;
private long ownerId;
- /**
- * Deck App sends color strings without leading # character
- */
- private String color;
+ private Integer color;
private boolean archived;
private int shared;
private Date deletedAt;
@@ -79,21 +79,27 @@ public class Board extends AbstractRemoteEntity implements Serializable {
this.id = id;
}
- public String getColor() {
+ @ColorInt
+ public Integer getColor() {
return color;
}
+
public void setColor(String color) {
try {
// Nextcloud might return color format #000 which cannot be parsed by Color.parseColor()
// https://github.com/stefan-niedermann/nextcloud-deck/issues/466
- this.color = ColorUtil.formatColorToParsableHexString(color).substring(1);
+ this.color = Color.parseColor(ColorUtil.formatColorToParsableHexString(color));
} catch (Exception e) {
DeckLog.logError(e);
- this.color = "757575";
+ this.color = 0;
}
}
+ public void setColor(Integer color) {
+ this.color = color;
+ }
+
public boolean isArchived() {
return archived;
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/Label.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/Label.java
index 0d97ce5a0..34e05d639 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/model/Label.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/Label.java
@@ -1,5 +1,8 @@
package it.niedermann.nextcloud.deck.model;
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import androidx.room.Index;
@@ -11,17 +14,20 @@ import it.niedermann.nextcloud.deck.model.interfaces.AbstractRemoteEntity;
@Entity(inheritSuperIndices = true,
indices = {@Index("boardId"), @Index(value = {"boardId", "title"}, unique = true, name = "idx_label_title_unique")},
foreignKeys = {
- @ForeignKey(
- entity = Board.class,
- parentColumns = "localId",
- childColumns = "boardId",
- onDelete = ForeignKey.CASCADE
- )
- }
+ @ForeignKey(
+ entity = Board.class,
+ parentColumns = "localId",
+ childColumns = "boardId",
+ onDelete = ForeignKey.CASCADE
+ )
+ }
)
public class Label extends AbstractRemoteEntity implements Serializable {
private String title;
- private String color;
+
+ @NonNull
+ @ColumnInfo(defaultValue = "0")
+ private Integer color;
private long boardId;
public Label() {
@@ -42,11 +48,12 @@ public class Label extends AbstractRemoteEntity implements Serializable {
this.title = title;
}
- public String getColor() {
+ @ColorInt
+ public Integer getColor() {
return color;
}
- public void setColor(String color) {
+ public void setColor(Integer color) {
this.color = color;
}
@@ -62,18 +69,20 @@ public class Label extends AbstractRemoteEntity implements Serializable {
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
Label label = (Label) o;
if (boardId != label.boardId) return false;
if (title != null ? !title.equals(label.title) : label.title != null) return false;
- return color != null ? color.equals(label.color) : label.color == null;
+ return color.equals(label.color);
}
@Override
public int hashCode() {
- int result = title != null ? title.hashCode() : 0;
- result = 31 * result + (color != null ? color.hashCode() : 0);
+ int result = super.hashCode();
+ result = 31 * result + (title != null ? title.hashCode() : 0);
+ result = 31 * result + color.hashCode();
result = 31 * result + (int) (boardId ^ (boardId >>> 32));
return result;
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Capabilities.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Capabilities.java
index 9ff4d7945..12e8692d4 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Capabilities.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Capabilities.java
@@ -5,8 +5,8 @@ public class Capabilities {
private Version deckVersion;
private Version nextcloudVersion;
- private String color = "#0082c9";
- private String textColor = "#ffffff";
+ private int color = 0;
+ private int textColor = 0;
private boolean maintenanceEnabled = false;
public Capabilities() {
@@ -28,19 +28,19 @@ public class Capabilities {
this.nextcloudVersion = nextcloudVersion;
}
- public String getColor() {
+ public int getColor() {
return color;
}
- public void setColor(String color) {
+ public void setColor(int color) {
this.color = color;
}
- public String getTextColor() {
+ public int getTextColor() {
return textColor;
}
- public void setTextColor(String textColor) {
+ public void setTextColor(int textColor) {
this.textColor = textColor;
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java
index f1b0657c1..fdcddc2da 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java
@@ -5,6 +5,7 @@ import android.content.Context;
import android.database.sqlite.SQLiteConstraintException;
import androidx.annotation.AnyThread;
+import androidx.annotation.ColorInt;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -556,20 +557,21 @@ public class SyncManager {
/**
* Creates a new {@link Board} and adds the same {@link Label} and {@link Stack} as in the origin {@link Board}.
* Owner of the target {@link Board} will be the {@link User} with the {@link Account} of {@param targetAccountId}.
- * @param cloneCards determines whether or not the cards in this {@link Board} shall be cloned or not
- * Does <strong>not</strong> clone any {@link Card} or {@link AccessControl} from the origin {@link Board}.
*
- * TODO implement https://github.com/stefan-niedermann/nextcloud-deck/issues/608
+ * @param cloneCards determines whether or not the cards in this {@link Board} shall be cloned or not
+ * Does <strong>not</strong> clone any {@link Card} or {@link AccessControl} from the origin {@link Board}.
+ * <p>
+ * TODO implement https://github.com/stefan-niedermann/nextcloud-deck/issues/608
*/
@AnyThread
- public WrappedLiveData<FullBoard> cloneBoard(long originAccountId, long originBoardLocalId, long targetAccountId, String targetBoardColor, boolean cloneCards) {
+ public WrappedLiveData<FullBoard> cloneBoard(long originAccountId, long originBoardLocalId, long targetAccountId, @ColorInt int targetBoardColor, boolean cloneCards) {
final WrappedLiveData<FullBoard> liveData = new WrappedLiveData<>();
doAsync(() -> {
Account originAccount = dataBaseAdapter.getAccountByIdDirectly(originAccountId);
User newOwner = dataBaseAdapter.getUserByUidDirectly(originAccountId, originAccount.getUserName());
if (newOwner == null) {
- liveData.postError(new DeckException(DeckException.Hint.UNKNOWN_ACCOUNT_USER_ID, "User with Account-UID \""+originAccount.getUserName()+"\" not found."));
+ liveData.postError(new DeckException(DeckException.Hint.UNKNOWN_ACCOUNT_USER_ID, "User with Account-UID \"" + originAccount.getUserName() + "\" not found."));
return;
}
FullBoard originalBoard = dataBaseAdapter.getFullBoardByLocalIdDirectly(originAccountId, originBoardLocalId);
@@ -600,7 +602,7 @@ public class SyncManager {
originalBoard.setId(null);
originalBoard.setLocalId(null);
originalBoard.getBoard().setTitle(newBoardTitle);
- originalBoard.getBoard().setColor(targetBoardColor);
+ originalBoard.getBoard().setColor(String.format("%06X", 0xFFFFFF & targetBoardColor));
originalBoard.getBoard().setOwnerId(newOwner.getLocalId());
originalBoard.setStatusEnum(DBStatus.LOCAL_EDITED);
originalBoard.setOwner(newOwner);
@@ -657,7 +659,8 @@ public class SyncManager {
Long newLabelId = oldToNewLabelIdsDictionary.get(oldLabel.getLocalId());
if (newLabelId != null) {
dataBaseAdapter.createJoinCardWithLabel(newLabelId, createdCardId, DBStatus.LOCAL_EDITED);
- } else DeckLog.error("ID of created Label is null! Skipping assignment of \"" + oldLabel.getTitle() + "\"...");
+ } else
+ DeckLog.error("ID of created Label is null! Skipping assignment of \"" + oldLabel.getTitle() + "\"...");
}
}
if (isSameAccount && oldCard.getAssignedUsers() != null) {
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java
index 3235d840e..cb8bb558f 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java
@@ -2,7 +2,9 @@ package it.niedermann.nextcloud.deck.persistence.sync.adapters.db;
import android.content.Context;
import android.database.Cursor;
+import android.graphics.Color;
+import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.preference.PreferenceManager;
import androidx.room.Database;
@@ -64,6 +66,7 @@ import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.projects.Oc
import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.projects.OcsProjectResourceDao;
import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.SingleCardWidgetModelDao;
import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.StackWidgetModelDao;
+import it.niedermann.nextcloud.deck.util.ColorUtil;
@Database(
entities = {
@@ -93,7 +96,7 @@ import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.Sta
UserInBoard.class,
},
exportSchema = false,
- version = 20
+ version = 21
)
@TypeConverters({DateTypeConverter.class})
public abstract class DeckDatabase extends RoomDatabase {
@@ -265,6 +268,112 @@ public abstract class DeckDatabase extends RoomDatabase {
}
};
+ private static final Migration MIGRATION_20_21 = new Migration(20, 21) {
+ @Override
+ public void migrate(SupportSQLiteDatabase database) {
+ // https://github.com/stefan-niedermann/nextcloud-deck/issues/556
+ String suffix = "_new";
+ {
+ String tableName = "Account";
+ database.execSQL("CREATE TABLE `"+tableName+suffix+"` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL, `userName` TEXT NOT NULL, `url` TEXT NOT NULL, " +
+ "`color` INTEGER NOT NULL DEFAULT 0, `textColor` INTEGER NOT NULL DEFAULT 0, `serverDeckVersion` TEXT NOT NULL DEFAULT '0.6.4', `maintenanceEnabled` INTEGER NOT NULL DEFAULT 0, `etag` TEXT)");
+ Cursor cursor = database.query("select * from `"+tableName+"`");
+ while (cursor.moveToNext()) {
+ String colorAsString1 = cursor.getString(4); // color
+ String colorAsString2 = cursor.getString(5); // textColor
+
+ @ColorInt Integer color1 = null;
+ @ColorInt Integer color2 = null;
+ try {
+ color1 = Color.parseColor(ColorUtil.formatColorToParsableHexString(colorAsString1));
+ color2 = Color.parseColor(ColorUtil.formatColorToParsableHexString(colorAsString2));
+ } catch (Exception e) {
+ color1 = Color.GRAY;
+ color2 = Color.GRAY;
+ }
+ database.execSQL("Insert into `"+tableName+suffix+"` VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", new Object[] {
+ cursor.getLong(0), cursor.getString(1), cursor.getString(2), cursor.getString(3),
+ color1, color2, cursor.getString(6), cursor.getInt(7), cursor.getString(8)});
+
+ }
+
+
+ database.execSQL("DROP TABLE `"+ tableName +"`");
+ database.execSQL("ALTER TABLE `"+tableName+suffix+"` RENAME TO `"+tableName+"`");
+ database.execSQL("CREATE UNIQUE INDEX `index_Account_name` ON `"+tableName+"` (`name`)");
+ database.execSQL("UPDATE SQLITE_SEQUENCE SET seq = (select max(id) from "+tableName+") WHERE name = ?", new Object[] {tableName});
+ }
+ {
+ String tableName = "Board";
+ database.execSQL("CREATE TABLE `"+tableName+suffix+"` (`localId` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `id` INTEGER, `status` INTEGER NOT NULL, " +
+ "`lastModified` INTEGER, `lastModifiedLocal` INTEGER, `title` TEXT, `ownerId` INTEGER NOT NULL, `color` INTEGER, " +
+ "`archived` INTEGER NOT NULL, `shared` INTEGER NOT NULL, `deletedAt` INTEGER, `permissionRead` INTEGER NOT NULL, " +
+ "`permissionEdit` INTEGER NOT NULL, `permissionManage` INTEGER NOT NULL, `permissionShare` INTEGER NOT NULL, " +
+ "FOREIGN KEY(`ownerId`) REFERENCES `User`(`localId`) ON UPDATE NO ACTION ON DELETE SET NULL )");
+ Cursor cursor = database.query("select * from `"+tableName+"`");
+ while (cursor.moveToNext()) {
+ String colorAsString1 = cursor.getString(8); // color
+
+ @ColorInt Integer color1 = null;
+ try {
+ color1 = Color.parseColor(ColorUtil.formatColorToParsableHexString(colorAsString1));
+ } catch (Exception e) {
+ color1 = Color.GRAY;
+ }
+ database.execSQL("Insert into `"+tableName+suffix+"` VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", new Object[] {
+ cursor.getLong(0), cursor.getLong(1), cursor.getLong(2), cursor.getInt(3),
+ cursor.getLong(4), cursor.getLong(5), cursor.getString(6), cursor.getLong(7) , color1,
+ cursor.getInt(9), cursor.getInt(10), cursor.getInt(11), cursor.getInt(12),
+ cursor.getInt(13), cursor.getInt(14), cursor.getInt(15)
+ });
+
+ }
+
+
+ database.execSQL("DROP TABLE `"+ tableName +"`");
+ database.execSQL("ALTER TABLE `"+tableName+suffix+"` RENAME TO `"+tableName+"`");
+ database.execSQL("CREATE INDEX `index_Board_accountId` ON `"+tableName+"` (`accountId`)");
+ database.execSQL("CREATE UNIQUE INDEX `index_Board_accountId_id` ON `"+tableName+"` (`accountId`, `id`)");
+ database.execSQL("CREATE INDEX `index_Board_id` ON `"+tableName+"` (`id`)");
+ database.execSQL("CREATE INDEX `index_Board_ownerId` ON `"+tableName+"` (`ownerId`)");
+ database.execSQL("CREATE INDEX `index_Board_lastModifiedLocal` ON `"+tableName+"` (`lastModifiedLocal`)");
+ database.execSQL("UPDATE SQLITE_SEQUENCE SET seq = (select max(id) from "+tableName+") WHERE name = ?", new Object[] {tableName});
+ }
+ {
+ String tableName = "Label";
+ database.execSQL("CREATE TABLE `"+tableName+suffix+"` (`localId` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `id` INTEGER, `status` INTEGER NOT NULL, " +
+ "`lastModified` INTEGER, `lastModifiedLocal` INTEGER, `title` TEXT, `color` INTEGER NOT NULL DEFAULT 0, `boardId` INTEGER NOT NULL, " +
+ "FOREIGN KEY(`boardId`) REFERENCES `Board`(`localId`) ON UPDATE NO ACTION ON DELETE CASCADE )");
+ Cursor cursor = database.query("select * from `"+tableName+"`");
+ while (cursor.moveToNext()) {
+ String colorAsString1 = cursor.getString(7); // color
+
+ @ColorInt Integer color1 = null;
+ try {
+ color1 = Color.parseColor(ColorUtil.formatColorToParsableHexString(colorAsString1));
+ } catch (Exception e) {
+ color1 = Color.GRAY;
+ }
+ database.execSQL("Insert into `"+tableName+suffix+"` VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", new Object[] {
+ cursor.getLong(0), cursor.getLong(1), cursor.getLong(2), cursor.getInt(3),
+ cursor.getLong(4), cursor.getLong(5), cursor.getString(6), color1, cursor.getLong(8)});
+
+ }
+
+
+ database.execSQL("DROP TABLE `"+ tableName +"`");
+ database.execSQL("ALTER TABLE `"+tableName+suffix+"` RENAME TO `"+tableName+"`");
+ database.execSQL("CREATE UNIQUE INDEX `index_Label_accountId_id` ON `"+tableName+"` (`accountId`, `id`)");
+ database.execSQL("CREATE INDEX `index_Label_boardId` ON `"+tableName+"` (`boardId`)");
+ database.execSQL("CREATE INDEX `index_Label_accountId` ON `"+tableName+"` (`accountId`)");
+ database.execSQL("CREATE UNIQUE INDEX `idx_label_title_unique` ON `"+tableName+"` (`boardId`, `title`)");
+ database.execSQL("CREATE INDEX `index_Label_id` ON `"+tableName+"` (`id`)");
+ database.execSQL("CREATE INDEX `index_Label_lastModifiedLocal` ON `"+tableName+"` (`lastModifiedLocal`)");
+ database.execSQL("UPDATE SQLITE_SEQUENCE SET seq = (select max(id) from "+tableName+") WHERE name = ?", new Object[] {tableName});
+ }
+ }
+ };
+
public static final RoomDatabase.Callback ON_CREATE_CALLBACK = new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
@@ -310,6 +419,7 @@ public abstract class DeckDatabase extends RoomDatabase {
.addMigrations(MIGRATION_17_18)
.addMigrations(MIGRATION_18_19)
.addMigrations(MIGRATION_19_20)
+ .addMigrations(MIGRATION_20_21)
.fallbackToDestructiveMigration()
.addCallback(ON_CREATE_CALLBACK)
.build();
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java
index 94f878a5a..f1a7ac60b 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java
@@ -541,7 +541,7 @@ public class MainActivity extends BrandedActivity implements DeleteStackListener
if (stacksLiveData != null) {
stacksLiveData.removeObservers(this);
}
- saveBrandColors(this, Color.parseColor('#' + board.getColor()));
+ saveBrandColors(this, board.getColor());
mainViewModel.setCurrentBoard(board);
filterViewModel.clearFilterInformation();
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/PickStackActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/PickStackActivity.java
index dbfecf904..b8d9946fc 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/PickStackActivity.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/PickStackActivity.java
@@ -88,7 +88,7 @@ public abstract class PickStackActivity extends AppCompatActivity implements Bra
if (board == null) {
binding.submit.setEnabled(false);
} else {
- applyBrand(Color.parseColor('#' + board.getColor()));
+ applyBrand(board.getColor());
if (stack == null) {
binding.submit.setEnabled(false);
} else {
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/PushNotificationActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/PushNotificationActivity.java
index 702f96912..cf79bf511 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/PushNotificationActivity.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/PushNotificationActivity.java
@@ -23,7 +23,6 @@ import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler;
import it.niedermann.nextcloud.deck.util.ColorUtil;
import it.niedermann.nextcloud.deck.util.ProjectUtil;
-import static android.graphics.Color.parseColor;
import static it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.LiveDataHelper.observeOnce;
public class PushNotificationActivity extends AppCompatActivity {
@@ -198,7 +197,7 @@ public class PushNotificationActivity extends AppCompatActivity {
// TODO implement Branded interface
// TODO apply branding based on board color
public void applyBrandToSubmitButton(@NonNull Account account) {
- @ColorInt final int mainColor = parseColor(account.getColor());
+ @ColorInt final int mainColor = account.getColor();
try {
binding.submit.setBackgroundColor(mainColor);
binding.submit.setTextColor(ColorUtil.getForegroundColorForBackgroundColor(mainColor));
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/archivedboards/ArchivedBoardViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/archivedboards/ArchivedBoardViewHolder.java
index 5ab94b4f6..67b2c00be 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/archivedboards/ArchivedBoardViewHolder.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/archivedboards/ArchivedBoardViewHolder.java
@@ -30,7 +30,7 @@ public class ArchivedBoardViewHolder extends RecyclerView.ViewHolder {
void bind(boolean isSupportedVersion, Board board, FragmentManager fragmentManager, Consumer<Board> dearchiveBoardListener) {
final Context context = itemView.getContext();
- binding.boardIcon.setImageDrawable(ViewUtil.getTintedImageView(binding.boardIcon.getContext(), R.drawable.circle_grey600_36dp, "#" + board.getColor()));
+ binding.boardIcon.setImageDrawable(ViewUtil.getTintedImageView(binding.boardIcon.getContext(), R.drawable.circle_grey600_36dp, String.format("#%06X", (0xFFFFFF & board.getColor()))));
binding.boardMenu.setVisibility(View.GONE);
binding.boardTitle.setText(board.getTitle());
if (isSupportedVersion) {
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java
index 7049cc16c..5975e0306 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/BoardAdapter.java
@@ -37,7 +37,7 @@ public class BoardAdapter extends ArrayAdapter<Board> {
TextView boardName = convertView.findViewById(R.id.boardName);
if (board != null) {
boardName.setText(board.getTitle());
- boardName.setCompoundDrawables(ViewUtil.getTintedImageView(context, R.drawable.circle_grey600_36dp, "#" + board.getColor()), null, null, null);
+ boardName.setCompoundDrawables(ViewUtil.getTintedImageView(context, R.drawable.circle_grey600_36dp, String.format("#%06X", (0xFFFFFF & board.getColor()))), null, null, null);
} else {
DeckLog.logError(new IllegalArgumentException("board at position " + position + "is null"));
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java
index e5d0a482b..a1aeb00d4 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/EditBoardDialogFragment.java
@@ -7,6 +7,7 @@ import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
+import androidx.core.content.ContextCompat;
import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.ViewModelProvider;
@@ -64,13 +65,13 @@ public class EditBoardDialogFragment extends BrandedDialogFragment {
String title = this.fullBoard.getBoard().getTitle();
binding.input.setText(title);
binding.input.setSelection(title.length());
- binding.colorChooser.selectColor("#" + fullBoard.getBoard().getColor());
+ binding.colorChooser.selectColor(String.format("#%06X", (0xFFFFFF & fullBoard.getBoard().getColor())));
}
});
} else {
dialogBuilder.setTitle(R.string.add_board);
dialogBuilder.setPositiveButton(R.string.simple_add, (dialog, which) -> editBoardListener.onCreateBoard(binding.input.getText().toString(), binding.colorChooser.getSelectedColor()));
- binding.colorChooser.selectColor(String.format("#%06X", 0xFFFFFF & getResources().getColor(R.color.board_default_color)));
+ binding.colorChooser.selectColor(String.format("#%06X", 0xFFFFFF & ContextCompat.getColor(requireContext(), R.color.board_default_color)));
}
return dialogBuilder
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/accesscontrol/AccessControlAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/accesscontrol/AccessControlAdapter.java
index e5a50d9f4..0a1281fae 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/accesscontrol/AccessControlAdapter.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/accesscontrol/AccessControlAdapter.java
@@ -10,6 +10,7 @@ import android.view.ViewGroup;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.SwitchCompat;
+import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.recyclerview.widget.RecyclerView;
@@ -51,7 +52,7 @@ public class AccessControlAdapter extends RecyclerView.Adapter<RecyclerView.View
this.account = account;
this.accessControlChangedListener = accessControlChangedListener;
this.context = context;
- this.mainColor = context.getResources().getColor(R.color.primary);
+ this.mainColor = ContextCompat.getColor(context, R.color.primary);
setHasStableIds(true);
}
@@ -172,9 +173,9 @@ public class AccessControlAdapter extends RecyclerView.Adapter<RecyclerView.View
final int finalMainColor = getSecondaryForegroundColorDependingOnTheme(context, mainColor);
DrawableCompat.setTintList(switchCompat.getThumbDrawable(), new ColorStateList(
new int[][]{new int[]{android.R.attr.state_checked}, new int[]{}},
- new int[]{finalMainColor, context.getResources().getColor(R.color.fg_secondary)}
+ new int[]{finalMainColor, ContextCompat.getColor(context, R.color.fg_secondary)}
));
- final int trackColor = context.getResources().getColor(R.color.fg_secondary);
+ final int trackColor = ContextCompat.getColor(context, R.color.fg_secondary);
final int lightTrackColor = Color.argb(77, Color.red(trackColor), Color.green(trackColor), Color.blue(trackColor));
final int lightTrackColorChecked = Color.argb(77, Color.red(finalMainColor), Color.green(finalMainColor), Color.blue(finalMainColor));
DrawableCompat.setTintList(switchCompat.getTrackDrawable(), new ColorStateList(
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/EditLabelDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/EditLabelDialogFragment.java
index d460d1590..9a72a0e3c 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/EditLabelDialogFragment.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/EditLabelDialogFragment.java
@@ -2,6 +2,7 @@ package it.niedermann.nextcloud.deck.ui.board.managelabels;
import android.app.Dialog;
import android.content.Context;
+import android.graphics.Color;
import android.os.Bundle;
import androidx.annotation.NonNull;
@@ -58,14 +59,14 @@ public class EditLabelDialogFragment extends BrandedDialogFragment {
dialogBuilder.setTitle(getString(R.string.edit_tag, label.getTitle()));
dialogBuilder.setPositiveButton(R.string.simple_save, (dialog, which) -> {
- this.label.setColor(binding.colorChooser.getSelectedColor().substring(1));
+ this.label.setColor(Color.parseColor(binding.colorChooser.getSelectedColor().substring(1)));
this.label.setTitle(binding.input.getText().toString());
listener.onLabelUpdated(this.label);
});
String title = this.label.getTitle();
binding.input.setText(title);
binding.input.setSelection(title.length());
- binding.colorChooser.selectColor("#" + this.label.getColor());
+ binding.colorChooser.selectColor(String.format("#%06X", (0xFFFFFF & this.label.getColor())));
return dialogBuilder
.setView(binding.getRoot())
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/ManageLabelsDialogFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/ManageLabelsDialogFragment.java
index 487ad4b4b..1295b1d01 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/ManageLabelsDialogFragment.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/ManageLabelsDialogFragment.java
@@ -3,6 +3,7 @@ package it.niedermann.nextcloud.deck.ui.board.managelabels;
import android.app.Dialog;
import android.content.Context;
import android.database.sqlite.SQLiteConstraintException;
+import android.graphics.Color;
import android.os.Bundle;
import android.widget.Toast;
@@ -80,7 +81,7 @@ public class ManageLabelsDialogFragment extends BrandedDialogFragment implements
final Label label = new Label();
label.setBoardId(boardId);
label.setTitle(binding.addLabelTitle.getText().toString());
- label.setColor(colors[new Random().nextInt(colors.length)].substring(1));
+ label.setColor(Color.parseColor(colors[new Random().nextInt(colors.length)].substring(1)));
WrappedLiveData<Label> createLiveData = syncManager.createLabel(viewModel.getCurrentAccount().getId(), label, boardId);
observeOnce(createLiveData, this, (createdLabel) -> {
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/ManageLabelsViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/ManageLabelsViewHolder.java
index 7fa3abd89..6a6ef1c05 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/ManageLabelsViewHolder.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/board/managelabels/ManageLabelsViewHolder.java
@@ -1,7 +1,6 @@
package it.niedermann.nextcloud.deck.ui.board.managelabels;
import android.content.res.ColorStateList;
-import android.graphics.Color;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
@@ -21,7 +20,7 @@ public class ManageLabelsViewHolder extends RecyclerView.ViewHolder {
public void bind(@NonNull Label label, @NonNull ManageLabelListener listener) {
binding.label.setText(label.getTitle());
- final int labelColor = Color.parseColor("#" + label.getColor());
+ final int labelColor = label.getColor();
binding.label.setChipBackgroundColor(ColorStateList.valueOf(labelColor));
final int color = ColorUtil.getForegroundColorForBackgroundColor(labelColor);
binding.label.setTextColor(color);
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandedDeleteAlertDialogBuilder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandedDeleteAlertDialogBuilder.java
index ec3cef553..d88fdd6cc 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandedDeleteAlertDialogBuilder.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandedDeleteAlertDialogBuilder.java
@@ -5,6 +5,7 @@ import android.content.DialogInterface;
import android.widget.Button;
import androidx.annotation.CallSuper;
+import androidx.core.content.ContextCompat;
import it.niedermann.nextcloud.deck.R;
@@ -20,7 +21,7 @@ public class BrandedDeleteAlertDialogBuilder extends BrandedAlertDialogBuilder {
super.applyBrand(mainColor);
final Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
if (positiveButton != null) {
- positiveButton.setTextColor(getContext().getResources().getColor(R.color.danger));
+ positiveButton.setTextColor(ContextCompat.getColor(getContext(), R.color.danger));
}
}
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandingUtil.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandingUtil.java
index 49a8bce64..11781e27b 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandingUtil.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/branding/BrandingUtil.java
@@ -44,7 +44,7 @@ public abstract class BrandingUtil {
DeckLog.log("--- Read: shared_preference_theme_main");
return sharedPreferences.getInt(context.getString(R.string.shared_preference_theme_main), context.getApplicationContext().getResources().getColor(R.color.defaultBrand));
} else {
- return context.getResources().getColor(R.color.defaultBrand);
+ return ContextCompat.getColor(context, R.color.defaultBrand);
}
}
@@ -112,7 +112,7 @@ public abstract class BrandingUtil {
finalMainColor,
finalMainColor,
finalMainColor,
- editText.getContext().getResources().getColor(R.color.fg_secondary)
+ ContextCompat.getColor(editText.getContext(), R.color.fg_secondary)
}
));
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/EditActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/EditActivity.java
index b1f20cbfd..1af96bca5 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/EditActivity.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/EditActivity.java
@@ -31,7 +31,6 @@ import it.niedermann.nextcloud.deck.ui.branding.BrandedAlertDialogBuilder;
import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler;
import it.niedermann.nextcloud.deck.util.CardUtil;
-import static android.graphics.Color.parseColor;
import static it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.LiveDataHelper.observeOnce;
import static it.niedermann.nextcloud.deck.ui.branding.BrandingUtil.applyBrandToPrimaryTabLayout;
import static it.niedermann.nextcloud.deck.ui.branding.BrandingUtil.isBrandingEnabled;
@@ -121,7 +120,7 @@ public class EditActivity extends BrandedActivity {
final long boardId = args.getLong(BUNDLE_KEY_BOARD_ID);
observeOnce(syncManager.getFullBoardById(account.getId(), boardId), EditActivity.this, (fullBoard -> {
- applyBrand(parseColor('#' + fullBoard.getBoard().getColor()));
+ applyBrand(fullBoard.getBoard().getColor());
viewModel.setCanEdit(fullBoard.getBoard().isPermissionEdit());
invalidateOptionsMenu();
if (viewModel.isCreateMode()) {
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/LabelAutoCompleteAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/LabelAutoCompleteAdapter.java
index f77282e11..0f41b581b 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/LabelAutoCompleteAdapter.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/LabelAutoCompleteAdapter.java
@@ -9,6 +9,7 @@ import android.view.ViewGroup;
import android.widget.Filter;
import androidx.activity.ComponentActivity;
+import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.graphics.drawable.DrawableCompat;
@@ -35,7 +36,7 @@ public class LabelAutoCompleteAdapter extends AutoCompleteAdapter<Label> {
public LabelAutoCompleteAdapter(@NonNull ComponentActivity activity, long accountId, long boardId, long cardId) {
super(activity, accountId, boardId, cardId);
final String[] colors = activity.getResources().getStringArray(R.array.board_default_colors);
- final String createLabelColor = colors[new Random().nextInt(colors.length)].substring(1);
+ @ColorInt int createLabelColor = Color.parseColor(colors[new Random().nextInt(colors.length)].substring(1));
observeOnce(syncManager.getFullBoardById(accountId, boardId), activity, (fullBoard) -> {
if (fullBoard.getBoard().isPermissionManage()) {
canManage = true;
@@ -59,7 +60,7 @@ public class LabelAutoCompleteAdapter extends AutoCompleteAdapter<Label> {
}
final Label label = getItem(position);
- final int labelColor = Color.parseColor("#" + label.getColor());
+ final int labelColor = label.getColor();
final int color = ColorUtil.getForegroundColorForBackgroundColor(labelColor);
binding.label.setText(label.getTitle());
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java
index 63627ac8b..d8186ce4b 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/details/CardDetailsFragment.java
@@ -2,7 +2,6 @@ package it.niedermann.nextcloud.deck.ui.card.details;
import android.content.Context;
import android.content.res.ColorStateList;
-import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Editable;
@@ -317,7 +316,7 @@ public class CardDetailsFragment extends BrandedFragment implements OnDateSetLis
});
}
try {
- final int labelColor = Color.parseColor("#" + label.getColor());
+ final int labelColor = label.getColor();
chip.setChipBackgroundColor(ColorStateList.valueOf(labelColor));
final int color = ColorUtil.getForegroundColorForBackgroundColor(labelColor);
chip.setTextColor(color);
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterLabelsAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterLabelsAdapter.java
index 93f8e837f..f72336924 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterLabelsAdapter.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/filter/FilterLabelsAdapter.java
@@ -1,7 +1,6 @@
package it.niedermann.nextcloud.deck.ui.filter;
import android.content.res.ColorStateList;
-import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.ViewGroup;
@@ -78,7 +77,7 @@ public class FilterLabelsAdapter extends RecyclerView.Adapter<FilterLabelsAdapte
void bind(final Label label) {
binding.label.setText(label.getTitle());
- final int labelColor = Color.parseColor("#" + label.getColor());
+ final int labelColor = label.getColor();
binding.label.setChipBackgroundColor(ColorStateList.valueOf(labelColor));
final int color = ColorUtil.getForegroundColorForBackgroundColor(labelColor);
binding.label.setTextColor(color);
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/BoardAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/BoardAdapter.java
index 5cda9e877..558a22db4 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/BoardAdapter.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/BoardAdapter.java
@@ -37,7 +37,7 @@ public class BoardAdapter extends AbstractAdapter<Board> {
final Board item = getItem(position);
if (item != null) {
binding.boardTitle.setText(item.getTitle());
- binding.avatar.setImageDrawable(ViewUtil.getTintedImageView(binding.avatar.getContext(), R.drawable.circle_grey600_36dp, "#" + item.getColor()));
+ binding.avatar.setImageDrawable(ViewUtil.getTintedImageView(binding.avatar.getContext(), R.drawable.circle_grey600_36dp, String.format("#%06X", (0xFFFFFF & item.getColor()))));
} else {
DeckLog.logError(new IllegalArgumentException("No item for position " + position));
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/PrepareCreateActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/PrepareCreateActivity.java
index b4e2c7de2..18317e078 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/PrepareCreateActivity.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/preparecreate/PrepareCreateActivity.java
@@ -13,7 +13,6 @@ import it.niedermann.nextcloud.deck.model.Account;
import it.niedermann.nextcloud.deck.ui.PickStackActivity;
import it.niedermann.nextcloud.deck.ui.card.EditActivity;
-import static android.graphics.Color.parseColor;
import static it.niedermann.nextcloud.deck.DeckApplication.saveCurrentAccountId;
import static it.niedermann.nextcloud.deck.DeckApplication.saveCurrentBoardId;
import static it.niedermann.nextcloud.deck.DeckApplication.saveCurrentStackId;
@@ -41,7 +40,7 @@ public class PrepareCreateActivity extends PickStackActivity {
saveCurrentAccountId(this, account.getId());
saveCurrentBoardId(this, account.getId(), boardId);
saveCurrentStackId(this, account.getId(), boardId, stackId);
- applyBrand(parseColor(account.getColor()));
+ applyBrand(account.getColor());
finish();
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/view/OverlappingAvatars.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/view/OverlappingAvatars.java
index 501d33106..611cd30b0 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/view/OverlappingAvatars.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/view/OverlappingAvatars.java
@@ -10,6 +10,7 @@ import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Px;
+import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import com.bumptech.glide.Glide;
@@ -47,8 +48,9 @@ public class OverlappingAvatars extends RelativeLayout {
avatarBorderSize = dpToPx(context, R.dimen.avatar_size_small_overlapping_border);
avatarSize = dpToPx(context, R.dimen.avatar_size_small) + avatarBorderSize * 2;
overlapPx = dpToPx(context, R.dimen.avatar_size_small_overlapping);
- borderDrawable = getResources().getDrawable(R.drawable.avatar_border);
- DrawableCompat.setTint(borderDrawable, getResources().getColor(R.color.bg_card));
+ borderDrawable = ContextCompat.getDrawable(context, R.drawable.avatar_border);
+ assert borderDrawable != null;
+ DrawableCompat.setTint(borderDrawable, ContextCompat.getColor(context, R.color.bg_card));
}
public void setAvatars(@NonNull Account account, @NonNull List<User> assignedUsers) {
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/view/labelchip/LabelChip.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/view/labelchip/LabelChip.java
index ba3331457..1853d1b88 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/view/labelchip/LabelChip.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/view/labelchip/LabelChip.java
@@ -3,7 +3,6 @@ package it.niedermann.nextcloud.deck.ui.view.labelchip;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.ColorStateList;
-import android.graphics.Color;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
@@ -42,7 +41,7 @@ public class LabelChip extends Chip {
setChipEndPadding(gutter);
try {
- int labelColor = Color.parseColor("#" + label.getColor());
+ int labelColor = label.getColor();
ColorStateList c = ColorStateList.valueOf(labelColor);
setChipBackgroundColor(c);
setTextColor(ColorUtil.getForegroundColorForBackgroundColor(labelColor));
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/stack/StackWidgetFactory.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/stack/StackWidgetFactory.java
index bc275e906..87f357e20 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/stack/StackWidgetFactory.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/stack/StackWidgetFactory.java
@@ -4,7 +4,6 @@ import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.graphics.Color;
import android.net.Uri;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
@@ -57,8 +56,7 @@ public class StackWidgetFactory implements RemoteViewsService.RemoteViewsFactory
LiveData<FullBoard> fullBoardLiveData = syncManager.getFullBoardById(accountId, stack.getStack().getBoardId());
fullBoardLiveData.observeForever((FullBoard fullBoard) -> {
if (fullBoard != null) {
- final String boardColor = fullBoard.getBoard().getColor();
- views.setInt(R.id.widget_stack_header_icon, "setColorFilter", Color.parseColor("#" + boardColor));
+ views.setInt(R.id.widget_stack_header_icon, "setColorFilter", fullBoard.getBoard().getColor());
notifyAppWidgetUpdate(views);
}
});
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/DrawerMenuUtil.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/DrawerMenuUtil.java
index 3ee5bbe74..1f6490bf2 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/util/DrawerMenuUtil.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/DrawerMenuUtil.java
@@ -38,7 +38,7 @@ public class DrawerMenuUtil {
SubMenu boardsMenu = menu.addSubMenu(R.string.simple_boards);
int index = 0;
for (Board board : boards) {
- MenuItem m = boardsMenu.add(Menu.NONE, index++, Menu.NONE, board.getTitle()).setIcon(ViewUtil.getTintedImageView(context, R.drawable.circle_grey600_36dp, "#" + board.getColor()));
+ MenuItem m = boardsMenu.add(Menu.NONE, index++, Menu.NONE, board.getTitle()).setIcon(ViewUtil.getTintedImageView(context, R.drawable.circle_grey600_36dp, String.format("#%06X", (0xFFFFFF & board.getColor()))));
if (currentServerVersionIsSupported) {
if (board.isPermissionManage()) {
AppCompatImageButton contextMenu = new AppCompatImageButton(context);
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/ViewUtil.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/ViewUtil.java
index 6abbde557..2d6493624 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/util/ViewUtil.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/ViewUtil.java
@@ -16,6 +16,7 @@ import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Px;
+import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.widget.TextViewCompat;
@@ -69,12 +70,13 @@ public final class ViewUtil {
}
cardDueDate.setBackgroundResource(backgroundDrawable);
- cardDueDate.setTextColor(context.getResources().getColor(textColor));
- TextViewCompat.setCompoundDrawableTintList(cardDueDate, ColorStateList.valueOf(context.getResources().getColor(textColor)));
+ cardDueDate.setTextColor(ContextCompat.getColor(context, textColor));
+ TextViewCompat.setCompoundDrawableTintList(cardDueDate, ColorStateList.valueOf(ContextCompat.getColor(context, textColor)));
}
public static Drawable getTintedImageView(@NonNull Context context, @DrawableRes int imageId, @NonNull String color) {
- final Drawable drawable = context.getResources().getDrawable(imageId);
+ final Drawable drawable = ContextCompat.getDrawable(context, imageId);
+ assert drawable != null;
final Drawable wrapped = DrawableCompat.wrap(drawable).mutate();
DrawableCompat.setTint(wrapped, Color.parseColor(color));
return drawable;