diff options
author | desperateCoder <echotodevnull@gmail.com> | 2020-11-21 18:55:19 +0300 |
---|---|---|
committer | desperateCoder <echotodevnull@gmail.com> | 2020-11-21 18:55:19 +0300 |
commit | 365bf07399aa0e5fdfb8db13903b28fc5bdd56cd (patch) | |
tree | 02ea6baf2c53dfc1696fba1a33be1fb5c15f5ed4 /app | |
parent | d235ae16f1e582fc21a8631ccb3ecd840fba13b4 (diff) | |
parent | b182b1a12101166de1658a7a91c7036c857cd01c (diff) |
Merge branch 'master' of github.com:stefan-niedermann/nextcloud-deck
Diffstat (limited to 'app')
12 files changed, 95 insertions, 36 deletions
diff --git a/app/build.gradle b/app/build.gradle index 99814978e..bf04a2feb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -105,7 +105,7 @@ dependencies { // --- Backend-Libraries --- // ------------------------- - implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.4.10' + implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.4.20' // Room components implementation "androidx.room:room-runtime:$rootProject.roomVersion" diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/activities/CardActivityViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/activities/CardActivityViewHolder.java index f8d237ad4..6362f90dd 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/activities/CardActivityViewHolder.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/activities/CardActivityViewHolder.java @@ -3,6 +3,7 @@ package it.niedermann.nextcloud.deck.ui.card.activities; import android.content.Context; import android.view.MenuInflater; import android.view.View; +import android.widget.ImageView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; @@ -13,6 +14,7 @@ import it.niedermann.nextcloud.deck.databinding.ItemActivityBinding; import it.niedermann.nextcloud.deck.model.enums.ActivityType; import it.niedermann.nextcloud.deck.model.ocs.Activity; import it.niedermann.nextcloud.deck.util.DateUtil; +import it.niedermann.nextcloud.deck.util.ViewUtil; public class CardActivityViewHolder extends RecyclerView.ViewHolder { public ItemActivityBinding binding; @@ -32,31 +34,54 @@ public class CardActivityViewHolder extends RecyclerView.ViewHolder { inflater.inflate(R.menu.activity_menu, menu); menu.findItem(android.R.id.copy).setOnMenuItemClickListener(item -> ClipboardUtil.INSTANCE.copyToClipboard(context, activity.getSubject())); }); - switch (ActivityType.findById(activity.getType())) { + final ActivityType type = ActivityType.findById(activity.getType()); + setImageResource(binding.type, type); + setImageColor(context, binding.type, type); + } + + private static void setImageResource(@NonNull ImageView imageView, @NonNull ActivityType type) { + switch (type) { case CHANGE: - binding.type.setImageResource(R.drawable.type_change_36dp); + imageView.setImageResource(R.drawable.type_change_36dp); break; case ADD: - binding.type.setImageResource(R.drawable.type_add_color_36dp); + imageView.setImageResource(R.drawable.type_add_color_36dp); break; case DELETE: - binding.type.setImageResource(R.drawable.type_delete_color_36dp); + imageView.setImageResource(R.drawable.type_delete_color_36dp); break; case ARCHIVE: - binding.type.setImageResource(R.drawable.type_archive_grey600_36dp); + imageView.setImageResource(R.drawable.type_archive_grey600_36dp); break; case TAGGED_WITH_LABEL: - binding.type.setImageResource(R.drawable.type_label_grey600_36dp); + imageView.setImageResource(R.drawable.type_label_grey600_36dp); break; case COMMENT: - binding.type.setImageResource(R.drawable.type_comment_grey600_36dp); + imageView.setImageResource(R.drawable.type_comment_grey600_36dp); break; case FILES: - binding.type.setImageResource(R.drawable.type_file_36dp); + imageView.setImageResource(R.drawable.type_file_36dp); + break; case HISTORY: - binding.type.setImageResource(R.drawable.type_history_36dp); + imageView.setImageResource(R.drawable.type_history_36dp); + break; case DECK: default: + imageView.setImageResource(R.drawable.ic_app_logo); + break; + } + } + + private static void setImageColor(@NonNull Context context, @NonNull ImageView imageView, @NonNull ActivityType type) { + switch (type) { + case ADD: + ViewUtil.setImageColor(context, imageView, R.color.activity_create); + break; + case DELETE: + ViewUtil.setImageColor(context, imageView, R.color.activity_delete); + break; + default: + ViewUtil.setImageColor(context, imageView, R.color.grey600); break; } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java index bb42f27ef..81a166cb6 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/CardAttachmentsFragment.java @@ -233,9 +233,9 @@ public class CardAttachmentsFragment extends BrandedFragment implements Attachme binding.emptyContentView.hideDescription(); } @Nullable Context context = requireContext(); - if (isBrandingEnabled(context)) { - applyBrand(readBrandMainColor(context)); - } + applyBrand(isBrandingEnabled(context) + ? readBrandMainColor(context) + : ContextCompat.getColor(context, R.color.defaultBrand)); return binding.getRoot(); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/stack/StackWidgetConfigurationActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/stack/StackWidgetConfigurationActivity.java index 6b86b50ba..771feabc2 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/stack/StackWidgetConfigurationActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/stack/StackWidgetConfigurationActivity.java @@ -7,6 +7,7 @@ import android.os.Bundle; import androidx.appcompat.app.ActionBar; import it.niedermann.nextcloud.deck.DeckLog; +import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.ui.PickStackActivity; @@ -18,7 +19,7 @@ public class StackWidgetConfigurationActivity extends PickStackActivity { super.onCreate(savedInstanceState); final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { - actionBar.setTitle("Add stack widget"); + actionBar.setTitle(R.string.add_stack_widget); } setResult(RESULT_CANCELED); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/ProjectUtil.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/ProjectUtil.java index 015241eef..f43f7d824 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/util/ProjectUtil.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/ProjectUtil.java @@ -46,11 +46,14 @@ public class ProjectUtil { throw new IllegalArgumentException("provided url is null"); } url = url.trim(); + if (url.length() == 0) { + throw new IllegalArgumentException("trimmed url is empty"); + } // extract important part - String[] splitByPrefix = url.split(".*index\\.php/apps/deck/#/board/"); + String[] splitByPrefix = url.split(".*index\\.php/apps/deck(/#)?/board/"); // split into board- and card part if (splitByPrefix.length < 2) { - throw new IllegalArgumentException("this doesn't seem to be an URL containing the board ID"); + throw new IllegalArgumentException("This URL doesn't seem to be an URL containing the boardId: \"" + url + "\""); } String[] splitBySeparator = splitByPrefix[1].split("/card/"); @@ -63,13 +66,13 @@ public class ProjectUtil { } if (splitBySeparator.length < 1) { - throw new IllegalArgumentException("this doesn't seem to be a valid URL containing the board ID"); + throw new IllegalArgumentException("This URL doesn't seem to be an URL containing the boardId: \"" + url + "\""); } // return result long boardId = Long.parseLong(splitBySeparator[0]); if (boardId < 1) { - throw new IllegalArgumentException("invalid boardId: "+boardId); + throw new IllegalArgumentException("Invalid boardId \"" + boardId + "\" for url \"" + url + "\"."); } if (splitBySeparator.length == 1) { return new long[]{boardId}; @@ -81,7 +84,7 @@ public class ProjectUtil { return new long[]{boardId}; } } else { - throw new IllegalArgumentException("could not parse URL for board- and/or card-ID"); + throw new IllegalArgumentException("could not parse URL for boardId and/or cardId: \"" + url + "\""); } } } 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 b676fcedb..4ae39f787 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 @@ -12,6 +12,7 @@ import android.text.style.ImageSpan; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.ColorRes; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -33,6 +34,8 @@ import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.ocs.comment.Mention; +import static android.os.Build.VERSION.SDK_INT; +import static android.os.Build.VERSION_CODES.LOLLIPOP; import static it.niedermann.nextcloud.deck.DeckApplication.isDarkTheme; import static java.time.temporal.ChronoUnit.DAYS; @@ -140,4 +143,12 @@ public final class ViewUtil { } textView.setText(messageBuilder); } + + public static void setImageColor(@NonNull Context context, @NonNull ImageView imageView, @ColorRes int colorRes) { + if (SDK_INT >= LOLLIPOP) { + imageView.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(context, colorRes))); + } else { + imageView.setColorFilter(ContextCompat.getColor(context, colorRes)); + } + } } diff --git a/app/src/main/res/drawable/type_add_color_36dp.xml b/app/src/main/res/drawable/type_add_color_36dp.xml index 4d964871e..145abfc94 100644 --- a/app/src/main/res/drawable/type_add_color_36dp.xml +++ b/app/src/main/res/drawable/type_add_color_36dp.xml @@ -1,5 +1,5 @@ <vector android:autoMirrored="true" android:height="36dp" - android:tint="#00D400" android:viewportHeight="24.0" + android:tint="@color/activity_create" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="36dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="#FF000000" android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/> </vector> diff --git a/app/src/main/res/drawable/type_delete_color_36dp.xml b/app/src/main/res/drawable/type_delete_color_36dp.xml index 014bf20b8..3b2394fa0 100644 --- a/app/src/main/res/drawable/type_delete_color_36dp.xml +++ b/app/src/main/res/drawable/type_delete_color_36dp.xml @@ -1,5 +1,5 @@ <vector android:autoMirrored="true" android:height="36dp" - android:tint="#D40000" android:viewportHeight="24.0" + android:tint="@color/activity_delete" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="36dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="#FF000000" android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/> </vector> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ac0dadf82..0692fb8d6 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -133,9 +133,9 @@ android:background="?attr/selectableItemBackgroundBorderless" android:contentDescription="@string/simple_filter" android:padding="12dp" - android:tint="?attr/colorAccent" android:tooltipText="@string/simple_filter" app:srcCompat="@drawable/ic_filter_list_white_24dp" + app:tint="?attr/colorAccent" tools:targetApi="o" /> <ImageView @@ -147,8 +147,8 @@ android:layout_marginBottom="12dp" android:contentDescription="@null" android:src="@drawable/circle_grey600_8dp" - android:tint="@color/defaultBrand" android:visibility="gone" + app:tint="@color/defaultBrand" tools:visibility="visible" /> </FrameLayout> @@ -160,11 +160,11 @@ android:background="?attr/selectableItemBackgroundBorderless" android:contentDescription="@string/action_archived_cards" android:padding="12dp" - android:tint="?attr/colorAccent" android:tooltipText="@string/action_archived_cards" android:translationX="12dp" android:visibility="gone" app:srcCompat="@drawable/ic_archive_white_24dp" + app:tint="?attr/colorAccent" tools:targetApi="o" tools:visibility="visible" /> </androidx.appcompat.widget.Toolbar> @@ -192,9 +192,9 @@ android:background="?attr/colorPrimary" android:contentDescription="@string/add_list" android:foreground="?attr/selectableItemBackgroundBorderless" - android:tint="?attr/colorAccent" android:tooltipText="@string/manage_list" app:srcCompat="@drawable/ic_menu" + app:tint="?attr/colorAccent" tools:ignore="UnusedAttribute" /> </LinearLayout> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 55812677c..d7907027a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -12,6 +12,9 @@ <color name="bg_card_wrapper">#fafafa</color> <color name="dark_fg_primary">#e5e5e5</color> + <color name="activity_create">#00D400</color> + <color name="activity_delete">#D40000</color> + <!-- due date colors --> <color name="due_tomorrow">#7fffc53a</color> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d6d9470fe..8b2b4efcb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,7 +10,6 @@ <string name="drawer_end_account">Last account</string> <string name="drawer_manage_accounts">Manage accounts</string> - <!-- Simple values --> <string name="simple_boards">Boards</string> <string name="simple_add">Add</string> <string name="simple_save">Save</string> @@ -47,7 +46,6 @@ <string name="delete_board">Delete board</string> <string name="delete_something">Delete %1$s</string> - <!-- About --> <string name="about">About</string> <string name="about_version_title">Version</string> <string name="about_version">You are currently using %1$s</string> @@ -107,7 +105,6 @@ <string name="label_clear_due_date">Clear due date</string> <string name="label_add">Add %1$s</string> - <!-- URLs --> <string name="url_maintainer" translatable="false">https://www.niedermann.it/</string> <string name="url_about_icon_author" translatable="false">https://github.com/nextcloud/deck/commit/8c04ea8dc99e9b392f4039e8e5e6964d5a6d3453#diff-f3716cc279904617b1a21078526b6bf1R1</string> <string name="url_source" translatable="false">https://github.com/stefan-niedermann/nextcloud-deck</string> @@ -192,11 +189,9 @@ <string name="open_in_browser">Open in browser</string> <string name="updating_card">Updating card…</string> - <!-- Move lists --> <string name="move_list_right">Move list right</string> <string name="move_list_left">Move list left</string> - <!-- Filter --> <string name="filter_no_filter">All</string> <string name="filter_overdue">Overdue</string> <string name="filter_today">Today</string> @@ -207,7 +202,6 @@ <string name="filter_by_assigned_user">Filter by assigned user</string> <string name="filter_by_duedate">Filter by due date</string> - <!-- Archived cards --> <string name="archived_cards">Archived cards</string> <string name="action_card_dearchive">Undo card archiving</string> <string name="action_archived_cards">Browse archived cards</string> @@ -222,11 +216,9 @@ <string name="filter_user_title">Users</string> <string name="filter_duedate_title">Due date</string> - <!-- Archived boards --> <string name="action_board_dearchive">Undo board archiving</string> <string name="archived_boards">Archived boards</string> - <!-- Errors --> <string name="error">An error appeared</string> <string name="synchronization_failed">Synchronization failed</string> <string name="operation_not_yet_supported">Not yet supported</string> @@ -327,4 +319,5 @@ <string name="files">Files</string> <string name="gallery">Gallery</string> <string name="simple_attach">attach</string> + <string name="add_stack_widget">Add list widget</string> </resources> diff --git a/app/src/test/java/it/niedermann/nextcloud/deck/ProjectUtilTest.java b/app/src/test/java/it/niedermann/nextcloud/deck/ProjectUtilTest.java index 2c03f5952..1c8062051 100644 --- a/app/src/test/java/it/niedermann/nextcloud/deck/ProjectUtilTest.java +++ b/app/src/test/java/it/niedermann/nextcloud/deck/ProjectUtilTest.java @@ -10,7 +10,7 @@ import static org.junit.Assert.assertThrows; public class ProjectUtilTest { @Test public void extractBoardIdAndCardIdFromUrl() { - // Valid board URLs + // Valid board URLs with # assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("index.php/apps/deck/#/board/4"), new long[]{4}); assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("/index.php/apps/deck/#/board/4"), new long[]{4}); assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("example.com/index.php/apps/deck/#/board/4"), new long[]{4}); @@ -22,7 +22,28 @@ public class ProjectUtilTest { assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/nextcloud/index.php/apps/deck/#/board/4/card/0"), new long[]{4}); assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/nextcloud/index.php/apps/deck/#/board/4/foo"), new long[]{4}); - // Valid card URLs + // Valid board URLs without # + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("index.php/apps/deck/board/4"), new long[]{4}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("/index.php/apps/deck/board/4"), new long[]{4}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("example.com/index.php/apps/deck/board/4"), new long[]{4}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("http://example.com/index.php/apps/deck/board/4"), new long[]{4}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/index.php/apps/deck/board/4"), new long[]{4}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/nextcloud/index.php/apps/deck/board/4"), new long[]{4}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/nextcloud/index.php/apps/deck/board/4/card"), new long[]{4}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/nextcloud/index.php/apps/deck/board/4/card/"), new long[]{4}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/nextcloud/index.php/apps/deck/board/4/card/0"), new long[]{4}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/nextcloud/index.php/apps/deck/board/4/foo"), new long[]{4}); + + // Valid card URLs with # + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("index.php/apps/deck/#/board/4/card/6"), new long[]{4, 6}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("/index.php/apps/deck/#/board/4/card/6"), new long[]{4, 6}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("example.com/index.php/apps/deck/#/board/4/card/6"), new long[]{4, 6}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("http://example.com/index.php/apps/deck/#/board/4/card/6"), new long[]{4, 6}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/index.php/apps/deck/#/board/4/card/6"), new long[]{4, 6}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/index.php/apps/deck/#/board/4/card/6/"), new long[]{4, 6}); + assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/nextcloud/index.php/apps/deck/#/board/4/card/6"), new long[]{4, 6}); + + // Valid card URLs without # assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("index.php/apps/deck/#/board/4/card/6"), new long[]{4, 6}); assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("/index.php/apps/deck/#/board/4/card/6"), new long[]{4, 6}); assertArrayEquals(ProjectUtil.extractBoardIdAndCardIdFromUrl("example.com/index.php/apps/deck/#/board/4/card/6"), new long[]{4, 6}); @@ -48,11 +69,13 @@ public class ProjectUtilTest { assertThrows(IllegalArgumentException.class, () -> ProjectUtil.extractBoardIdAndCardIdFromUrl("https://example.com/nextcloud/index.php/call/qkzhe5k2")); // Invalid URLs - //noinspection ConstantConditions assertThrows(IllegalArgumentException.class, () -> ProjectUtil.extractBoardIdAndCardIdFromUrl(null)); assertThrows(IllegalArgumentException.class, () -> ProjectUtil.extractBoardIdAndCardIdFromUrl("")); assertThrows(IllegalArgumentException.class, () -> ProjectUtil.extractBoardIdAndCardIdFromUrl("/index.php/apps/deck/#/board/0")); assertThrows(IllegalArgumentException.class, () -> ProjectUtil.extractBoardIdAndCardIdFromUrl("/index.php/apps/deck/#/board/0/card/3")); assertThrows(IllegalArgumentException.class, () -> ProjectUtil.extractBoardIdAndCardIdFromUrl("/index.php/apps/deck/#/board//card/3")); + assertThrows(IllegalArgumentException.class, () -> ProjectUtil.extractBoardIdAndCardIdFromUrl("/index.php/apps/deck/board/0")); + assertThrows(IllegalArgumentException.class, () -> ProjectUtil.extractBoardIdAndCardIdFromUrl("/index.php/apps/deck/board/0/card/3")); + assertThrows(IllegalArgumentException.class, () -> ProjectUtil.extractBoardIdAndCardIdFromUrl("/index.php/apps/deck/board//card/3")); } } |