diff options
author | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2020-10-03 23:47:12 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-03 23:47:12 +0300 |
commit | 04d85196c4dc37b5ab237191d9f73792fb33a484 (patch) | |
tree | c1fd5e6e10034b335b35680c4d517369a7e2234f /app/src/main | |
parent | 8e0b4546aa33b3215a394e55a8fbee33f72621fb (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')
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; |