From 9f123d104bf8f328d5811f2658ffa606ddacce1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Jul 2022 01:05:30 +0000 Subject: [PATCH 001/398] Bump conductor from 3.1.6 to 3.1.7 Bumps [conductor](https://github.com/bluelinelabs/Conductor) from 3.1.6 to 3.1.7. - [Release notes](https://github.com/bluelinelabs/Conductor/releases) - [Commits](https://github.com/bluelinelabs/Conductor/compare/3.1.6...3.1.7) --- updated-dependencies: - dependency-name: com.bluelinelabs:conductor dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ddd4a6ce58d..3f4e2b38bf2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -225,7 +225,7 @@ dependencies { implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation "io.reactivex.rxjava2:rxjava:2.2.21" - implementation 'com.bluelinelabs:conductor:3.1.6' + implementation 'com.bluelinelabs:conductor:3.1.7' implementation "com.squareup.okhttp3:okhttp:${okhttpVersion}" implementation "com.squareup.okhttp3:okhttp-urlconnection:${okhttpVersion}" From 25b9a27e257cc34cefe0a819c3e2e1c9ceddda26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Aug 2022 01:36:09 +0000 Subject: [PATCH 002/398] Bump daggerVersion from 2.43 to 2.43.1 Bumps `daggerVersion` from 2.43 to 2.43.1. Updates `dagger` from 2.43 to 2.43.1 - [Release notes](https://github.com/google/dagger/releases) - [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/dagger/compare/dagger-2.43...dagger-2.43.1) Updates `dagger-compiler` from 2.43 to 2.43.1 - [Release notes](https://github.com/google/dagger/releases) - [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/dagger/compare/dagger-2.43...dagger-2.43.1) --- updated-dependencies: - dependency-name: com.google.dagger:dagger dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.google.dagger:dagger-compiler dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3f4e2b38bf2..88d1dfc409b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -159,7 +159,7 @@ ext { androidxCameraVersion = "1.1.0" butterknifeVersion = "10.2.3" coilKtVersion = "2.1.0" - daggerVersion = "2.43" + daggerVersion = "2.43.1" lifecycleVersion = '2.5.1' okhttpVersion = "4.10.0" materialDialogsVersion = "3.3.0" From dcd0df7a37261f93673926ac2685bf86ccb0ca62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Aug 2022 01:36:18 +0000 Subject: [PATCH 003/398] Bump gson from 2.9.0 to 2.9.1 Bumps [gson](https://github.com/google/gson) from 2.9.0 to 2.9.1. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.9.0...gson-parent-2.9.1) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3f4e2b38bf2..c587b6d10c2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -293,7 +293,7 @@ dependencies { implementation "com.afollestad.material-dialogs:bottomsheets:${materialDialogsVersion}" implementation "com.afollestad.material-dialogs:lifecycle:${materialDialogsVersion}" - implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.google.code.gson:gson:2.9.1' implementation 'com.google.android.exoplayer:exoplayer:2.18.1' implementation 'com.github.chrisbanes:PhotoView:2.3.0' From 5a65af25ca8b8090514ebc8e0d8a893ec35e9b78 Mon Sep 17 00:00:00 2001 From: Nextcloud Android Bot Date: Mon, 1 Aug 2022 03:13:25 +0000 Subject: [PATCH 004/398] Weekly 14.2.0 Alpha 05 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3f4e2b38bf2..5ae3efef802 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,8 +45,8 @@ android { // mayor.minor.hotfix.increment (for increment: 01-50=Alpha / 51-89=RC / 90-99=stable) // xx .xxx .xx .xx - versionCode 140020004 - versionName "14.2.0 Alpha 04" + versionCode 140020005 + versionName "14.2.0 Alpha 05" flavorDimensions "default" renderscriptTargetApi 19 From bb425ef759b8cceb9e0caa774eeba5fb1987fccc Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 19:22:31 +0200 Subject: [PATCH 005/398] improve poll creating element sizes Signed-off-by: Andy Scherzinger --- .../main/res/layout/dialog_poll_create.xml | 69 ++++++++++++------- .../res/layout/poll_create_options_item.xml | 11 ++- app/src/main/res/values/dimens.xml | 2 + 3 files changed, 56 insertions(+), 26 deletions(-) diff --git a/app/src/main/res/layout/dialog_poll_create.xml b/app/src/main/res/layout/dialog_poll_create.xml index 9106aa53cb4..66f3307d658 100644 --- a/app/src/main/res/layout/dialog_poll_create.xml +++ b/app/src/main/res/layout/dialog_poll_create.xml @@ -1,7 +1,9 @@ + android:orientation="vertical" + tools:background="@color/white"> diff --git a/app/src/main/res/layout/dialog_poll_vote.xml b/app/src/main/res/layout/dialog_poll_vote.xml index c69f0a946e8..fa14940761b 100644 --- a/app/src/main/res/layout/dialog_poll_vote.xml +++ b/app/src/main/res/layout/dialog_poll_vote.xml @@ -59,28 +59,31 @@ + tools:visibility="visible" /> From e767d08755eb83fe5012bf6feeab20c19b685b71 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 19:31:19 +0200 Subject: [PATCH 007/398] make "End poll" a tertiary-action styled button Signed-off-by: Andy Scherzinger --- app/src/main/res/layout/dialog_poll_results.xml | 2 +- app/src/main/res/layout/dialog_poll_vote.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/dialog_poll_results.xml b/app/src/main/res/layout/dialog_poll_results.xml index 6388761fb04..e76662d56ad 100644 --- a/app/src/main/res/layout/dialog_poll_results.xml +++ b/app/src/main/res/layout/dialog_poll_results.xml @@ -46,7 +46,7 @@ Date: Thu, 28 Jul 2022 19:32:50 +0200 Subject: [PATCH 008/398] Bar color should be primary instead of muted different tone Signed-off-by: Andy Scherzinger --- app/src/main/res/layout/poll_result_header_item.xml | 2 +- app/src/main/res/values/colors.xml | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/res/layout/poll_result_header_item.xml b/app/src/main/res/layout/poll_result_header_item.xml index 44bfbf364ac..ed7b9d8c0c0 100644 --- a/app/src/main/res/layout/poll_result_header_item.xml +++ b/app/src/main/res/layout/poll_result_header_item.xml @@ -48,7 +48,7 @@ android:layout_height="wrap_content" android:layout_marginTop="4dp" android:indeterminate="false" - app:indicatorColor="@color/poll_bar_color" + app:indicatorColor="@color/colorPrimary" app:layout_constraintStart_toStartOf="@+id/poll_option_text" app:layout_constraintTop_toBottomOf="@+id/poll_option_text" app:trackColor="@color/dialog_background" diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2a0d6914856..0d5bf97adbb 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -106,9 +106,6 @@ #eeeeee #EEEEEE - - #8dd4f6 - #FFFFFF From a70ef7b5723984821d3337ad005a905787f2b9c1 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 19:33:57 +0200 Subject: [PATCH 009/398] Question field should be focused directly Signed-off-by: Andy Scherzinger --- app/src/main/res/layout/dialog_poll_create.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/dialog_poll_create.xml b/app/src/main/res/layout/dialog_poll_create.xml index 66f3307d658..5d9e150c5f4 100644 --- a/app/src/main/res/layout/dialog_poll_create.xml +++ b/app/src/main/res/layout/dialog_poll_create.xml @@ -49,7 +49,10 @@ android:layout_marginStart="@dimen/standard_margin" android:layout_marginEnd="@dimen/standard_margin" android:inputType="textMultiLine" - tools:ignore="Autofill,LabelFor" /> + tools:ignore="Autofill,LabelFor"> + + + Date: Thu, 28 Jul 2022 19:43:30 +0200 Subject: [PATCH 010/398] Dialogs have a 24dp outer spacing Signed-off-by: Andy Scherzinger --- .../main/res/layout/dialog_poll_create.xml | 27 ++++++++++--------- .../res/layout/poll_create_options_item.xml | 4 +-- app/src/main/res/values/dimens.xml | 3 ++- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/layout/dialog_poll_create.xml b/app/src/main/res/layout/dialog_poll_create.xml index 5d9e150c5f4..f48baaa2a97 100644 --- a/app/src/main/res/layout/dialog_poll_create.xml +++ b/app/src/main/res/layout/dialog_poll_create.xml @@ -31,13 +31,14 @@ + android:orientation="vertical" + android:paddingTop="@dimen/dialog_padding"> @@ -46,8 +47,8 @@ android:id="@+id/poll_create_question" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/standard_margin" - android:layout_marginEnd="@dimen/standard_margin" + android:layout_marginStart="@dimen/dialog_padding" + android:layout_marginEnd="@dimen/dialog_padding" android:inputType="textMultiLine" tools:ignore="Autofill,LabelFor"> @@ -58,8 +59,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/standard_margin" - android:paddingStart="@dimen/standard_padding" - android:paddingEnd="@dimen/standard_padding" + android:paddingStart="@dimen/dialog_padding" + android:paddingEnd="@dimen/dialog_padding" android:text="@string/polls_options" android:textColor="@color/colorPrimary" android:textStyle="bold" /> @@ -75,9 +76,9 @@ style="@style/OutlinedButton" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/standard_margin" + android:layout_marginStart="@dimen/dialog_padding" android:layout_marginTop="@dimen/standard_half_margin" - android:layout_marginEnd="@dimen/standard_margin" + android:layout_marginEnd="@dimen/dialog_padding" android:minHeight="@dimen/min_size_clickable_area" android:text="@string/polls_add_option" app:cornerRadius="@dimen/button_corner_radius" @@ -89,8 +90,8 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/standard_margin" android:layout_marginBottom="@dimen/standard_half_margin" - android:paddingStart="@dimen/standard_padding" - android:paddingEnd="@dimen/standard_padding" + android:paddingStart="@dimen/dialog_padding" + android:paddingEnd="@dimen/dialog_padding" android:text="@string/polls_settings" android:textColor="@color/colorPrimary" android:textStyle="bold" /> @@ -121,8 +122,8 @@ android:layout_marginTop="@dimen/standard_margin" android:gravity="end" android:orientation="horizontal" - android:paddingStart="@dimen/standard_padding" - android:paddingEnd="@dimen/standard_padding" + android:paddingStart="@dimen/dialog_padding" + android:paddingEnd="@dimen/dialog_padding" android:paddingBottom="@dimen/standard_padding"> @@ -45,7 +45,7 @@ style="@style/Widget.AppTheme.Button.IconButton" android:layout_width="@dimen/min_size_clickable_area" android:layout_height="@dimen/min_size_clickable_area" - android:layout_marginStart="5dp" + android:layout_marginEnd="@dimen/standard_half_margin" android:contentDescription="@string/nc_action_open_main_menu" app:cornerRadius="@dimen/button_corner_radius" app:icon="@drawable/ic_baseline_close_24" diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 9b286236b2b..9962226dab0 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -59,6 +59,7 @@ 8dp 8dp 400dp + 24dp 180dp 110dp @@ -71,7 +72,7 @@ 40dp 2dp - 10dp + 18dp 50dp From 09ddc86c40dba65995f64b5ec2f6123daea5e25c Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 22:22:51 +0200 Subject: [PATCH 011/398] Optimize layout and make it accessible Signed-off-by: Andy Scherzinger --- .../adapters/PollCreateOptionViewHolder.kt | 18 ++++++-- .../adapters/PollCreateOptionsAdapter.kt | 2 +- .../talk/polls/ui/PollCreateDialogFragment.kt | 6 +-- .../main/res/layout/dialog_poll_create.xml | 43 +++++++++++++------ .../res/layout/poll_create_options_item.xml | 27 +++++++++--- app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/strings.xml | 3 ++ 7 files changed, 72 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt index 6d40969dc21..91afdd16c71 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt @@ -24,6 +24,7 @@ import android.annotation.SuppressLint import android.text.Editable import android.text.TextWatcher import androidx.recyclerview.widget.RecyclerView +import com.nextcloud.talk.R import com.nextcloud.talk.databinding.PollCreateOptionsItemBinding import com.nextcloud.talk.utils.EmojiTextInputEditText @@ -43,13 +44,13 @@ class PollCreateOptionViewHolder( ) { textListener?.let { - binding.pollOptionText.removeTextChangedListener(it) + binding.pollOptionTextEdit.removeTextChangedListener(it) } - binding.pollOptionText.setText(pollCreateOptionItem.pollOption) + binding.pollOptionTextEdit.setText(pollCreateOptionItem.pollOption) if (focus) { - itemsListener.requestFocus(binding.pollOptionText) + itemsListener.requestFocus(binding.pollOptionTextEdit) } binding.pollOptionDelete.setOnClickListener { @@ -57,7 +58,16 @@ class PollCreateOptionViewHolder( } textListener = getTextWatcher(pollCreateOptionItem, itemsListener) - binding.pollOptionText.addTextChangedListener(textListener) + binding.pollOptionTextEdit.addTextChangedListener(textListener) + binding.pollOptionTextInputLayout.hint = String.format( + binding.pollOptionTextInputLayout.resources.getString(R.string.polls_option_hint), + position + 1 + ) + + binding.pollOptionDelete.contentDescription = String.format( + binding.pollOptionTextInputLayout.resources.getString(R.string.polls_option_delete), + position + 1 + ) } private fun getTextWatcher( diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionsAdapter.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionsAdapter.kt index 39c8f7d7f8e..e827a56a602 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionsAdapter.kt @@ -29,7 +29,7 @@ class PollCreateOptionsAdapter( private val clickListener: PollCreateOptionsItemListener ) : RecyclerView.Adapter() { - internal var list: ArrayList = ArrayList() + internal var list: ArrayList = ArrayList() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PollCreateOptionViewHolder { val itemBinding = PollCreateOptionsItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt index cdaa8fa58e0..e94f1e7501b 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt @@ -102,7 +102,7 @@ class PollCreateDialogFragment : DialogFragment(), PollCreateOptionsItemListener dismiss() } - binding.pollCreateQuestion.addTextChangedListener(object : TextWatcher { + binding.pollCreateQuestionTextEdit.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable) { // unused atm } @@ -161,8 +161,8 @@ class PollCreateDialogFragment : DialogFragment(), PollCreateOptionsItemListener } override fun requestFocus(textField: EditText) { - if (binding.pollCreateQuestion.text.isBlank()) { - binding.pollCreateQuestion.requestFocus() + if (binding.pollCreateQuestionTextEdit.text?.isBlank() == true) { + binding.pollCreateQuestionTextEdit.requestFocus() } else { textField.requestFocus() } diff --git a/app/src/main/res/layout/dialog_poll_create.xml b/app/src/main/res/layout/dialog_poll_create.xml index f48baaa2a97..da0fe5f7fca 100644 --- a/app/src/main/res/layout/dialog_poll_create.xml +++ b/app/src/main/res/layout/dialog_poll_create.xml @@ -32,33 +32,51 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingTop="@dimen/dialog_padding"> + android:paddingTop="@dimen/dialog_padding_top_bottom"> - + android:hint="@string/polls_question_hint" + android:minHeight="@dimen/min_size_clickable_area" + app:boxStrokeColor="@color/colorPrimary" + app:errorTextAppearance="@style/ErrorAppearance" + app:hintTextColor="@color/colorPrimary"> + + + + + + - - + + app:icon="@drawable/ic_add_grey600_24px" /> + android:paddingBottom="@dimen/dialog_padding_top_bottom"> - + app:boxStrokeColor="@color/colorPrimary" + app:errorTextAppearance="@style/ErrorAppearance" + app:hintTextColor="@color/colorPrimary"> + + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 9962226dab0..9f4ad1f17c4 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -60,6 +60,7 @@ 8dp 400dp 24dp + 18dp 180dp 110dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ec961c51801..bffdd4c13ff 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -543,7 +543,10 @@ You can\'t vote with more options for this poll. Results Question + Your question Options + Option %1$s + Delete option %1$s Settings Private poll Multiple answers From bb822aa1a472a59ac0478a304568c445a33c67d0 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 23:14:46 +0200 Subject: [PATCH 012/398] Change vote submitting string Signed-off-by: Andy Scherzinger --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bffdd4c13ff..e67af0332f0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -537,7 +537,7 @@ Add option Edit vote Vote - Successfully voted + Vote submitted End poll Do you really want to end this poll? This can\'t be undone. You can\'t vote with more options for this poll. From 0a3e0230c9fa0554b5babf25815f411d5815f6c8 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 23:15:18 +0200 Subject: [PATCH 013/398] fix avatar voter border Signed-off-by: Andy Scherzinger --- .../polls/adapters/PollResultVotersOverviewViewHolder.kt | 6 +++--- app/src/main/res/values-night/colors.xml | 1 + app/src/main/res/values/colors.xml | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVotersOverviewViewHolder.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVotersOverviewViewHolder.kt index c3805afe1ed..d071cc76b4c 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVotersOverviewViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultVotersOverviewViewHolder.kt @@ -72,10 +72,10 @@ class PollResultVotersOverviewViewHolder( roundingParams.roundAsCircle = true roundingParams.borderColor = ResourcesCompat.getColor( itemView.context.resources!!, - R.color.colorPrimary, + R.color.vote_dialog_background, null ) - roundingParams.borderWidth = 2.0f + roundingParams.borderWidth = DisplayUtils.convertDpToPixel(2.0f, itemView.context) avatar.hierarchy.roundingParams = roundingParams avatar.controller = getAvatarDraweeController(pollDetails) @@ -134,7 +134,7 @@ class PollResultVotersOverviewViewHolder( const val AVATAR_SIZE = 60 const val AVATAR_RADIUS = 5f const val MAX_AVATARS = 10 - const val AVATAR_OFFSET = AVATAR_SIZE - 10 + const val AVATAR_OFFSET = AVATAR_SIZE - 20 const val DOTS_OFFSET = 70 const val DOTS_TEXT = "…" } diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 6c2a769c8a3..86f4044a533 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -75,4 +75,5 @@ #818181 #353535 + #424242 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 0d5bf97adbb..2993412c918 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -109,5 +109,6 @@ #FFFFFF + #FFFFFF From ba83552be836c975d703c213a0023ff5fd8c1ee6 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 23:15:42 +0200 Subject: [PATCH 014/398] fix button positioning Signed-off-by: Andy Scherzinger --- app/src/main/res/layout/dialog_poll_vote.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/dialog_poll_vote.xml b/app/src/main/res/layout/dialog_poll_vote.xml index 25b11683b0a..2ce6d32e319 100644 --- a/app/src/main/res/layout/dialog_poll_vote.xml +++ b/app/src/main/res/layout/dialog_poll_vote.xml @@ -55,6 +55,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/standard_margin" + android:layout_marginEnd="4dp" android:gravity="end"> Date: Tue, 2 Aug 2022 11:25:39 +0200 Subject: [PATCH 015/398] i18n: Spelling unification Spelling unification in Transifex. Signed-off-by: Valdnet <47037905+Valdnet@users.noreply.github.com> Signed-off-by: Valdnet <47037905+Valdnet@users.noreply.github.com> --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e67af0332f0..654d78f4aa0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -539,8 +539,8 @@ Vote Vote submitted End poll - Do you really want to end this poll? This can\'t be undone. - You can\'t vote with more options for this poll. + Do you really want to end this poll? This cannot be undone. + You cannot vote with more options for this poll. Results Question Your question From d1e474e4027b3ed1a1dc12d3021f152f42b481ea Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Wed, 3 Aug 2022 08:24:10 +0200 Subject: [PATCH 016/398] Fix status visibility in conversation list Signed-off-by: tobiasKaminsky --- .../nextcloud/talk/adapters/items/ConversationItem.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index 6b63203e5c8..b770b53c4f2 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -97,7 +97,7 @@ public ConversationItem(Conversation conversation, User user, public boolean equals(Object o) { if (o instanceof ConversationItem) { ConversationItem inItem = (ConversationItem) o; - return conversation.equals(inItem.getModel()); + return conversation.equals(inItem.getModel()) && status.equals(inItem.status); } return false; } @@ -108,7 +108,7 @@ public Conversation getModel() { @Override public int hashCode() { - return conversation.hashCode(); + return conversation.hashCode() * (status == null ? 1 : status.hashCode()); } @Override @@ -211,12 +211,16 @@ public void bindViewHolder(FlexibleAdapter adapter, if (status != null && Conversation.ConversationType.ROOM_SYSTEM != conversation.getType()) { float size = DisplayUtils.convertDpToPixel(STATUS_SIZE_IN_DP, appContext); + + holder.binding.userStatusImage.setVisibility(View.VISIBLE); holder.binding.userStatusImage.setImageDrawable(new StatusDrawable( status.getStatus(), status.getIcon(), size, context.getResources().getColor(R.color.bg_default), appContext)); + } else { + holder.binding.userStatusImage.setVisibility(View.GONE); } if (conversation.getLastMessage() != null) { From 28b818f6669d7285bb8ed077e03fd864a8499089 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 4 Aug 2022 00:01:42 +0200 Subject: [PATCH 017/398] Update AGP to 7.2.2 Signed-off-by: Andy Scherzinger --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1a627b78905..067dcaf73a6 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.2.1' + classpath 'com.android.tools.build:gradle:7.2.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-serialization:${kotlinVersion}" classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.5' From 9137fca218fb589fc38e780dee7724cd6bea464c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Aug 2022 01:06:37 +0000 Subject: [PATCH 018/398] Bump daggerVersion from 2.43.1 to 2.43.2 Bumps `daggerVersion` from 2.43.1 to 2.43.2. Updates `dagger` from 2.43.1 to 2.43.2 - [Release notes](https://github.com/google/dagger/releases) - [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/dagger/compare/dagger-2.43.1...dagger-2.43.2) Updates `dagger-compiler` from 2.43.1 to 2.43.2 - [Release notes](https://github.com/google/dagger/releases) - [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/dagger/compare/dagger-2.43.1...dagger-2.43.2) --- updated-dependencies: - dependency-name: com.google.dagger:dagger dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.google.dagger:dagger-compiler dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index db4115b968f..575d9fa8a3a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -159,7 +159,7 @@ ext { androidxCameraVersion = "1.1.0" butterknifeVersion = "10.2.3" coilKtVersion = "2.1.0" - daggerVersion = "2.43.1" + daggerVersion = "2.43.2" lifecycleVersion = '2.5.1' okhttpVersion = "4.10.0" materialDialogsVersion = "3.3.0" From a916ba2189f917f6409d8826b4ff783f883520ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Aug 2022 01:06:49 +0000 Subject: [PATCH 019/398] Bump android-database-sqlcipher from 4.5.1 to 4.5.2 Bumps [android-database-sqlcipher](https://github.com/sqlcipher/android-database-sqlcipher) from 4.5.1 to 4.5.2. - [Release notes](https://github.com/sqlcipher/android-database-sqlcipher/releases) - [Commits](https://github.com/sqlcipher/android-database-sqlcipher/compare/v4.5.1...v4.5.2) --- updated-dependencies: - dependency-name: net.zetetic:android-database-sqlcipher dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index db4115b968f..b21e6937944 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -246,7 +246,7 @@ dependencies { compileOnly 'javax.annotation:javax.annotation-api:1.3.2' // Android only implementation 'org.greenrobot:eventbus:3.3.1' - implementation 'net.zetetic:android-database-sqlcipher:4.5.1' + implementation 'net.zetetic:android-database-sqlcipher:4.5.2' implementation "androidx.room:room-runtime:${roomVersion}" implementation "androidx.room:room-rxjava2:${roomVersion}" From 3ca3f35e3e8d76f97a7651ce57ac43e101b2f99a Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 4 Aug 2022 12:29:24 +0200 Subject: [PATCH 020/398] Update app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Álvaro Brey Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/adapters/items/ConversationItem.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index b770b53c4f2..f1e3ab51cdb 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -108,7 +108,9 @@ public Conversation getModel() { @Override public int hashCode() { - return conversation.hashCode() * (status == null ? 1 : status.hashCode()); + int result = conversation.hashCode(); + result = 31 * result + (status != null ? status.hashCode() : 0); + return result; } @Override From 6115eb3b248943444c61576a029dfb14aacc3ee3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Aug 2022 01:17:09 +0000 Subject: [PATCH 021/398] Bump firebase-messaging from 23.0.6 to 23.0.7 Bumps firebase-messaging from 23.0.6 to 23.0.7. --- updated-dependencies: - dependency-name: com.google.firebase:firebase-messaging dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4d2cd17c837..6baaf5cee39 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -331,7 +331,7 @@ dependencies { spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.7' gplayImplementation 'com.google.android.gms:play-services-base:18.1.0' - gplayImplementation "com.google.firebase:firebase-messaging:23.0.6" + gplayImplementation "com.google.firebase:firebase-messaging:23.0.7" // implementation 'androidx.activity:activity-ktx:1.4.0' } From 84f2cf432c0c093021019860fbf34c2ab4db7ff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Fri, 5 Aug 2022 10:27:03 +0200 Subject: [PATCH 022/398] Use singular and plural for vote(s) string MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves: #2265 Signed-off-by: Tim Krüger --- .../com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt | 5 +++-- app/src/main/res/values/strings.xml | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt index 85cba1f64e6..f775746ff2c 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt @@ -136,8 +136,9 @@ class PollMainDialogFragment : DialogFragment() { private fun initVotersAmount(showVotersAmount: Boolean, numVoters: Int, showResultSubtitle: Boolean) { if (showVotersAmount) { binding.pollVotesAmount.visibility = View.VISIBLE - binding.pollVotesAmount.text = String.format( - resources.getString(R.string.polls_amount_voters), + binding.pollVotesAmount.text = resources.getQuantityString( + R.plurals.polls_amount_voters, + numVoters, numVoters ) } else { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 654d78f4aa0..0860f900d12 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -533,7 +533,10 @@ Tap to open poll - %1$s votes + + %d vote + %d votes + Add option Edit vote Vote From f3e4d89eed615d516c54a16a4d5262b4acd74ea8 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Fri, 5 Aug 2022 09:03:35 +0000 Subject: [PATCH 023/398] [tx-robot] updated from transifex Signed-off-by: Nextcloud bot --- app/src/main/res/values-cs-rCZ/strings.xml | 14 ++++++++++++++ app/src/main/res/values-de/strings.xml | 7 +++++-- app/src/main/res/values-eu/strings.xml | 7 ++++++- app/src/main/res/values-hu-rHU/strings.xml | 9 +++++---- app/src/main/res/values-is/strings.xml | 1 + app/src/main/res/values-nb-rNO/strings.xml | 5 +++++ app/src/main/res/values-nl/strings.xml | 2 ++ app/src/main/res/values-pl/strings.xml | 14 ++++++++++++++ app/src/main/res/values-pt-rBR/strings.xml | 4 ++-- app/src/main/res/values-sl/strings.xml | 2 -- app/src/main/res/values-tr/strings.xml | 5 ++++- app/src/main/res/values-zh-rHK/strings.xml | 5 ++++- 12 files changed, 62 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 2280e8ac435..7522f818314 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -36,6 +36,7 @@ Z - A Největší jako první Nejmenší jako první + Klepnutím anketu otevřete Nic nenalezeno Hledejte psaním… Hledat… @@ -234,6 +235,8 @@ Odeslali jste obrázek. %1$s poslal(a) umístění Odeslali jste umístění. + %1$s odeslal(a) anketu. + Odeslali jste anketu. %1$s odeslal(a) hlasovou zprávu. Odeslali jste hlasovou zprávu. Vyzkoušet připojení k serveru @@ -338,11 +341,22 @@ Otevřít v aplikaci Soubory Přehrát/pozastavit hlasovou zprávu Přidat volbu + %1$s hlasů + Upravit hlas + Ukončit anketu + Opravdu chcete tuto anketu ukončit? Toto nelze vzít zpět. + V této anketě není možné hlasovat více volbami. + Vícero odpovědí + Smazat volbu %1$s + Volba %1$s Možnosti Soukromá anketa + Otázka + Vaše otázka Výsledky Nastavení Hlasovat + Hlas odeslán Vše Sdílení souborů z úložiště není možné bez oprávnění Uložit diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 707a0c8aba5..7e9a73b2676 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -345,15 +345,18 @@ Abstimmung bearbeiten Umfrage beenden Soll diese Umfrage wirklich beendet werden? Das kann nicht rückgängig gemacht werden. - Sie können nicht mit mehr Optionen für diese Umfrage abstimmen. + Sie können nicht mit mehreren Optionen für diese Umfrage abstimmen. Mehrere Antworten + Lösche Option %1$s + Option %1$s Optionen Private Umfrage Frage + Ihre Frage Ergebnisse Einstellungen Abstimmen - Erfolgreich abgestimmt + Stimme abgegeben Alle Dateien können nicht ohne Berechtigung geteilt werden Speichern diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 4e45fdc4032..199a9b57037 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -344,14 +344,19 @@ %1$s boto Editatu botoa Amaitu galdeketa + Ziur zaude galdeketa hau bukatu nahi duzula? Ezingo da atzera egin. + Ezin duzu aukera gehiagorekin bozkatu galdeketa honetan. Erantzun anitz + Ezabatu %1$s aukera + %1$s aukera Aukerak Galdeketa pribatua Galdera + Zure galdera Emaitzak Ezarpenak Bozkatu - Ondo bozkatu da + Botoa eman da Denak Ezin dira fitxategiak biltegitik partekatu baimenik gabe Gorde diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 1db1dc00f60..d4266b40191 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -344,16 +344,17 @@ %1$s szavazat Szavazat szerkesztése Szavazás befejezése - Biztos, hogy befejezi ezt a szavazást? Ez nem vonható vissza. - Nem szavazhat több lehetőségre ennél a szavazásnál. Több válasz - Beállítások + %1$s. lehetőség törlése + %1$s. lehetőség + Lehetőségek Privát szavazás Kérdés + Az Ön kérdése Eredmények Beállítások Szavazat leadása - Sikeres szavazatleadás + Szavazat leadva Összes A fájlok megosztása a tárhelyről engedély nélkül nem lehetséges Mentés diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index edb251ac0fe..0d9f3434078 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -10,6 +10,7 @@ Hreinsa stöðuskilaboð eftir Samtöl Ónáðið ekki + Ekki hreinsa Breyta Nýlegt Dulritað diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 376a851d221..ecd526c6150 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -83,6 +83,7 @@ Kunne ikke lagre visningsnavn, avbryter E-post Feilet ved henting av settinger for signalering + Målserveren støtter ikke å delta i offentlige samtaler via mobiltelefoner. Du kan prøve å bli med i samtalen via nettleseren. Noe gikk galt. Tilbake Bruker følger en offentlig lenke @@ -128,6 +129,7 @@ Ingen mellomserver %1$s på %2$s merknadskanal Samtaler + Varsle om innkommende anrop Meldinger Innstillinger for notifiseringer Alltid varsle @@ -147,6 +149,7 @@ Personlig informasjon Gi moderatorstatus Ny offentlig samtale + Offentlige samtaler lar deg invitere folk utenfra gjennom en spesiallaget lenke. Push notifisering deaktivert Trykk-for-å-snakke Med mikrofonen avslått, klikk & hold for å bruke klikk-for-å-snakke @@ -208,6 +211,7 @@ Mellomserver Mellomserver port Type mellomserver + Autoriser kontoen på nytt Fjern Fjern konto Bekreft at du vil fjerne den nåværende kontoen. @@ -222,6 +226,7 @@ tema Lys Tema + Proxy krever legitimasjon Advarsel Bare gjeldende konto kan reautoriseres Del lenke diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 4458444810b..4e52b5609bd 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -2,6 +2,8 @@ Accountpictogram Zoeken in %s + Bluetooth + Audio output Telefoon Speaker Avatar diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index c92f6e5f784..d5b31f90c00 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -36,6 +36,7 @@ Z - A Od największych Od najmniejszych + Dotknij, aby otworzyć sondę Brak wyników wyszukiwania Zacznij pisać, aby wyszukać… Szukaj… @@ -234,6 +235,8 @@ Wysłałeś plik graficzny. %1$s wysłał lokalizację. Wysłałeś lokalizację. + %1$s wysłał sondę. + Wysłałeś sondę. %1$s wysłał wiadomość głosową. Wysłałeś wiadomość głosową. Sprawdź połączenie z serwerem @@ -338,11 +341,22 @@ Otwórz w aplikacji Pliki Odtwórz/wstrzymaj wiadomość głosową Dodaj opcję + %1$s głosów + Edytuj głos + Zakończ sondę + Czy na pewno chcesz zakończyć sondę? Tego nie można cofnąć. + Nie możesz głosować z większą liczbą opcji w tej sondzie. + Wiele odpowiedzi + Usuń opcję %1$s + Opcja %1$s Opcje Sonda prywatna + Pytanie + Twoje pytanie Wyniki Ustawienia Wyniki głosowania + Oddano głos Wszystkie Udostępnianie plików z magazynu nie jest możliwe bez uprawnień Zapisz diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index fee62ee1161..357daa25a6d 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -344,7 +344,7 @@ %1$s votos Editar voto Encerrar enquete - Você realmente quer terminar esta enquete? Isso não pode ser desfeito. + Você realmente quer terminar esta enquete? Isto não pode ser desfeito. Você não pode votar com mais opções para esta enquete. Várias respostas Opções @@ -353,7 +353,7 @@ Resultados Configurações Voto - Votado com sucesso + Voto enviado Tudos O compartilhamento de arquivos do armazenamento não é possível sem permissões Salvar diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index a35306f5f0e..8d068567c8b 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -337,7 +337,6 @@ Dodaj možnost Uredi glasovanje Končaj anketo - Ali res želite končati anketo? Dejanja ni mogoče povrniti! Več odgovorov Možnosti Zasebna anketa @@ -345,7 +344,6 @@ Zadetki Nastavitve Glas - Glas je uspešno oddan Vse Skupna raba datotek iz pomnilnika ni mogoča brez dovoljenj Shrani diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d6272b631d9..625b48a5d78 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -344,12 +344,15 @@ %1$s oy Oyu düzenle Anleti sonlandır - Bu klasörü gerçekten sonlandırmak istiyor musunuz? Bu işlem geri alınamaz! + Bu anketi sonlandırmak istediğinize emin misiniz? Bu işlem geri alınamaz! Bu ankete başka seçenekler ile oy veremezsiniz. Birden çok yanıt + %1$s seçeneğini sil + %1$s seçeneği Seçenekler Kapalı anket Soru + Sorunuz Sonuçlar Ayarlar Oy diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 3cdd5c7df5e..9f03df09867 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -347,13 +347,16 @@ 你真的要結束這個民意調查嗎?這是無法撤消的。 您無法為此民意調查選擇更多選項。 多個答案 + 刪除選項 %1$s + 選項 %1$s 選項 私人投票 問題 + 您的問題 結果 設定 投票 - 成功投票 + 已提交投票 全部 沒有權限就無法從存儲分享檔案 保存 From 9df00a85626252c6a78986ff2d6227884ce9fefb Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Fri, 5 Aug 2022 00:22:03 +0200 Subject: [PATCH 024/398] make equals null-safe in case no status set Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/adapters/items/ConversationItem.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index f1e3ab51cdb..7f4b69070ac 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -51,6 +51,7 @@ import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew; import java.util.List; +import java.util.Objects; import java.util.regex.Pattern; import androidx.core.content.ContextCompat; @@ -97,7 +98,7 @@ public ConversationItem(Conversation conversation, User user, public boolean equals(Object o) { if (o instanceof ConversationItem) { ConversationItem inItem = (ConversationItem) o; - return conversation.equals(inItem.getModel()) && status.equals(inItem.status); + return conversation.equals(inItem.getModel()) && Objects.equals(status, inItem.status); } return false; } From efaf5761682781173a8eca82e860e72ba0bb5924 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Aug 2022 01:17:53 +0000 Subject: [PATCH 025/398] Bump PopupBubble from 1.0.6 to 2.0.0 Bumps [PopupBubble](https://github.com/nextcloud/PopupBubble) from 1.0.6 to 2.0.0. - [Release notes](https://github.com/nextcloud/PopupBubble/releases) - [Commits](https://github.com/nextcloud/PopupBubble/compare/1.0.6...2.0.0) --- updated-dependencies: - dependency-name: com.github.nextcloud:PopupBubble dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6baaf5cee39..aae744c7e33 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -285,7 +285,7 @@ dependencies { implementation 'com.novoda:merlin:1.2.1' - implementation 'com.github.nextcloud:PopupBubble:1.0.6' + implementation 'com.github.nextcloud:PopupBubble:2.0.0' implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1' implementation "com.afollestad.material-dialogs:core:${materialDialogsVersion}" From 9fc71827901b6df2166f5bc5a9daa9097cca0cd7 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Fri, 5 Aug 2022 16:29:07 +0200 Subject: [PATCH 026/398] Migrate to updated popup bubble Signed-off-by: Andy Scherzinger --- .../talk/controllers/ChatController.kt | 5 +++++ .../ConversationsListController.java | 7 ++++++- app/src/main/res/layout/controller_chat.xml | 19 +++++++++++-------- .../layout/controller_conversations_rv.xml | 19 +++++++++++-------- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 48a7fc96e60..353d651bdcb 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -35,9 +35,11 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.content.res.AssetFileDescriptor +import android.content.res.ColorStateList import android.content.res.Resources import android.database.Cursor import android.graphics.Bitmap +import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.media.MediaPlayer import android.media.MediaRecorder @@ -645,6 +647,9 @@ class ChatController(args: Bundle) : } } + binding.popupBubbleView.setTextColor(Color.WHITE) + binding.popupBubbleView.setIconTint(ColorStateList.valueOf(Color.WHITE)) + binding.messageInputView.setPadding(0, 0, 0, 0) binding.messagesListView.addOnScrollListener(object : RecyclerView.OnScrollListener() { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index 4fa4d33b1de..a15883a29a4 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -31,7 +31,9 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.res.ColorStateList; import android.graphics.Bitmap; +import android.graphics.Color; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -101,7 +103,7 @@ import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew; import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.rx.SearchViewObservable; -import com.webianks.library.PopupBubble; +import com.nextcloud.ui.popupbubble.PopupBubble; import com.yarolegovich.lovelydialog.LovelySaveStateHandler; import com.yarolegovich.lovelydialog.LovelyStandardDialog; @@ -806,6 +808,9 @@ public void bubbleClicked(Context context) { recyclerView.smoothScrollToPosition(nextUnreadConversationScrollPosition); } }); + + newMentionPopupBubble.setTextColor(Color.WHITE); + newMentionPopupBubble.setIconTint(ColorStateList.valueOf(Color.WHITE)); } private void checkToShowUnreadBubble() { diff --git a/app/src/main/res/layout/controller_chat.xml b/app/src/main/res/layout/controller_chat.xml index afa24a63cdf..5453d27df5e 100644 --- a/app/src/main/res/layout/controller_chat.xml +++ b/app/src/main/res/layout/controller_chat.xml @@ -90,19 +90,22 @@ app:outcomingTimeTextSize="12sp" app:textAutoLink="all" /> - + android:layout_marginStart="@dimen/dialog_padding" + android:layout_marginTop="16dp" + android:layout_marginEnd="@dimen/dialog_padding" + android:layout_marginBottom="16dp" + android:minHeight="@dimen/min_size_clickable_area" + android:text="@string/nc_new_messages" + app:background="@color/colorPrimary" + app:cornerRadius="@dimen/button_corner_radius" + app:icon="@drawable/ic_baseline_arrow_downward_24px" /> diff --git a/app/src/main/res/layout/controller_conversations_rv.xml b/app/src/main/res/layout/controller_conversations_rv.xml index d571421cd72..c595b9ed86d 100644 --- a/app/src/main/res/layout/controller_conversations_rv.xml +++ b/app/src/main/res/layout/controller_conversations_rv.xml @@ -121,17 +121,20 @@ app:srcCompat="@drawable/ic_add_white_24px" app:tint="@color/white" /> - + android:layout_marginStart="88dp" + android:layout_marginTop="16dp" + android:layout_marginEnd="88dp" + android:layout_marginBottom="16dp" + android:minHeight="@dimen/min_size_clickable_area" + android:text="@string/nc_new_mention" + app:background="@color/colorPrimary" + app:cornerRadius="@dimen/button_corner_radius" + app:icon="@drawable/ic_baseline_arrow_downward_24px" /> From 1ce8173e8b19ca5358165b05fda4ae080e4025d2 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sat, 6 Aug 2022 04:14:36 +0000 Subject: [PATCH 027/398] [tx-robot] updated from transifex Signed-off-by: Nextcloud bot --- app/src/main/res/values-ar/strings.xml | 2 +- app/src/main/res/values-b+en+001/strings.xml | 2 +- app/src/main/res/values-bg-rBG/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-cs-rCZ/strings.xml | 3 +-- app/src/main/res/values-da/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 3 +-- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-eu/strings.xml | 3 +-- app/src/main/res/values-fa/strings.xml | 2 +- app/src/main/res/values-fi-rFI/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-gl/strings.xml | 2 +- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-hu-rHU/strings.xml | 3 +-- app/src/main/res/values-is/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-iw/strings.xml | 2 +- app/src/main/res/values-ja-rJP/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-lt-rLT/strings.xml | 2 +- app/src/main/res/values-nb-rNO/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 3 +-- app/src/main/res/values-pt-rBR/strings.xml | 6 ++++-- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sc/strings.xml | 2 +- app/src/main/res/values-sk-rSK/strings.xml | 2 +- app/src/main/res/values-sl/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 3 +-- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values-vi/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values-zh-rHK/strings.xml | 3 +-- app/src/main/res/values-zh-rTW/strings.xml | 2 +- 37 files changed, 40 insertions(+), 45 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 8ec914808ce..39476694d22 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -375,4 +375,4 @@ لم يتم تعيين معلومات شخصية أضف الاسم والصورة وتفاصيل الاتصال في صفحة ملفك الشخصي. ماهي حالتك؟ - + diff --git a/app/src/main/res/values-b+en+001/strings.xml b/app/src/main/res/values-b+en+001/strings.xml index f264e91b622..9d1d61bd8e0 100644 --- a/app/src/main/res/values-b+en+001/strings.xml +++ b/app/src/main/res/values-b+en+001/strings.xml @@ -240,4 +240,4 @@ No personal info set Add name, picture and contact details on your profile page. What is your status? - + diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index 5e758a764bd..e39cde19f15 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -398,4 +398,4 @@ Няма зададена лична информация Добавяне на име, снимка и подробности за контакт към страницата на вашия профил. Какъв е вашият статус? - + diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 8a3c205c3d9..55bb714bf65 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -281,4 +281,4 @@ No hi ha arranjament d\'informació personal Afegiu el nom, foto i detalls de contacte a la vostra pàgina de perfil. Quin és el vostre estat? - + diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 7522f818314..60a85f12aab 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -341,7 +341,6 @@ Otevřít v aplikaci Soubory Přehrát/pozastavit hlasovou zprávu Přidat volbu - %1$s hlasů Upravit hlas Ukončit anketu Opravdu chcete tuto anketu ukončit? Toto nelze vzít zpět. @@ -413,4 +412,4 @@ Osobní údaje nejsou nastaveny Přidejte jméno, obrázek a kontaktní údaje na svou profilovou stránku. Jaký je váš stav? - + diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 24fa57be10a..e37e0644962 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -281,4 +281,4 @@ Personlig information ikke konfigureret Tilføj navn, billede og kontakt information på din profilside. Hvad er din status - + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7e9a73b2676..0db60d37f4a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -341,7 +341,6 @@ In Dateien-App öffnen Sprachnachricht wiedergeben/pausieren Option hinzufügen - %1$s Stimmen Abstimmung bearbeiten Umfrage beenden Soll diese Umfrage wirklich beendet werden? Das kann nicht rückgängig gemacht werden. @@ -413,4 +412,4 @@ Keine persönlichen Informationen eingestellt Fügen Sie Name, Bild und Kontaktdaten auf Ihrer Profilseite hinzu. Wie ist Ihr Status? - + diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index c6cd0da979d..6f6836f1be1 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -360,4 +360,4 @@ Δεν ορίστηκαν προσωπικές πληροφορίες Προσθέστε όνομα, εικόνα και λεπτομέρειες επικοινωνίας στο προφίλ σας. Ποια είναι η κατάστασή σας; - + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 92a6d76d9b4..295565df429 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -400,4 +400,4 @@ No se ha configurado la información personal Añade tu nombre, imagen y detalles de contacto en tu página de perfil. ¿Cuál es su estado? - + diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 199a9b57037..f1a661aa9af 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -341,7 +341,6 @@ Ireki Fitxategiak aplikazioan Erreproduzitu/pausatu ahots mezua Gehitu aukera - %1$s boto Editatu botoa Amaitu galdeketa Ziur zaude galdeketa hau bukatu nahi duzula? Ezingo da atzera egin. @@ -413,4 +412,4 @@ Ez da informazio pertsonalik ezarri Gehitu izena, irudia eta kontaktuko xehetasunak zure profilaren orrian Zein da zure egoera? - + diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index b35e23dfeb6..feb0f37df23 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -286,4 +286,4 @@ اطلاعات شخصی تنطیم نشده نام، تصویر و اطلاعات تماس را در صفحه نمایه خود اضافه کنید. وضعیت شما چیست؟ - + diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 8ddc04e431f..58c0d26a52c 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -344,4 +344,4 @@ Henkilökohtaisia tietoja ei ole asetettu Lisää nimi, kuva ja yhteystiedot profiilisivullasi. Mikä on tilatietosi? - + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index af0be4927df..0bb1a41367d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -398,4 +398,4 @@ Aucunes informations personnelles renseignées Ajouter le nom, la photo et les coordonnées sur votre page de profil. Quel est votre statut ? - + diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 268b6810f09..7447fa7e2ff 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -302,4 +302,4 @@ Non se estabeleceu a información persoal Engada o seu nome, imaxe e detalles de contacto na súa páxina de perfil. Cal é o seu estado? - + diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index db31c70357c..b92feae130e 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -373,4 +373,4 @@ Nisu postavljeni osobni podaci Dodajte ime, sliku i kontaktne podatke na stranicu profila. Koji je vaš status? - + diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index d4266b40191..8bed256410f 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -341,7 +341,6 @@ Megnyitás a Fájlok alkalmazásban Hangüzenet lejátszása/szüneteltetése Lehetőség hozzáadása - %1$s szavazat Szavazat szerkesztése Szavazás befejezése Több válasz @@ -411,4 +410,4 @@ Nincs személyes információ beállítva Adja meg a nevét, profilképét és kapcsolati adatait a profil oldalán. Mi az állapota? - + diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 0d9f3434078..e79889227f9 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -258,4 +258,4 @@ Engar persónulegar upplýsingar stilltar Bættu nafni, mynd og tengiliðaupplýsingum á forsíðuna þína. Hver er staðan á þér? - + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 67fa61c65a4..32ec08b4ccc 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -389,4 +389,4 @@ Nessuna informazione personale impostata Aggiungi nome, immagine e dettagli di contatto sulla tua pagina di profilo. Qual è il tuo stato? - + diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 2371778b7a3..82d9f60eb5e 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -277,4 +277,4 @@ לא הוגדרו פרטים אישיים הוספת שם, תמונה ופרטי קשר לעמוד הפרופיל שלך. מה המצב שלך? - + diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 3b121b1197d..50584b37e7e 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -395,4 +395,4 @@ 個人情報はありません プロフィールページに名前、写真、連絡先の詳細を追加します。 現在のオンラインステータスは? - + diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index afa427e00b4..941ea839f51 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -305,4 +305,4 @@ 개인 정보 설정되지 않음 프로필 페이지에 이름, 사진, 연락처를 추가하십시오. 당신의 상태는? - + diff --git a/app/src/main/res/values-lt-rLT/strings.xml b/app/src/main/res/values-lt-rLT/strings.xml index d9c32270e30..19206348751 100644 --- a/app/src/main/res/values-lt-rLT/strings.xml +++ b/app/src/main/res/values-lt-rLT/strings.xml @@ -268,4 +268,4 @@ Asmeninės informacijos nėra Pridėkite vardą, nuotrauką ir kontaktinę informaciją savo profilio puslapyje. Kokia jūsų būsena? - + diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index ecd526c6150..6ce4376acb1 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -285,4 +285,4 @@ Ingen personlig info satt Legg til navn, bilde og kontaktdetaljer på profilsiden. Hva er din status? - + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 4e52b5609bd..15bbc275327 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -386,4 +386,4 @@ Kies er eentje van een provider. Geen persoonlijke informatie ingesteld Voeg naam, foto en contactgegevens toe op je profielpagina. Wat is jouw status? - + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d5b31f90c00..7570ce521bf 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -341,7 +341,6 @@ Otwórz w aplikacji Pliki Odtwórz/wstrzymaj wiadomość głosową Dodaj opcję - %1$s głosów Edytuj głos Zakończ sondę Czy na pewno chcesz zakończyć sondę? Tego nie można cofnąć. @@ -413,4 +412,4 @@ Brak informacji osobistych Dodaj nazwę, zdjęcie profilowe i dane kontaktowe do swojego profilu. Jaki jest Twój status? - + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 357daa25a6d..26fbdd232a6 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -341,15 +341,17 @@ Abrir Arquivos no aplicativo Tocar/parar mensagem de voz Adicionar opção - %1$s votos Editar voto Encerrar enquete Você realmente quer terminar esta enquete? Isto não pode ser desfeito. Você não pode votar com mais opções para esta enquete. Várias respostas + Excluir opção %1$s + Opção %1$s Opções Enquete privada Pergunta + Sua pergunta Resultados Configurações Voto @@ -410,4 +412,4 @@ Nenhuma informação pessoal definida Adicione nome, foto e detalhes de contato em sua página de perfil. Qual é o seu status? - + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index a1b831ca8a5..dc0d4f65eba 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -397,4 +397,4 @@ Личная информация не указана На странице профиля укажите своё имя, добавьте изображение и подробные сведения Какой у вас статус? - + diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 495d118187f..d5990d79b92 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -359,4 +359,4 @@ Peruna impostatzione de datos personales Agiunghe nùmene, fotografia e detàllios de cuntatu in su profilu tuo. Cale est s\'istadu tuo? - + diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index 878907482ad..515a4a30bdf 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -397,4 +397,4 @@ Osobné informácie neboli nastavené Pridaj meno, obrázok a kontakt na profilovú stránku. Aký je váš stav? - + diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 8d068567c8b..1e5cf84a9d4 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -398,4 +398,4 @@ Osebni podatki še niso vpisani Dodajte ime, slike in podrobnosti na profilno stran. Kako želite nastaviti stanje? - + diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 0e8927a40a8..7cbe2483b9f 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -296,4 +296,4 @@ Ingen personlig info inställd Lägg till namn, bild och kontaktuppgifter på din profilsida. Vad är din status? - + diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 625b48a5d78..67f1f319574 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -341,7 +341,6 @@ Dosyalar uygulamasında aç Ses iletisini oynat/duraklat Seçenek ekle - %1$s oy Oyu düzenle Anleti sonlandır Bu anketi sonlandırmak istediğinize emin misiniz? Bu işlem geri alınamaz! @@ -413,4 +412,4 @@ Herhangi bir kişisel bilgi ayarlanmamış Profil sayfanızdan ad, görsel ve iletişim bilgilerinizi ekleyin. Durumunuz nedir? - + diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index ddba5b2306b..f29bdea89ef 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -316,4 +316,4 @@ Відсутня особиста інформація Додайте назву, зображення та деталі контакту на сторінці вашого профілю. Який твій статус? - + diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 0f0423ee51e..cf17fca9229 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -244,4 +244,4 @@ Không có thông tin cá nhân nào được đặt Thêm tên, hình ảnh và chi tiết liên hệ trên trang hồ sơ của bạn. Trạng thái của bạn là gì? - + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 1f4ab28772d..fe995dd5e54 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -376,4 +376,4 @@ 未设置个人信息 在你的个人资料页上添加姓名、图片和联系方式。 你什么状态? - + diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 9f03df09867..3bf3b9f2daf 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -341,7 +341,6 @@ 在“檔案”應用程式中打開 播放﹨暫停話音短訊 添加選項 - %1$s 選票 編輯選票 結束民意調查 你真的要結束這個民意調查嗎?這是無法撤消的。 @@ -413,4 +412,4 @@ 未設定個人資訊 在您的個人檔案中新增名字、頭像和聯絡資訊 您目前的狀態是什麼呢? - + diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 78068a734c4..b30362c6dee 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -278,4 +278,4 @@ 未設定個人資訊 在您的個人檔案中新增名字、大頭照和聯絡資訊。 您目前的狀態是什麼呢? - + From e074b827450288007f4db3e4819f80c12823152e Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sun, 7 Aug 2022 04:16:42 +0000 Subject: [PATCH 028/398] [tx-robot] updated from transifex Signed-off-by: Nextcloud bot --- app/src/main/res/values-cs-rCZ/strings.xml | 8 +++++++- app/src/main/res/values-de/strings.xml | 6 +++++- app/src/main/res/values-hu-rHU/strings.xml | 8 +++++++- app/src/main/res/values-zh-rHK/strings.xml | 5 ++++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 60a85f12aab..d7c88fd70bc 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -412,4 +412,10 @@ Osobní údaje nejsou nastaveny Přidejte jméno, obrázek a kontaktní údaje na svou profilovou stránku. Jaký je váš stav? - + + %d hlas + %d hlasy + %d hlasů + %d hlasy + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0db60d37f4a..b5751a91553 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -412,4 +412,8 @@ Keine persönlichen Informationen eingestellt Fügen Sie Name, Bild und Kontaktdaten auf Ihrer Profilseite hinzu. Wie ist Ihr Status? - + + %d Stimme + %d Stimmen + + diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 8bed256410f..0a7ac151d0f 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -343,6 +343,8 @@ Lehetőség hozzáadása Szavazat szerkesztése Szavazás befejezése + Biztos, hogy befejezi ezt a szavazást? Ez nem vonható vissza. + Nem szavazhat több lehetőségre ennél a szavazásnál. Több válasz %1$s. lehetőség törlése %1$s. lehetőség @@ -410,4 +412,8 @@ Nincs személyes információ beállítva Adja meg a nevét, profilképét és kapcsolati adatait a profil oldalán. Mi az állapota? - + + %d szavazat + %d szavazat + + diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 3bf3b9f2daf..f1fe842549d 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -412,4 +412,7 @@ 未設定個人資訊 在您的個人檔案中新增名字、頭像和聯絡資訊 您目前的狀態是什麼呢? - + + %d 選票 + + From 846124d68ba9141d5ec0cbc01a3d419e3bdf84c2 Mon Sep 17 00:00:00 2001 From: Nextcloud Android Bot Date: Mon, 8 Aug 2022 03:16:12 +0000 Subject: [PATCH 029/398] Weekly 14.2.0 Alpha 06 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index aae744c7e33..e54b909b324 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,8 +45,8 @@ android { // mayor.minor.hotfix.increment (for increment: 01-50=Alpha / 51-89=RC / 90-99=stable) // xx .xxx .xx .xx - versionCode 140020005 - versionName "14.2.0 Alpha 05" + versionCode 140020006 + versionName "14.2.0 Alpha 06" flavorDimensions "default" renderscriptTargetApi 19 From f572cfc08fab110136a86502c2d5083f4cc099df Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Mon, 8 Aug 2022 04:12:02 +0000 Subject: [PATCH 030/398] [tx-robot] updated from transifex Signed-off-by: Nextcloud bot --- app/src/main/res/values-ca/strings.xml | 2 ++ app/src/main/res/values-tr/strings.xml | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 55bb714bf65..0abc59f35de 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -248,9 +248,11 @@ Desa Sincronitza només amb servidors de confiança Federat + Només visible per a les persones d\'aquesta instància i convidats Local Privat Sincronitza amb servidors de confiança i amb la llibreta d\'adreces global i pública + Publicat fa uns segons Seleccionat Estableix l\'estat diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 67f1f319574..abc4437830c 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -412,4 +412,8 @@ Herhangi bir kişisel bilgi ayarlanmamış Profil sayfanızdan ad, görsel ve iletişim bilgilerinizi ekleyin. Durumunuz nedir? - + + %d oy + %d oy + + From 00f06c6ef2668a5db79936d18e1cdc4cb27cdbaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Tue, 26 Jul 2022 18:36:17 +0200 Subject: [PATCH 031/398] Shared items: Add tab for polls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves: #2029 Signed-off-by: Tim Krüger --- .../talk/controllers/ChatController.kt | 4 ++ .../controllers/ConversationInfoController.kt | 1 + .../activities/SharedItemsActivity.kt | 16 +++++++- .../adapters/SharedItemsAdapter.kt | 32 ++++++++++++++- .../adapters/SharedItemsListViewHolder.kt | 24 +++++++++++- .../adapters/SharedItemsViewHolder.kt | 13 +++++-- .../talk/shareditems/model/SharedFileItem.kt | 37 ++++++++++++++++++ .../talk/shareditems/model/SharedItem.kt | 39 +++---------------- .../talk/shareditems/model/SharedItemType.kt | 3 +- .../{SharedMediaItems.kt => SharedItems.kt} | 3 +- .../talk/shareditems/model/SharedPollItem.kt | 27 +++++++++++++ .../repositories/SharedItemsRepository.kt | 6 +-- .../repositories/SharedItemsRepositoryImpl.kt | 33 ++++++++++++---- .../viewmodels/SharedItemsViewModel.kt | 15 +++---- app/src/main/res/layout/shared_item_list.xml | 6 ++- app/src/main/res/values/strings.xml | 1 + 16 files changed, 196 insertions(+), 64 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/model/SharedFileItem.kt rename app/src/main/java/com/nextcloud/talk/shareditems/model/{SharedMediaItems.kt => SharedItems.kt} (95%) create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/model/SharedPollItem.kt diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 48a7fc96e60..864ebbcf16f 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -2557,6 +2557,10 @@ class ChatController(args: Bundle) : intent.putExtra(KEY_CONVERSATION_NAME, currentConversation?.displayName) intent.putExtra(KEY_ROOM_TOKEN, roomToken) intent.putExtra(KEY_USER_ENTITY, conversationUser as Parcelable) + intent.putExtra( + SharedItemsActivity.KEY_USER_IS_OWNER_OR_MODERATOR, + currentConversation?.isParticipantOwnerOrModerator + ) activity!!.startActivity(intent) } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt index b53196180d1..f3d49fcd65a 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt @@ -192,6 +192,7 @@ class ConversationInfoController(args: Bundle) : intent.putExtra(BundleKeys.KEY_CONVERSATION_NAME, conversation?.displayName) intent.putExtra(BundleKeys.KEY_ROOM_TOKEN, conversationToken) intent.putExtra(BundleKeys.KEY_USER_ENTITY, conversationUser as Parcelable) + intent.putExtra(SharedItemsActivity.KEY_USER_IS_OWNER_OR_MODERATOR, conversation?.isParticipantOwnerOrModerator) activity!!.startActivity(intent) } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 41ead5a201f..dabd5d1dbce 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -63,6 +63,7 @@ class SharedItemsActivity : AppCompatActivity() { val roomToken = intent.getStringExtra(KEY_ROOM_TOKEN)!! val conversationName = intent.getStringExtra(KEY_CONVERSATION_NAME) val user = intent.getParcelableExtra(KEY_USER_ENTITY)!! + val isUserConversationOwnerOrModerator = intent.getBooleanExtra(KEY_USER_IS_OWNER_OR_MODERATOR, false) binding = ActivitySharedItemsBinding.inflate(layoutInflater) setSupportActionBar(binding.sharedItemsToolbar) @@ -104,7 +105,12 @@ class SharedItemsActivity : AppCompatActivity() { LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) } - val adapter = SharedItemsAdapter(showGrid, user).apply { + val adapter = SharedItemsAdapter( + showGrid, + user, + roomToken, + isUserConversationOwnerOrModerator + ).apply { items = sharedMediaItems.items } binding.imageRecycler.adapter = adapter @@ -176,6 +182,13 @@ class SharedItemsActivity : AppCompatActivity() { binding.sharedItemsTabs.addTab(tabVoice) } + if (sharedItemTypes.contains(SharedItemType.POLL)) { + val tabVoice: TabLayout.Tab = binding.sharedItemsTabs.newTab() + tabVoice.tag = SharedItemType.POLL + tabVoice.setText(R.string.shared_items_poll) + binding.sharedItemsTabs.addTab(tabVoice) + } + // if(sharedItemTypes.contains(SharedItemType.LOCATION)) { // val tabLocation: TabLayout.Tab = binding.sharedItemsTabs.newTab() // tabLocation.tag = SharedItemType.LOCATION @@ -220,5 +233,6 @@ class SharedItemsActivity : AppCompatActivity() { companion object { private val TAG = SharedItemsActivity::class.simpleName const val SPAN_COUNT: Int = 4 + const val KEY_USER_IS_OWNER_OR_MODERATOR = "userIsOwnerOrModerator" } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt index c72f32a8b2b..5784b90df00 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt @@ -22,17 +22,24 @@ package com.nextcloud.talk.shareditems.adapters +import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.SharedItemGridBinding import com.nextcloud.talk.databinding.SharedItemListBinding +import com.nextcloud.talk.polls.ui.PollMainDialogFragment +import com.nextcloud.talk.shareditems.activities.SharedItemsActivity +import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.shareditems.model.SharedPollItem class SharedItemsAdapter( private val showGrid: Boolean, - private val user: User + private val user: User, + private val roomToken: String, + private val isUserConversationOwnerOrModerator: Boolean ) : RecyclerView.Adapter() { var items: List = emptyList() @@ -61,10 +68,31 @@ class SharedItemsAdapter( } override fun onBindViewHolder(holder: SharedItemsViewHolder, position: Int) { - holder.onBind(items[position]) + when (val item = items[position]) { + is SharedPollItem -> holder.onBind(item, ::showPoll) + is SharedFileItem -> holder.onBind(item) + } } override fun getItemCount(): Int { return items.size } + + private fun showPoll(item: SharedItem, context: Context) { + val pollVoteDialog = PollMainDialogFragment.newInstance( + user, + roomToken, + isUserConversationOwnerOrModerator, + item.id, + item.name + ) + pollVoteDialog.show( + (context as SharedItemsActivity).supportFragmentManager, + TAG + ) + } + + companion object { + private val TAG = SharedItemsAdapter::class.simpleName + } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt index 0f8e29423ab..1c1db0947a6 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt @@ -22,13 +22,18 @@ package com.nextcloud.talk.shareditems.adapters +import android.content.Context import android.text.format.Formatter import android.view.View import android.widget.ProgressBar +import androidx.core.content.ContextCompat import com.facebook.drawee.view.SimpleDraweeView +import com.nextcloud.talk.R import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.SharedItemListBinding +import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.shareditems.model.SharedPollItem import com.nextcloud.talk.utils.DateUtils class SharedItemsListViewHolder( @@ -43,12 +48,12 @@ class SharedItemsListViewHolder( override val progressBar: ProgressBar get() = binding.progressBar - override fun onBind(item: SharedItem) { + override fun onBind(item: SharedFileItem) { super.onBind(item) binding.fileName.text = item.name - binding.fileSize.text = item.fileSize?.let { + binding.fileSize.text = item.fileSize.let { Formatter.formatShortFileSize( binding.fileSize.context, it @@ -59,6 +64,21 @@ class SharedItemsListViewHolder( ) } + override fun onBind(item: SharedPollItem, showPoll: (item: SharedItem, context: Context) -> Unit) { + super.onBind(item, showPoll) + + binding.fileName.text = item.name + binding.fileMetadata.visibility = View.GONE + image.hierarchy.setPlaceholderImage(R.drawable.ic_baseline_bar_chart_24) + image.setColorFilter( + ContextCompat.getColor(image.context, R.color.high_emphasis_menu_icon), + android.graphics.PorterDuff.Mode.SRC_IN + ) + clickTarget.setOnClickListener { + showPoll(item, it.context) + } + } + companion object { private const val ONE_SECOND_IN_MILLIS = 1000 } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt index ee9d12be90e..47dad1d850d 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt @@ -22,6 +22,7 @@ package com.nextcloud.talk.shareditems.adapters +import android.content.Context import android.graphics.drawable.Drawable import android.net.Uri import android.util.Log @@ -39,14 +40,16 @@ import com.facebook.imagepipeline.common.RotationOptions import com.facebook.imagepipeline.image.ImageInfo import com.facebook.imagepipeline.request.ImageRequestBuilder import com.nextcloud.talk.data.user.model.User +import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.shareditems.model.SharedPollItem import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DrawableUtils import com.nextcloud.talk.utils.FileViewerUtils abstract class SharedItemsViewHolder( open val binding: ViewBinding, - private val user: User + internal val user: User ) : RecyclerView.ViewHolder(binding.root) { companion object { @@ -64,9 +67,9 @@ abstract class SharedItemsViewHolder( ) ) - open fun onBind(item: SharedItem) { + open fun onBind(item: SharedFileItem) { image.hierarchy.setPlaceholderImage(staticImage(item.mimeType, image)) - if (item.previewAvailable == true) { + if (item.previewAvailable) { image.controller = configurePreview(item) } @@ -100,7 +103,7 @@ abstract class SharedItemsViewHolder( ) } - private fun configurePreview(item: SharedItem): DraweeController { + private fun configurePreview(item: SharedFileItem): DraweeController { val imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(item.previewLink)) .setProgressiveRenderingEnabled(true) @@ -123,6 +126,8 @@ abstract class SharedItemsViewHolder( .build() } + open fun onBind(item: SharedPollItem, showPoll: (item: SharedItem, context: Context) -> Unit) {} + private fun staticImage( mimeType: String?, image: SimpleDraweeView diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedFileItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedFileItem.kt new file mode 100644 index 00000000000..2366b7e13f6 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedFileItem.kt @@ -0,0 +1,37 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Tim Krüger + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.shareditems.model + +data class SharedFileItem( + override val id: String, + override val name: String, + override val actorId: String, + override val actorName: String, + val fileSize: Long, + val date: Long, + val path: String, + val link: String, + val mimeType: String, + val previewAvailable: Boolean = false, + val previewLink: String +) : SharedItem diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt index 3a7033fe489..5c577b4c4d8 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt @@ -1,35 +1,8 @@ -/* - * Nextcloud Talk application - * - * @author Tim Krüger - * @author Álvaro Brey - * Copyright (C) 2022 Álvaro Brey - * Copyright (C) 2022 Tim Krüger - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.nextcloud.talk.shareditems.model -data class SharedItem( - val id: String, - val name: String, - val fileSize: Long?, - val date: Long, - val path: String, - val link: String?, - val mimeType: String?, - val previewAvailable: Boolean?, - val previewLink: String -) +interface SharedItem { + val id: String + val name: String + val actorId: String + val actorName: String +} diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItemType.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItemType.kt index caedd4c02e3..622e09642e7 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItemType.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItemType.kt @@ -32,7 +32,8 @@ enum class SharedItemType { VOICE, LOCATION, DECKCARD, - OTHER; + OTHER, + POLL; companion object { fun typeFor(name: String) = valueOf(name.uppercase(Locale.ROOT)) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItems.kt similarity index 95% rename from app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt rename to app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItems.kt index ef891ffc7fa..d15d932ae4f 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedMediaItems.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItems.kt @@ -22,8 +22,9 @@ package com.nextcloud.talk.shareditems.model -class SharedMediaItems( +class SharedItems( val items: List, + val type: SharedItemType, var lastSeenId: Int?, var moreItemsExisting: Boolean ) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedPollItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedPollItem.kt new file mode 100644 index 00000000000..367aba189f4 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedPollItem.kt @@ -0,0 +1,27 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * Copyright (C) 2022 Tim Krüger + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.nextcloud.talk.shareditems.model + +data class SharedPollItem( + override val id: String, + override val name: String, + override val actorId: String, + override val actorName: String, +) : SharedItem diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt index 62f69beeed8..89353f61108 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepository.kt @@ -23,7 +23,7 @@ package com.nextcloud.talk.shareditems.repositories import com.nextcloud.talk.shareditems.model.SharedItemType -import com.nextcloud.talk.shareditems.model.SharedMediaItems +import com.nextcloud.talk.shareditems.model.SharedItems import io.reactivex.Observable interface SharedItemsRepository { @@ -31,13 +31,13 @@ interface SharedItemsRepository { fun media( parameters: Parameters, type: SharedItemType - ): Observable? + ): Observable? fun media( parameters: Parameters, type: SharedItemType, lastKnownMessageId: Int? - ): Observable? + ): Observable? fun availableTypes(parameters: Parameters): Observable> diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt index 22745b08879..02131f050ee 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt @@ -27,9 +27,11 @@ import com.nextcloud.talk.R import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.models.json.chat.ChatShareOverall +import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedItemType -import com.nextcloud.talk.shareditems.model.SharedMediaItems +import com.nextcloud.talk.shareditems.model.SharedItems +import com.nextcloud.talk.shareditems.model.SharedPollItem import com.nextcloud.talk.utils.ApiUtils import io.reactivex.Observable import retrofit2.Response @@ -41,7 +43,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : override fun media( parameters: SharedItemsRepository.Parameters, type: SharedItemType - ): Observable? { + ): Observable? { return media(parameters, type, null) } @@ -49,7 +51,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : parameters: SharedItemsRepository.Parameters, type: SharedItemType, lastKnownMessageId: Int? - ): Observable? { + ): Observable? { val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) return ncApi.getSharedItems( @@ -58,13 +60,14 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : type.toString().lowercase(Locale.ROOT), lastKnownMessageId, BATCH_SIZE - ).map { map(it, parameters) } + ).map { map(it, parameters, type) } } private fun map( response: Response, - parameters: SharedItemsRepository.Parameters - ): SharedMediaItems { + parameters: SharedItemsRepository.Parameters, + type: SharedItemType + ): SharedItems { var chatLastGiven: Int? = null val items = mutableMapOf() @@ -76,15 +79,18 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : val mediaItems = response.body()!!.ocs!!.data if (mediaItems != null) { for (it in mediaItems) { + val actorParameters = it.value.messageParameters!!["actor"]!! if (it.value.messageParameters?.containsKey("file") == true) { val fileParameters = it.value.messageParameters!!["file"]!! val previewAvailable = "yes".equals(fileParameters["preview-available"]!!, ignoreCase = true) - items[it.value.id] = SharedItem( + items[it.value.id] = SharedFileItem( fileParameters["id"]!!, fileParameters["name"]!!, + actorParameters["id"]!!, + actorParameters["name"]!!, fileParameters["size"]!!.toLong(), it.value.timestamp, fileParameters["path"]!!, @@ -93,6 +99,16 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : previewAvailable, previewLink(fileParameters["id"], parameters.baseUrl) ) + } else if (it.value.messageParameters?.containsKey("object") == true) { + val objectParameters = it.value.messageParameters!!["object"]!! + if ("talk-poll" == objectParameters["type"]) { + items[it.value.id] = SharedPollItem( + objectParameters["id"]!!, + objectParameters["name"]!!, + actorParameters["id"]!!, + actorParameters["name"]!! + ) + } } else { Log.w(TAG, "location and deckcard are not yet supported") } @@ -102,8 +118,9 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : val sortedMutableItems = items.toSortedMap().values.toList().reversed().toMutableList() val moreItemsExisting = items.count() == BATCH_SIZE - return SharedMediaItems( + return SharedItems( sortedMutableItems, + type, chatLastGiven, moreItemsExisting ) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt index 3189411dc15..d5d7b81f039 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/viewmodels/SharedItemsViewModel.kt @@ -28,7 +28,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.shareditems.model.SharedItemType -import com.nextcloud.talk.shareditems.model.SharedMediaItems +import com.nextcloud.talk.shareditems.model.SharedItems import com.nextcloud.talk.shareditems.repositories.SharedItemsRepository import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers @@ -50,7 +50,7 @@ class SharedItemsViewModel @Inject constructor( class LoadingItemsState(types: Set, selectedType: SharedItemType) : TypesLoadedState(types, selectedType) - class LoadedState(types: Set, selectedType: SharedItemType, val items: SharedMediaItems) : + class LoadedState(types: Set, selectedType: SharedItemType, val items: SharedItems) : TypesLoadedState(types, selectedType) private val _viewState: MutableLiveData = MutableLiveData(InitialState) @@ -128,13 +128,13 @@ class SharedItemsViewModel @Inject constructor( } } - inner class SharedMediaItemsObserver : Observer { + inner class SharedMediaItemsObserver : Observer { - var newSharedItems: SharedMediaItems? = null + var newSharedItems: SharedItems? = null override fun onSubscribe(d: Disposable) = Unit - override fun onNext(response: SharedMediaItems) { + override fun onNext(response: SharedItems) { newSharedItems = response } @@ -148,8 +148,9 @@ class SharedItemsViewModel @Inject constructor( if (state is LoadedState) { val oldItems = state.items.items val newItems = - SharedMediaItems( + SharedItems( oldItems + newSharedItems!!.items, + state.items.type, newSharedItems!!.lastSeenId, newSharedItems!!.moreItemsExisting ) @@ -159,7 +160,7 @@ class SharedItemsViewModel @Inject constructor( } } - private fun setCurrentState(items: SharedMediaItems) { + private fun setCurrentState(items: SharedItems) { when (val state = this@SharedItemsViewModel._viewState.value) { is TypesLoadedState -> { this@SharedItemsViewModel._viewState.value = LoadedState( diff --git a/app/src/main/res/layout/shared_item_list.xml b/app/src/main/res/layout/shared_item_list.xml index fe7313e75b9..81c680408c5 100644 --- a/app/src/main/res/layout/shared_item_list.xml +++ b/app/src/main/res/layout/shared_item_list.xml @@ -78,6 +78,7 @@ tools:text="Filename.md" /> @@ -91,12 +92,13 @@ tools:text="11 KB" /> + tools:text="04-05-2022 21:16" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0860f900d12..7afb8877951 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -523,6 +523,7 @@ Audio Voice Other + Poll Messages From d5214ee29c193e0756210a44f4f99b02efea5e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Thu, 28 Jul 2022 18:01:55 +0200 Subject: [PATCH 032/398] Replace '@JvmField' with 'lateinit' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- .../talk/controllers/ConversationInfoController.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt index f3d49fcd65a..866a5024ff3 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt @@ -107,12 +107,10 @@ class ConversationInfoController(args: Bundle) : private val binding: ControllerConversationInfoBinding by viewBinding(ControllerConversationInfoBinding::bind) @Inject - @JvmField - var ncApi: NcApi? = null + lateinit var ncApi: NcApi @Inject - @JvmField - var eventBus: EventBus? = null + lateinit var eventBus: EventBus private val conversationToken: String? private val conversationUser: User? @@ -162,7 +160,7 @@ class ConversationInfoController(args: Bundle) : override fun onAttach(view: View) { super.onAttach(view) - eventBus?.register(this) + eventBus.register(this) if (databaseStorageModule == null) { databaseStorageModule = DatabaseStorageModule(conversationUser!!, conversationToken) From 26fde13292c75a88747d884f9197916ad64a5efc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Mon, 8 Aug 2022 18:50:10 +0200 Subject: [PATCH 033/398] Shared items: Add tab for locations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves: #2029 Signed-off-by: Tim Krüger --- .../activities/SharedItemsActivity.kt | 90 ++++++++++--------- .../adapters/SharedItemsAdapter.kt | 2 + .../adapters/SharedItemsListViewHolder.kt | 21 +++++ .../adapters/SharedItemsViewHolder.kt | 3 + .../shareditems/model/SharedLocationItem.kt | 30 +++++++ .../repositories/SharedItemsRepositoryImpl.kt | 29 ++++-- app/src/main/res/values/strings.xml | 1 + 7 files changed, 128 insertions(+), 48 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/model/SharedLocationItem.kt diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index dabd5d1dbce..2392346bdde 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -86,40 +86,7 @@ class SharedItemsActivity : AppCompatActivity() { viewModel = ViewModelProvider(this, viewModelFactory)[SharedItemsViewModel::class.java] viewModel.viewState.observe(this) { state -> - clearEmptyLoading() - when (state) { - is SharedItemsViewModel.LoadingItemsState, SharedItemsViewModel.InitialState -> { - showLoading() - } - is SharedItemsViewModel.NoSharedItemsState -> { - showEmpty() - } - is SharedItemsViewModel.LoadedState -> { - val sharedMediaItems = state.items - Log.d(TAG, "Items received: $sharedMediaItems") - - val showGrid = state.selectedType == SharedItemType.MEDIA - val layoutManager = if (showGrid) { - GridLayoutManager(this, SPAN_COUNT) - } else { - LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) - } - - val adapter = SharedItemsAdapter( - showGrid, - user, - roomToken, - isUserConversationOwnerOrModerator - ).apply { - items = sharedMediaItems.items - } - binding.imageRecycler.adapter = adapter - binding.imageRecycler.layoutManager = layoutManager - } - is SharedItemsViewModel.TypesLoadedState -> { - initTabs(state.types) - } - } + handleModelChange(state, user, roomToken, isUserConversationOwnerOrModerator) } binding.imageRecycler.addOnScrollListener(object : RecyclerView.OnScrollListener() { @@ -134,6 +101,49 @@ class SharedItemsActivity : AppCompatActivity() { viewModel.initialize(user, roomToken) } + private fun handleModelChange( + state: SharedItemsViewModel.ViewState?, + user: User, + roomToken: String, + isUserConversationOwnerOrModerator: Boolean + ) { + clearEmptyLoading() + when (state) { + is SharedItemsViewModel.LoadingItemsState, SharedItemsViewModel.InitialState -> { + showLoading() + } + is SharedItemsViewModel.NoSharedItemsState -> { + showEmpty() + } + is SharedItemsViewModel.LoadedState -> { + val sharedMediaItems = state.items + Log.d(TAG, "Items received: $sharedMediaItems") + + val showGrid = state.selectedType == SharedItemType.MEDIA + val layoutManager = if (showGrid) { + GridLayoutManager(this, SPAN_COUNT) + } else { + LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + } + + val adapter = SharedItemsAdapter( + showGrid, + user, + roomToken, + isUserConversationOwnerOrModerator + ).apply { + items = sharedMediaItems.items + } + binding.imageRecycler.adapter = adapter + binding.imageRecycler.layoutManager = layoutManager + } + is SharedItemsViewModel.TypesLoadedState -> { + initTabs(state.types) + } + else -> {} + } + } + private fun clearEmptyLoading() { binding.sharedItemsTabs.visibility = View.VISIBLE binding.emptyContainer.emptyListView.visibility = View.GONE @@ -189,12 +199,12 @@ class SharedItemsActivity : AppCompatActivity() { binding.sharedItemsTabs.addTab(tabVoice) } - // if(sharedItemTypes.contains(SharedItemType.LOCATION)) { - // val tabLocation: TabLayout.Tab = binding.sharedItemsTabs.newTab() - // tabLocation.tag = SharedItemType.LOCATION - // tabLocation.text = "location" - // binding.sharedItemsTabs.addTab(tabLocation) - // } + if (sharedItemTypes.contains(SharedItemType.LOCATION)) { + val tabLocation: TabLayout.Tab = binding.sharedItemsTabs.newTab() + tabLocation.tag = SharedItemType.LOCATION + tabLocation.setText(R.string.nc_shared_items_location) + binding.sharedItemsTabs.addTab(tabLocation) + } // if(sharedItemTypes.contains(SharedItemType.DECKCARD)) { // val tabDeckCard: TabLayout.Tab = binding.sharedItemsTabs.newTab() diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt index 5784b90df00..47a7e44a4bb 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt @@ -33,6 +33,7 @@ import com.nextcloud.talk.polls.ui.PollMainDialogFragment import com.nextcloud.talk.shareditems.activities.SharedItemsActivity import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.shareditems.model.SharedLocationItem import com.nextcloud.talk.shareditems.model.SharedPollItem class SharedItemsAdapter( @@ -71,6 +72,7 @@ class SharedItemsAdapter( when (val item = items[position]) { is SharedPollItem -> holder.onBind(item, ::showPoll) is SharedFileItem -> holder.onBind(item) + is SharedLocationItem -> holder.onBind(item) } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt index 1c1db0947a6..4dc88fc331b 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt @@ -23,6 +23,7 @@ package com.nextcloud.talk.shareditems.adapters import android.content.Context +import android.content.Intent import android.text.format.Formatter import android.view.View import android.widget.ProgressBar @@ -33,6 +34,7 @@ import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.SharedItemListBinding import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.shareditems.model.SharedLocationItem import com.nextcloud.talk.shareditems.model.SharedPollItem import com.nextcloud.talk.utils.DateUtils @@ -79,6 +81,25 @@ class SharedItemsListViewHolder( } } + override fun onBind(item: SharedLocationItem) { + super.onBind(item) + + binding.fileName.text = item.name + binding.fileMetadata.visibility = View.GONE + image.hierarchy.setPlaceholderImage(R.drawable.ic_baseline_location_on_24) + image.setColorFilter( + ContextCompat.getColor(image.context, R.color.high_emphasis_menu_icon), + android.graphics.PorterDuff.Mode.SRC_IN + ) + + clickTarget.setOnClickListener { + + val browserIntent = Intent(Intent.ACTION_VIEW, item.geoUri) + browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + it.context.startActivity(browserIntent) + } + } + companion object { private const val ONE_SECOND_IN_MILLIS = 1000 } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt index 47dad1d850d..1cf78f8ad5c 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt @@ -42,6 +42,7 @@ import com.facebook.imagepipeline.request.ImageRequestBuilder import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.shareditems.model.SharedLocationItem import com.nextcloud.talk.shareditems.model.SharedPollItem import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DrawableUtils @@ -128,6 +129,8 @@ abstract class SharedItemsViewHolder( open fun onBind(item: SharedPollItem, showPoll: (item: SharedItem, context: Context) -> Unit) {} + open fun onBind(item: SharedLocationItem) {} + private fun staticImage( mimeType: String?, image: SimpleDraweeView diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedLocationItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedLocationItem.kt new file mode 100644 index 00000000000..2d5c6ea2b0e --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedLocationItem.kt @@ -0,0 +1,30 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * Copyright (C) 2022 Tim Krüger + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.nextcloud.talk.shareditems.model + +import android.net.Uri + +data class SharedLocationItem( + override val id: String, + override val name: String, + override val actorId: String, + override val actorName: String, + val geoUri: Uri +) : SharedItem diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt index 02131f050ee..c3babb654b2 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt @@ -22,6 +22,7 @@ package com.nextcloud.talk.shareditems.repositories +import android.net.Uri import android.util.Log import com.nextcloud.talk.R import com.nextcloud.talk.api.NcApi @@ -31,6 +32,7 @@ import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedItemType import com.nextcloud.talk.shareditems.model.SharedItems +import com.nextcloud.talk.shareditems.model.SharedLocationItem import com.nextcloud.talk.shareditems.model.SharedPollItem import com.nextcloud.talk.utils.ApiUtils import io.reactivex.Observable @@ -101,16 +103,27 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : ) } else if (it.value.messageParameters?.containsKey("object") == true) { val objectParameters = it.value.messageParameters!!["object"]!! - if ("talk-poll" == objectParameters["type"]) { - items[it.value.id] = SharedPollItem( - objectParameters["id"]!!, - objectParameters["name"]!!, - actorParameters["id"]!!, - actorParameters["name"]!! - ) + when (objectParameters["type"]) { + "talk-poll" -> { + items[it.value.id] = SharedPollItem( + objectParameters["id"]!!, + objectParameters["name"]!!, + actorParameters["id"]!!, + actorParameters["name"]!! + ) + } + "geo-location" -> { + items[it.value.id] = SharedLocationItem( + objectParameters["id"]!!, + objectParameters["name"]!!, + actorParameters["id"]!!, + actorParameters["name"]!!, + Uri.parse(objectParameters["id"]!!.replace("geo:", "geo:0,0?z=11&q=")) + ) + } } } else { - Log.w(TAG, "location and deckcard are not yet supported") + Log.w(TAG, "Item contains neither 'file' or 'object'.") } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7afb8877951..a9e33225336 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -430,6 +430,7 @@ Shared items Images, files, voice messages … No shared items + Location Talk recording from %1$s (%2$s) From fa91ba469104e4ecb17b062e058b138b7c689679 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Tue, 9 Aug 2022 04:14:40 +0000 Subject: [PATCH 034/398] [tx-robot] updated from transifex Signed-off-by: Nextcloud bot --- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-eu/strings.xml | 6 +++++- app/src/main/res/values-pl/strings.xml | 8 +++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b5751a91553..0b125cfd2f1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -346,7 +346,7 @@ Soll diese Umfrage wirklich beendet werden? Das kann nicht rückgängig gemacht werden. Sie können nicht mit mehreren Optionen für diese Umfrage abstimmen. Mehrere Antworten - Lösche Option %1$s + Option %1$s löschen Option %1$s Optionen Private Umfrage diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index f1a661aa9af..f772aef05af 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -412,4 +412,8 @@ Ez da informazio pertsonalik ezarri Gehitu izena, irudia eta kontaktuko xehetasunak zure profilaren orrian Zein da zure egoera? - + + Boto %d + %d boto + + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 7570ce521bf..acc12c5112b 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -412,4 +412,10 @@ Brak informacji osobistych Dodaj nazwę, zdjęcie profilowe i dane kontaktowe do swojego profilu. Jaki jest Twój status? - + + %d głos + %d głosy + %d głosów + %d głosów + + From 81a3e8216dd947abfe1038a5ab040f9c67d3a62b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Tue, 9 Aug 2022 14:00:00 +0200 Subject: [PATCH 035/398] Shared items: Add tab for other MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves: #2029 Signed-off-by: Tim Krüger --- .../activities/SharedItemsActivity.kt | 12 ++++----- .../adapters/SharedItemsAdapter.kt | 2 ++ .../adapters/SharedItemsListViewHolder.kt | 13 +++++++++ .../adapters/SharedItemsViewHolder.kt | 3 +++ .../talk/shareditems/model/SharedOtherItem.kt | 27 +++++++++++++++++++ .../repositories/SharedItemsRepositoryImpl.kt | 9 +++++++ 6 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/model/SharedOtherItem.kt diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 2392346bdde..483dbbeb672 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -213,12 +213,12 @@ class SharedItemsActivity : AppCompatActivity() { // binding.sharedItemsTabs.addTab(tabDeckCard) // } - // if(sharedItemTypes.contains(SharedItemType.OTHER)) { - // val tabOther: TabLayout.Tab = binding.sharedItemsTabs.newTab() - // tabOther.tag = SharedItemType.OTHER - // tabOther.setText(R.string.shared_items_other) - // binding.sharedItemsTabs.addTab(tabOther) - // } + if (sharedItemTypes.contains(SharedItemType.OTHER)) { + val tabOther: TabLayout.Tab = binding.sharedItemsTabs.newTab() + tabOther.tag = SharedItemType.OTHER + tabOther.setText(R.string.shared_items_other) + binding.sharedItemsTabs.addTab(tabOther) + } binding.sharedItemsTabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt index 47a7e44a4bb..0445195ab73 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt @@ -34,6 +34,7 @@ import com.nextcloud.talk.shareditems.activities.SharedItemsActivity import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedLocationItem +import com.nextcloud.talk.shareditems.model.SharedOtherItem import com.nextcloud.talk.shareditems.model.SharedPollItem class SharedItemsAdapter( @@ -73,6 +74,7 @@ class SharedItemsAdapter( is SharedPollItem -> holder.onBind(item, ::showPoll) is SharedFileItem -> holder.onBind(item) is SharedLocationItem -> holder.onBind(item) + is SharedOtherItem -> holder.onBind(item) } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt index 4dc88fc331b..28195e0ee81 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt @@ -35,6 +35,7 @@ import com.nextcloud.talk.databinding.SharedItemListBinding import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedLocationItem +import com.nextcloud.talk.shareditems.model.SharedOtherItem import com.nextcloud.talk.shareditems.model.SharedPollItem import com.nextcloud.talk.utils.DateUtils @@ -100,6 +101,18 @@ class SharedItemsListViewHolder( } } + override fun onBind(item: SharedOtherItem) { + super.onBind(item) + + binding.fileName.text = item.name + binding.fileMetadata.visibility = View.GONE + image.hierarchy.setPlaceholderImage(R.drawable.ic_mimetype_file) + image.setColorFilter( + ContextCompat.getColor(image.context, R.color.high_emphasis_menu_icon), + android.graphics.PorterDuff.Mode.SRC_IN + ) + } + companion object { private const val ONE_SECOND_IN_MILLIS = 1000 } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt index 1cf78f8ad5c..0c05be81fb9 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt @@ -43,6 +43,7 @@ import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedLocationItem +import com.nextcloud.talk.shareditems.model.SharedOtherItem import com.nextcloud.talk.shareditems.model.SharedPollItem import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DrawableUtils @@ -131,6 +132,8 @@ abstract class SharedItemsViewHolder( open fun onBind(item: SharedLocationItem) {} + open fun onBind(item: SharedOtherItem) {} + private fun staticImage( mimeType: String?, image: SimpleDraweeView diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedOtherItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedOtherItem.kt new file mode 100644 index 00000000000..7d3ae324a9e --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedOtherItem.kt @@ -0,0 +1,27 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * Copyright (C) 2022 Tim Krüger + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.nextcloud.talk.shareditems.model + +data class SharedOtherItem( + override val id: String, + override val name: String, + override val actorId: String, + override val actorName: String, +) : SharedItem diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt index c3babb654b2..f2d66956077 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt @@ -33,6 +33,7 @@ import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedItemType import com.nextcloud.talk.shareditems.model.SharedItems import com.nextcloud.talk.shareditems.model.SharedLocationItem +import com.nextcloud.talk.shareditems.model.SharedOtherItem import com.nextcloud.talk.shareditems.model.SharedPollItem import com.nextcloud.talk.utils.ApiUtils import io.reactivex.Observable @@ -121,6 +122,14 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : Uri.parse(objectParameters["id"]!!.replace("geo:", "geo:0,0?z=11&q=")) ) } + else -> { + items[it.value.id] = SharedOtherItem( + objectParameters["id"]!!, + objectParameters["name"]!!, + actorParameters["id"]!!, + actorParameters["name"]!! + ) + } } } else { Log.w(TAG, "Item contains neither 'file' or 'object'.") From a7a56a64a48e6e7cc0b26ef0713af4f7920e9ec1 Mon Sep 17 00:00:00 2001 From: drone Date: Tue, 9 Aug 2022 12:06:37 +0000 Subject: [PATCH 036/398] Drone: update Lint results to reflect reduced error/warning count [skip ci] Signed-off-by: drone --- scripts/analysis/lint-results.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/analysis/lint-results.txt b/scripts/analysis/lint-results.txt index 02dd5476d95..ce07a366cd3 100644 --- a/scripts/analysis/lint-results.txt +++ b/scripts/analysis/lint-results.txt @@ -1,2 +1,2 @@ DO NOT TOUCH; GENERATED BY DRONE - Lint Report: 1 error and 112 warnings + Lint Report: 1 error and 111 warnings From e321c02b2531e72bd86fd922134a336150187bf9 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 9 Aug 2022 16:49:57 +0200 Subject: [PATCH 037/398] Fix branch detection for drone PRs Signed-off-by: Joas Schilling --- .drone.yml | 2 +- scripts/analysis/analysis-wrapper.sh | 3 ++- scripts/analysis/getBranchName.sh | 9 +++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 scripts/analysis/getBranchName.sh diff --git a/.drone.yml b/.drone.yml index e34bf032f99..559e4041225 100644 --- a/.drone.yml +++ b/.drone.yml @@ -94,7 +94,7 @@ steps: LOG_PASSWORD: from_secret: LOG_PASSWORD commands: - - export BRANCH=$(git branch | grep '*' | cut -d' ' -f2) + - export BRANCH=$(scripts/analysis/getBranchName.sh $GIT_USERNAME $GIT_TOKEN $DRONE_PULL_REQUEST) - scripts/analysis/analysis-wrapper.sh $GIT_USERNAME $GIT_TOKEN $BRANCH $LOG_USERNAME $LOG_PASSWORD $DRONE_BUILD_NUMBER $DRONE_PULL_REQUEST - name: notify diff --git a/scripts/analysis/analysis-wrapper.sh b/scripts/analysis/analysis-wrapper.sh index 5dde79b43df..1720ba4f0ce 100755 --- a/scripts/analysis/analysis-wrapper.sh +++ b/scripts/analysis/analysis-wrapper.sh @@ -11,7 +11,8 @@ repository="talk" -if [[ $3 = \stable-* ]] ; then +stableBranch=$(git branch | grep '*' | cut -d' ' -f2) +if [[ $stableBranch = \stable-* ]] ; then stableBranch=$3 else stableBranch="master" diff --git a/scripts/analysis/getBranchName.sh b/scripts/analysis/getBranchName.sh new file mode 100644 index 00000000000..300f864a5fe --- /dev/null +++ b/scripts/analysis/getBranchName.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# $1: username, $2: password/token, $3: pull request number + +if [ -z $3 ] ; then + git branch | grep '*' | cut -d' ' -f2 +else + curl 2>/dev/null -u $1:$2 https://api.github.com/repos/nextcloud/talk-android/pulls/$3 | grep \"ref\": | grep -v master | cut -d"\"" -f4 +fi From 6502f2c5ccffccb0e74e79380527f99e3dcfddd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Tue, 9 Aug 2022 17:23:51 +0200 Subject: [PATCH 038/398] Bump spotbugs-results to 141 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- scripts/analysis/findbugs-results.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/analysis/findbugs-results.txt b/scripts/analysis/findbugs-results.txt index c2807f7f3ce..b4f334f2651 100644 --- a/scripts/analysis/findbugs-results.txt +++ b/scripts/analysis/findbugs-results.txt @@ -1 +1 @@ -140 \ No newline at end of file +141 From 4c8c8ac98a28e7bb068c5904aa88455911860b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Tue, 9 Aug 2022 14:29:58 +0200 Subject: [PATCH 039/398] Shared items: Show actor and date-time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For all item types it will now shown who (actor) and when (date-time) the item was shared. Signed-off-by: Tim Krüger --- .../adapters/SharedItemsListViewHolder.kt | 25 +++++++++++-------- .../talk/shareditems/model/SharedFileItem.kt | 2 +- .../talk/shareditems/model/SharedItem.kt | 1 + .../shareditems/model/SharedLocationItem.kt | 1 + .../talk/shareditems/model/SharedOtherItem.kt | 1 + .../talk/shareditems/model/SharedPollItem.kt | 1 + .../repositories/SharedItemsRepositoryImpl.kt | 15 ++++++++--- app/src/main/res/layout/controller_chat.xml | 2 +- app/src/main/res/layout/shared_item_list.xml | 21 +++++++++++++++- 9 files changed, 52 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt index 28195e0ee81..be36eb630c3 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt @@ -37,7 +37,6 @@ import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedLocationItem import com.nextcloud.talk.shareditems.model.SharedOtherItem import com.nextcloud.talk.shareditems.model.SharedPollItem -import com.nextcloud.talk.utils.DateUtils class SharedItemsListViewHolder( override val binding: SharedItemListBinding, @@ -62,16 +61,18 @@ class SharedItemsListViewHolder( it ) } - binding.fileDate.text = DateUtils.getLocalDateTimeStringFromTimestamp( - item.date * ONE_SECOND_IN_MILLIS - ) + binding.fileDate.text = item.dateTime + binding.actor.text = item.actorName } override fun onBind(item: SharedPollItem, showPoll: (item: SharedItem, context: Context) -> Unit) { super.onBind(item, showPoll) binding.fileName.text = item.name - binding.fileMetadata.visibility = View.GONE + binding.fileSize.visibility = View.GONE + binding.separator1.visibility = View.GONE + binding.fileDate.text = item.dateTime + binding.actor.text = item.actorName image.hierarchy.setPlaceholderImage(R.drawable.ic_baseline_bar_chart_24) image.setColorFilter( ContextCompat.getColor(image.context, R.color.high_emphasis_menu_icon), @@ -86,7 +87,10 @@ class SharedItemsListViewHolder( super.onBind(item) binding.fileName.text = item.name - binding.fileMetadata.visibility = View.GONE + binding.fileSize.visibility = View.GONE + binding.separator1.visibility = View.GONE + binding.fileDate.text = item.dateTime + binding.actor.text = item.actorName image.hierarchy.setPlaceholderImage(R.drawable.ic_baseline_location_on_24) image.setColorFilter( ContextCompat.getColor(image.context, R.color.high_emphasis_menu_icon), @@ -105,15 +109,14 @@ class SharedItemsListViewHolder( super.onBind(item) binding.fileName.text = item.name - binding.fileMetadata.visibility = View.GONE + binding.fileSize.visibility = View.GONE + binding.separator1.visibility = View.GONE + binding.fileDate.text = item.dateTime + binding.actor.text = item.actorName image.hierarchy.setPlaceholderImage(R.drawable.ic_mimetype_file) image.setColorFilter( ContextCompat.getColor(image.context, R.color.high_emphasis_menu_icon), android.graphics.PorterDuff.Mode.SRC_IN ) } - - companion object { - private const val ONE_SECOND_IN_MILLIS = 1000 - } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedFileItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedFileItem.kt index 2366b7e13f6..904dc0b127e 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedFileItem.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedFileItem.kt @@ -27,8 +27,8 @@ data class SharedFileItem( override val name: String, override val actorId: String, override val actorName: String, + override val dateTime: String, val fileSize: Long, - val date: Long, val path: String, val link: String, val mimeType: String, diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt index 5c577b4c4d8..7575ae2bb87 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedItem.kt @@ -5,4 +5,5 @@ interface SharedItem { val name: String val actorId: String val actorName: String + val dateTime: String } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedLocationItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedLocationItem.kt index 2d5c6ea2b0e..291840e13e2 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedLocationItem.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedLocationItem.kt @@ -26,5 +26,6 @@ data class SharedLocationItem( override val name: String, override val actorId: String, override val actorName: String, + override val dateTime: String, val geoUri: Uri ) : SharedItem diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedOtherItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedOtherItem.kt index 7d3ae324a9e..9d23a6a614f 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedOtherItem.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedOtherItem.kt @@ -24,4 +24,5 @@ data class SharedOtherItem( override val name: String, override val actorId: String, override val actorName: String, + override val dateTime: String ) : SharedItem diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedPollItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedPollItem.kt index 367aba189f4..ed19917b143 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedPollItem.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedPollItem.kt @@ -24,4 +24,5 @@ data class SharedPollItem( override val name: String, override val actorId: String, override val actorName: String, + override val dateTime: String ) : SharedItem diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt index f2d66956077..d35ebdd0a2f 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt @@ -36,6 +36,7 @@ import com.nextcloud.talk.shareditems.model.SharedLocationItem import com.nextcloud.talk.shareditems.model.SharedOtherItem import com.nextcloud.talk.shareditems.model.SharedPollItem import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.DateUtils import io.reactivex.Observable import retrofit2.Response import java.util.Locale @@ -83,6 +84,10 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : if (mediaItems != null) { for (it in mediaItems) { val actorParameters = it.value.messageParameters!!["actor"]!! + val dateTime = DateUtils.getLocalDateTimeStringFromTimestamp( + it.value.timestamp * ONE_SECOND_IN_MILLIS + ) + if (it.value.messageParameters?.containsKey("file") == true) { val fileParameters = it.value.messageParameters!!["file"]!! @@ -94,8 +99,8 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : fileParameters["name"]!!, actorParameters["id"]!!, actorParameters["name"]!!, + dateTime, fileParameters["size"]!!.toLong(), - it.value.timestamp, fileParameters["path"]!!, fileParameters["link"]!!, fileParameters["mimetype"]!!, @@ -110,7 +115,8 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : objectParameters["id"]!!, objectParameters["name"]!!, actorParameters["id"]!!, - actorParameters["name"]!! + actorParameters["name"]!!, + dateTime ) } "geo-location" -> { @@ -119,6 +125,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : objectParameters["name"]!!, actorParameters["id"]!!, actorParameters["name"]!!, + dateTime, Uri.parse(objectParameters["id"]!!.replace("geo:", "geo:0,0?z=11&q=")) ) } @@ -127,7 +134,8 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : objectParameters["id"]!!, objectParameters["name"]!!, actorParameters["id"]!!, - actorParameters["name"]!! + actorParameters["name"]!!, + dateTime ) } } @@ -182,6 +190,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : companion object { const val BATCH_SIZE: Int = 28 + private const val ONE_SECOND_IN_MILLIS = 1000 private val TAG = SharedItemsRepositoryImpl::class.simpleName } } diff --git a/app/src/main/res/layout/controller_chat.xml b/app/src/main/res/layout/controller_chat.xml index 5453d27df5e..60be4c6d479 100644 --- a/app/src/main/res/layout/controller_chat.xml +++ b/app/src/main/res/layout/controller_chat.xml @@ -115,7 +115,7 @@ android:orientation="vertical"> diff --git a/app/src/main/res/layout/shared_item_list.xml b/app/src/main/res/layout/shared_item_list.xml index 81c680408c5..5b399bc0fb9 100644 --- a/app/src/main/res/layout/shared_item_list.xml +++ b/app/src/main/res/layout/shared_item_list.xml @@ -92,7 +92,7 @@ tools:text="11 KB" /> + + + + From 43f2d1badf5ccfcb44e67898d1924b83f6a4f3d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Tue, 9 Aug 2022 18:26:48 +0200 Subject: [PATCH 040/398] Shared items: Add tab for deck cards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deck cards will be opened in the web browser because no specific view exists. Resolves: #2029 Signed-off-by: Tim Krüger --- .../activities/SharedItemsActivity.kt | 12 +-- .../adapters/SharedItemsAdapter.kt | 2 + .../adapters/SharedItemsListViewHolder.kt | 23 +++++- .../adapters/SharedItemsViewHolder.kt | 3 + .../shareditems/model/SharedDeckCardItem.kt | 31 +++++++ .../repositories/SharedItemsRepositoryImpl.kt | 80 ++++++++++++------- app/src/main/res/values/strings.xml | 2 +- 7 files changed, 115 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/shareditems/model/SharedDeckCardItem.kt diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 483dbbeb672..2689e082921 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -206,12 +206,12 @@ class SharedItemsActivity : AppCompatActivity() { binding.sharedItemsTabs.addTab(tabLocation) } - // if(sharedItemTypes.contains(SharedItemType.DECKCARD)) { - // val tabDeckCard: TabLayout.Tab = binding.sharedItemsTabs.newTab() - // tabDeckCard.tag = SharedItemType.DECKCARD - // tabDeckCard.text = "deckcard" - // binding.sharedItemsTabs.addTab(tabDeckCard) - // } + if (sharedItemTypes.contains(SharedItemType.DECKCARD)) { + val tabDeckCard: TabLayout.Tab = binding.sharedItemsTabs.newTab() + tabDeckCard.tag = SharedItemType.DECKCARD + tabDeckCard.setText(R.string.nc_shared_items_deck_card) + binding.sharedItemsTabs.addTab(tabDeckCard) + } if (sharedItemTypes.contains(SharedItemType.OTHER)) { val tabOther: TabLayout.Tab = binding.sharedItemsTabs.newTab() diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt index 0445195ab73..ac98b91b1fd 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt @@ -31,6 +31,7 @@ import com.nextcloud.talk.databinding.SharedItemGridBinding import com.nextcloud.talk.databinding.SharedItemListBinding import com.nextcloud.talk.polls.ui.PollMainDialogFragment import com.nextcloud.talk.shareditems.activities.SharedItemsActivity +import com.nextcloud.talk.shareditems.model.SharedDeckCardItem import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedLocationItem @@ -75,6 +76,7 @@ class SharedItemsAdapter( is SharedFileItem -> holder.onBind(item) is SharedLocationItem -> holder.onBind(item) is SharedOtherItem -> holder.onBind(item) + is SharedDeckCardItem -> holder.onBind(item) } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt index be36eb630c3..d1ec51e090f 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt @@ -32,6 +32,7 @@ import com.facebook.drawee.view.SimpleDraweeView import com.nextcloud.talk.R import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.SharedItemListBinding +import com.nextcloud.talk.shareditems.model.SharedDeckCardItem import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedLocationItem @@ -98,7 +99,6 @@ class SharedItemsListViewHolder( ) clickTarget.setOnClickListener { - val browserIntent = Intent(Intent.ACTION_VIEW, item.geoUri) browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) it.context.startActivity(browserIntent) @@ -119,4 +119,25 @@ class SharedItemsListViewHolder( android.graphics.PorterDuff.Mode.SRC_IN ) } + + override fun onBind(item: SharedDeckCardItem) { + super.onBind(item) + + binding.fileName.text = item.name + binding.fileSize.visibility = View.GONE + binding.separator1.visibility = View.GONE + binding.fileDate.text = item.dateTime + binding.actor.text = item.actorName + image.hierarchy.setPlaceholderImage(R.drawable.ic_baseline_location_on_24) + image.setColorFilter( + ContextCompat.getColor(image.context, R.color.high_emphasis_menu_icon), + android.graphics.PorterDuff.Mode.SRC_IN + ) + + clickTarget.setOnClickListener { + val browserIntent = Intent(Intent.ACTION_VIEW, item.link) + browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + it.context.startActivity(browserIntent) + } + } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt index 0c05be81fb9..205bbcb7ca8 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt @@ -40,6 +40,7 @@ import com.facebook.imagepipeline.common.RotationOptions import com.facebook.imagepipeline.image.ImageInfo import com.facebook.imagepipeline.request.ImageRequestBuilder import com.nextcloud.talk.data.user.model.User +import com.nextcloud.talk.shareditems.model.SharedDeckCardItem import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedLocationItem @@ -134,6 +135,8 @@ abstract class SharedItemsViewHolder( open fun onBind(item: SharedOtherItem) {} + open fun onBind(item: SharedDeckCardItem) {} + private fun staticImage( mimeType: String?, image: SimpleDraweeView diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedDeckCardItem.kt b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedDeckCardItem.kt new file mode 100644 index 00000000000..e5230a126df --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/shareditems/model/SharedDeckCardItem.kt @@ -0,0 +1,31 @@ +/* + * Nextcloud Talk application + * + * @author Tim Krüger + * Copyright (C) 2022 Tim Krüger + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.nextcloud.talk.shareditems.model + +import android.net.Uri + +data class SharedDeckCardItem( + override val id: String, + override val name: String, + override val actorId: String, + override val actorName: String, + override val dateTime: String, + val link: Uri +) : SharedItem diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt index d35ebdd0a2f..0f1541e2c5c 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt @@ -28,6 +28,7 @@ import com.nextcloud.talk.R import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.models.json.chat.ChatShareOverall +import com.nextcloud.talk.shareditems.model.SharedDeckCardItem import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedItemType @@ -39,6 +40,7 @@ import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DateUtils import io.reactivex.Observable import retrofit2.Response +import java.util.HashMap import java.util.Locale import javax.inject.Inject @@ -109,36 +111,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : ) } else if (it.value.messageParameters?.containsKey("object") == true) { val objectParameters = it.value.messageParameters!!["object"]!! - when (objectParameters["type"]) { - "talk-poll" -> { - items[it.value.id] = SharedPollItem( - objectParameters["id"]!!, - objectParameters["name"]!!, - actorParameters["id"]!!, - actorParameters["name"]!!, - dateTime - ) - } - "geo-location" -> { - items[it.value.id] = SharedLocationItem( - objectParameters["id"]!!, - objectParameters["name"]!!, - actorParameters["id"]!!, - actorParameters["name"]!!, - dateTime, - Uri.parse(objectParameters["id"]!!.replace("geo:", "geo:0,0?z=11&q=")) - ) - } - else -> { - items[it.value.id] = SharedOtherItem( - objectParameters["id"]!!, - objectParameters["name"]!!, - actorParameters["id"]!!, - actorParameters["name"]!!, - dateTime - ) - } - } + items[it.value.id] = itemFromObject(objectParameters, actorParameters, dateTime) } else { Log.w(TAG, "Item contains neither 'file' or 'object'.") } @@ -156,6 +129,53 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : ) } + private fun itemFromObject( + objectParameters: HashMap, + actorParameters: HashMap, + dateTime: String + ): SharedItem { + when (objectParameters["type"]) { + "talk-poll" -> { + return SharedPollItem( + objectParameters["id"]!!, + objectParameters["name"]!!, + actorParameters["id"]!!, + actorParameters["name"]!!, + dateTime + ) + } + "geo-location" -> { + return SharedLocationItem( + objectParameters["id"]!!, + objectParameters["name"]!!, + actorParameters["id"]!!, + actorParameters["name"]!!, + dateTime, + Uri.parse(objectParameters["id"]!!.replace("geo:", "geo:0,0?z=11&q=")) + ) + } + "deck-card" -> { + return SharedDeckCardItem( + objectParameters["id"]!!, + objectParameters["name"]!!, + actorParameters["id"]!!, + actorParameters["name"]!!, + dateTime, + Uri.parse(objectParameters["link"]!!) + ) + } + else -> { + return SharedOtherItem( + objectParameters["id"]!!, + objectParameters["name"]!!, + actorParameters["id"]!!, + actorParameters["name"]!!, + dateTime + ) + } + } + } + override fun availableTypes(parameters: SharedItemsRepository.Parameters): Observable> { val credentials = ApiUtils.getCredentials(parameters.userName, parameters.userToken) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a9e33225336..1322cb46228 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -431,6 +431,7 @@ Images, files, voice messages … No shared items Location + Deck card Talk recording from %1$s (%2$s) @@ -563,5 +564,4 @@ Call without notification Set avatar from camera - From aae7e851c9bf052918a1a8414eb5e883b3c3b900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Tue, 9 Aug 2022 18:48:25 +0200 Subject: [PATCH 041/398] Reduce number of return statements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Codacy reported: Function itemFromObject has 4 return statements which exceeds the limit of 2. Signed-off-by: Tim Krüger --- .../repositories/SharedItemsRepositoryImpl.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt index 0f1541e2c5c..e012bb18bc0 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt @@ -134,9 +134,10 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : actorParameters: HashMap, dateTime: String ): SharedItem { + val returnValue: SharedItem when (objectParameters["type"]) { "talk-poll" -> { - return SharedPollItem( + returnValue = SharedPollItem( objectParameters["id"]!!, objectParameters["name"]!!, actorParameters["id"]!!, @@ -145,7 +146,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : ) } "geo-location" -> { - return SharedLocationItem( + returnValue = SharedLocationItem( objectParameters["id"]!!, objectParameters["name"]!!, actorParameters["id"]!!, @@ -155,7 +156,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : ) } "deck-card" -> { - return SharedDeckCardItem( + returnValue = SharedDeckCardItem( objectParameters["id"]!!, objectParameters["name"]!!, actorParameters["id"]!!, @@ -165,7 +166,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : ) } else -> { - return SharedOtherItem( + returnValue = SharedOtherItem( objectParameters["id"]!!, objectParameters["name"]!!, actorParameters["id"]!!, @@ -174,6 +175,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : ) } } + return returnValue } override fun availableTypes(parameters: SharedItemsRepository.Parameters): Observable> { From 53bdd951add9fe931994179c1f946d7f7625e169 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 9 Aug 2022 23:24:27 +0200 Subject: [PATCH 042/398] Add deck icon Signed-off-by: Andy Scherzinger --- .../adapters/SharedItemsListViewHolder.kt | 2 +- .../main/res/drawable/ic_baseline_deck_24.xml | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_baseline_deck_24.xml diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt index d1ec51e090f..fa611d8399c 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt @@ -128,7 +128,7 @@ class SharedItemsListViewHolder( binding.separator1.visibility = View.GONE binding.fileDate.text = item.dateTime binding.actor.text = item.actorName - image.hierarchy.setPlaceholderImage(R.drawable.ic_baseline_location_on_24) + image.hierarchy.setPlaceholderImage(R.drawable.ic_baseline_deck_24) image.setColorFilter( ContextCompat.getColor(image.context, R.color.high_emphasis_menu_icon), android.graphics.PorterDuff.Mode.SRC_IN diff --git a/app/src/main/res/drawable/ic_baseline_deck_24.xml b/app/src/main/res/drawable/ic_baseline_deck_24.xml new file mode 100644 index 00000000000..a93dfce01e8 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_deck_24.xml @@ -0,0 +1,39 @@ + + + + + + + + + From 228952d85c3c604d16d75b095668a94df1da2d30 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Wed, 10 Aug 2022 04:23:01 +0000 Subject: [PATCH 043/398] [tx-robot] updated from transifex Signed-off-by: Nextcloud bot --- app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-b+en+001/strings.xml | 1 + app/src/main/res/values-ca/strings.xml | 1 + app/src/main/res/values-cs-rCZ/strings.xml | 2 ++ app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 2 ++ app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-eu/strings.xml | 2 ++ app/src/main/res/values-fa/strings.xml | 1 + app/src/main/res/values-fi-rFI/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-gl/strings.xml | 1 + app/src/main/res/values-hr/strings.xml | 1 + app/src/main/res/values-hu-rHU/strings.xml | 2 ++ app/src/main/res/values-is/strings.xml | 2 ++ app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-iw/strings.xml | 1 + app/src/main/res/values-ja-rJP/strings.xml | 1 + app/src/main/res/values-ko/strings.xml | 1 + app/src/main/res/values-lt-rLT/strings.xml | 1 + app/src/main/res/values-nb-rNO/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-nn-rNO/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 2 ++ app/src/main/res/values-pt-rBR/strings.xml | 9 ++++++++- app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sl/strings.xml | 1 + app/src/main/res/values-sr/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values-vi/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rHK/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 1 + 36 files changed, 50 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 39476694d22..86a5870e7fd 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -297,6 +297,7 @@ انضم للمحادثة في %1$s /index.php/call/ %2$s /كلمة المرور: %1$s أرسل هذا الموقع + الموقع الموقع المشارك رتب حسب وقت البدء diff --git a/app/src/main/res/values-b+en+001/strings.xml b/app/src/main/res/values-b+en+001/strings.xml index 9d1d61bd8e0..ef41eba89a2 100644 --- a/app/src/main/res/values-b+en+001/strings.xml +++ b/app/src/main/res/values-b+en+001/strings.xml @@ -198,6 +198,7 @@ %1$s invitation Join the conversation at %1$s/index.php/call/%2$s \nPassword: %1$s + Location Sort by Uploading User diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 0abc59f35de..09d2778ff71 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -228,6 +228,7 @@ Afegiu-vos a la conversa a %1$s/index.php/call/%2$s \nContrasenya: %1$s Comparteix aquesta localització + Ubicació Ordena per Hora d\'inici S\'està carregant diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index d7c88fd70bc..a5ae38a8f99 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -313,6 +313,7 @@ Sdílené položky Obrázky, soubory, hlasové zprávy… Žádné sdílené položky + Poloha Sdílené umístění Řadit podle Čas zahájení @@ -383,6 +384,7 @@ Soubor Média Ostatní + Anketa Hlas Oblíbené Nemáte oprávnění pro zahájení hovoru diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index e37e0644962..0301e9e34a9 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -226,6 +226,7 @@ %1$s invitation Deltag i samtalen på %1$s/index.php/call/%2$s \nAdgangskode: %1$s + Sted Sortér efter Start tid Uploader diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0b125cfd2f1..20e76a10fa2 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -313,6 +313,7 @@ Geteilte Elemente Bilder, Dateien, Sprachnachrichten … Keine geteilten Elemente + Ort Geteilter Ort Sortiere nach Startzeit @@ -383,6 +384,7 @@ Datei Medien Sonstiges + Umfrage Anruf Favorit Sie dürfen keinen Anruf zu tätigen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 6f6836f1be1..9cfbc0e7419 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -284,6 +284,7 @@ Συμμετοχή στην συνομιλία από %1$s/index.php/call/%2$s \nΣυνθηματικό: %1$s Διαμοιρασμός αυτής της τοποθεσίας + Τοποθεσία Διαμοιρασμένες τοποθεσίες Ταξινόμηση κατά Ώρα έναρξης diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 295565df429..67bdc11d8fc 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -311,6 +311,7 @@ Elementos compartidos Imágenes, archivos, mensajes de voz… No hay elementos compartidos + Ubicación Ubicación compartida Ordenar por Hora de inicio diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index f772aef05af..5e04e44c4c7 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -313,6 +313,7 @@ Partekatutako elementuak Irudiak, fitxategiak, ahots-mezuak … Ez dago partekatutako elementurik + Kokapena Partekatutako kokalekua Ordenatu honen arabera Hasiera-ordua @@ -383,6 +384,7 @@ Fitxategia Media Bestelakoa + Galdeketa Ahotsa Gogokoa Ez duzu dei bat hasteko baimenik diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index feb0f37df23..34a7199ca03 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -231,6 +231,7 @@ به مکالمه %1$s/index.php/call/%2$s ملحق شوید رمز عبور: %1$s اشتراک این مکان + محل مرتب‌سازی بر اساس زمان شروع در حال آپلود diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 58c0d26a52c..9e9afb56e06 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -272,6 +272,7 @@ Jaetut tietueet Kuvat, tiedostot, ääniviestit… Ei jaettuja kohteita + Sijainti Jaettu sijainti Lajittelujärjestys Aloitusaika diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 0bb1a41367d..c572c9b765c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -310,6 +310,7 @@ Éléments partagés Images, fichiers, messages vocaux… Pas d\'éléments partagés + Position Position partagée Trier par Heure de début diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 7447fa7e2ff..defc487e5b5 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -245,6 +245,7 @@ Únase á conversa en %1$s/index.php/call/%2$s \nContrasinal: %1$s Compartir esta localización + Localización Ordenar por Hora de comezo Escolla os ficheiros diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index b92feae130e..e2faae549a3 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -296,6 +296,7 @@ Pridruži se razgovoru na adresi %1$s/index.php/call/%2$s \nZaporka: %1$s Dijeli ovu lokaciju + Lokacija Dijeljena lokacija Razvrstaj prema Vrijeme početka diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 0a7ac151d0f..2605c10f3a4 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -313,6 +313,7 @@ Megosztott elemek Képek, fájlok, hangüzenetek… Nincsenek megosztott elemek + Hely Hely megosztva Rendezés elve Kezdési idő @@ -383,6 +384,7 @@ Fájl Média Egyebek + Szavazás Hang Kedvenc Nincs jogosultsága hívást indítani diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index e79889227f9..d0b58c4cc93 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -212,6 +212,7 @@ Taktu þátt í samtalinu á %1$s/index.php/call/%2$s \nLykilorð: %1$s Deila þessari staðsetningu + Staðsetning Raða sem Upphafstími Sendi inn @@ -240,6 +241,7 @@ Skrá Margmiðlunargögn Annað + Poll Raddskilaboð Eftirlæti Stöðuskilaboð diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 32ec08b4ccc..61753ca63dd 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -305,6 +305,7 @@ Partecipa alla conversazione su %1$s/index.php/call/%2$s \nPassword: %1$s Condividi questa posizione + Posizione Posizione condivisa Ordina per Ora di inizio diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 82d9f60eb5e..de1fb21780b 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -231,6 +231,7 @@ כדאי להצטרף לדיון תחת %1$s/index.php/call/%2$s \nססמה: %1$s שיתוף המיקום הזה + מיקום מיון על בסיס מועד התחלה מתבצעת העלאה diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 50584b37e7e..f49b429e292 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -309,6 +309,7 @@ 共有済みアイテム 画像、ファイル、ボイスメッセージ … 共有アイテムがありません + 位置 共有された位置情報 ソート: 開始時刻 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 941ea839f51..98f0ca868f7 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -251,6 +251,7 @@ %1$s 초대 %1$s/index.php/call/%2$s 대화에 참여 \n패스워드: %1$s + 위치 공유된 위치 정렬 시작 시간 diff --git a/app/src/main/res/values-lt-rLT/strings.xml b/app/src/main/res/values-lt-rLT/strings.xml index 19206348751..df9e6540fd1 100644 --- a/app/src/main/res/values-lt-rLT/strings.xml +++ b/app/src/main/res/values-lt-rLT/strings.xml @@ -215,6 +215,7 @@ Prisijunkite prie pokalbio, adresu %1$s/index.php/call/%2$s \nSlaptažodis: %1$s Bendrinti šią vietą + Vieta Rikiuoti pagal Pradžios laikas Įkeliama diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 6ce4376acb1..469d07caadf 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -233,6 +233,7 @@ %1$s invitasjon Delta i samtalen via %1$s/index.php/call/%2$s \nPassord: %1$s + Sted Sorter etter Start tidspunkt Velg filer diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 15bbc275327..8d3275e14d7 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -303,6 +303,7 @@ Kies er eentje van een provider. Neem deel aan het gesprek %1$s/index.php/call/%2$s \nWachtwoord: %1$s Deel deze locatie + Locatie Gedeelde locatie Sorteren op Begintijd diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index 58d9f7c04db..2395d6956f5 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -227,6 +227,7 @@ Fjern Åtvaring Del lenkje + Stad Sorter på Uploading Bruker diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index acc12c5112b..fd7e608e573 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -313,6 +313,7 @@ Udostępnione elementy Obrazy, pliki, wiadomości głosowe… Brak udostępnionych elementów + Lokalizacja Udostępniona lokalizacja Sortuj według Czas rozpoczęcia @@ -383,6 +384,7 @@ Plik Multimedia Inne + Sonda Połączenie głosowe Ulubione Nie możesz rozpocząć połączenia diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 26fbdd232a6..f79a61b1a90 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -313,6 +313,7 @@ Itens compartilhados Imagens, arquivos, mensagens de voz … Nenhum item compartilhado + Localização Localização compartilhada Ordenar por Hora de início @@ -383,6 +384,7 @@ Arquivo Meios de comunicação Outro + Enquete Voz Favorito Você não tem permissão para iniciar uma ligação @@ -412,4 +414,9 @@ Nenhuma informação pessoal definida Adicione nome, foto e detalhes de contato em sua página de perfil. Qual é o seu status? - + + %d votos + %d voto + %d votos + + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index dc0d4f65eba..7ac41f65147 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -310,6 +310,7 @@ Общие элементы Изображения, файлы, голосовые сообщения … Нет общих элементов + Местоположение Местоположением поделились Сортировать по Время начала diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 1e5cf84a9d4..5e0d85a91b5 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -307,6 +307,7 @@ \nGeslo: %1$s Objavi trenutno mesto Slike, datoteke, glasovna sporočila ... + Trenutno mesto Objavljeno trenutno mesto Razvrsti po Čas začetka diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index abadc8372a1..b89c4927fd3 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -222,6 +222,7 @@ Придружи се разговору на%1$s/index.php/call/%2$s \nЛозинка: %1$s Подели ову локацију + Локација Разврстај Време почетка Отпремање diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 7cbe2483b9f..4e12e12b3bb 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -238,6 +238,7 @@ Gå med i konversationen på %1$s/index.php/call/%2$s \nLösenord: %1$s Dela den här platsen + Plats Sortera efter Starttid Laddar upp diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index abc4437830c..c027720f8ad 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -383,6 +383,7 @@ Dosya Ortam Diğer + Ankter Ses Sık kullanılanlara ekle Bir çağrı başlatma izniniz yok diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index f29bdea89ef..d74a04a0167 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -268,6 +268,7 @@ Поширити посилання Поділіться місцезнаходженням Поділіться цим розташуванням + Місце Сортувати по Виберіть файли Вибачте, помилка завантаження diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index cf17fca9229..a31037b6226 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -197,6 +197,7 @@ %1$s lời mời Tham gia cuộc Đàm thoại tại %1$s/index.php/call/%2$s \nMật khẩu: %1$s + Vị trí Sắp xếp theo Đang tải lên Chụp ảnh diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index fe995dd5e54..5b057619a4e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -293,6 +293,7 @@ 加入在 %1$s/index.php/call/%2$s 中的会话 \n密码: %1$s 分享这个位置 + 位置 共享的位置 排序依据 开始时间 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index f1fe842549d..50764442719 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -313,6 +313,7 @@ 分享項目 圖片、檔案、語音訊息 … 沒有已分享的項目 + 位置 分享了的位置 排序方式 開始時間 @@ -383,6 +384,7 @@ 檔案 多媒體 其它 + 民意調查Poll 語音 我的最愛 你無權開始通話 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b30362c6dee..449740c2e5d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -221,6 +221,7 @@ 只有特定帳號可以被重新授權 分享連結 分享地點 + 路徑 共享的位置 排序 上傳中… From cdc818b7206101e373136322dd3abd16591d716d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Wed, 10 Aug 2022 13:10:30 +0200 Subject: [PATCH 044/398] ChatController: fix crash when opening conversation from notification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This happens because there is no Conversation object available in the Controller when coming from a notification. This patch means that when opening a notification for a poll, it will always look like the user is not the owner of the poll even if they are. This is unfortunately difficult to fix as the initialization logic for ChatController is all kinds of messed up: ideally we'd always load the Conversation object before showing any kind of UI but that's too big of a change to do without tests. Signed-off-by: Álvaro Brey --- .../messages/IncomingPollMessageViewHolder.kt | 7 ++- .../talk/adapters/messages/MessagePayload.kt | 4 +- .../OutcomingPollMessageViewHolder.kt | 4 +- .../talk/controllers/ChatController.kt | 61 +++++++++++-------- 4 files changed, 43 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt index 177882d4411..6d9fc90da1d 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt @@ -112,8 +112,8 @@ class IncomingPollMessageViewHolder(incomingView: View, payload: Any) : MessageH if (pollId != null && pollName != null) { binding.messagePollTitle.text = pollName - val roomToken = (payload as? MessagePayload)!!.currentConversation.token!! - val isOwnerOrModerator = (payload as? MessagePayload)!!.currentConversation.isParticipantOwnerOrModerator + val roomToken = (payload as? MessagePayload)!!.roomToken + val isOwnerOrModerator = (payload as? MessagePayload)!!.isOwnerOrModerator ?: false binding.bubble.setOnClickListener { val pollVoteDialog = PollMainDialogFragment.newInstance( @@ -199,7 +199,8 @@ class IncomingPollMessageViewHolder(incomingView: View, payload: Any) : MessageH val bubbleDrawable = DisplayUtils.getMessageSelector( bgBubbleColor, ResourcesCompat.getColor(resources, R.color.transparent, null), - bgBubbleColor, bubbleResource + bgBubbleColor, + bubbleResource ) ViewCompat.setBackground(bubble, bubbleDrawable) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MessagePayload.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MessagePayload.kt index df6d22a8f12..38dbf99a98a 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MessagePayload.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MessagePayload.kt @@ -20,10 +20,10 @@ package com.nextcloud.talk.adapters.messages -import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.ui.bottom.sheet.ProfileBottomSheet data class MessagePayload( - var currentConversation: Conversation, + var roomToken: String, + val isOwnerOrModerator: Boolean?, val profileBottomSheet: ProfileBottomSheet ) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt index 8f865ccccf1..2d1726d57c2 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt @@ -128,8 +128,8 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag if (pollId != null && pollName != null) { binding.messagePollTitle.text = pollName - val roomToken = (payload as? MessagePayload)!!.currentConversation.token!! - val isOwnerOrModerator = (payload as? MessagePayload)!!.currentConversation.isParticipantOwnerOrModerator + val roomToken = (payload as? MessagePayload)!!.roomToken + val isOwnerOrModerator = (payload as? MessagePayload)!!.isOwnerOrModerator ?: false binding.bubble.setOnClickListener { val pollVoteDialog = PollMainDialogFragment.newInstance( diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 499063849ef..170ddc44736 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -430,11 +430,11 @@ class ChatController(args: Bundle) : private fun loadAvatarForStatusBar() { if (inOneToOneCall() && activity != null) { - val imageRequest = DisplayUtils.getImageRequestForUrl( ApiUtils.getUrlForAvatar( conversationUser?.baseUrl, - currentConversation?.name, true + currentConversation?.name, + true ), conversationUser!! ) @@ -446,7 +446,6 @@ class ChatController(args: Bundle) : object : BaseBitmapDataSubscriber() { override fun onNewResultImpl(bitmap: Bitmap?) { if (actionBar != null && bitmap != null && resources != null) { - val avatarSize = (actionBar?.height!! / TOOLBAR_AVATAR_RATIO).roundToInt() if (avatarSize > 0) { val bitmapResized = Bitmap.createScaledBitmap(bitmap, avatarSize, avatarSize, false) @@ -487,9 +486,10 @@ class ChatController(args: Bundle) : adapterWasNull = true val messageHolders = MessageHolders() - val profileBottomSheet = ProfileBottomSheet(ncApi!!, conversationUser!!, router) + val profileBottomSheet = ProfileBottomSheet(ncApi, conversationUser!!, router) - val payload = MessagePayload(currentConversation!!, profileBottomSheet) + val payload = + MessagePayload(roomToken!!, currentConversation?.isParticipantOwnerOrModerator, profileBottomSheet) messageHolders.setIncomingTextConfig( MagicIncomingTextMessageViewHolder::class.java, @@ -696,7 +696,8 @@ class ChatController(args: Bundle) : val editable = binding.messageInputView.inputEditText?.editableText if (editable != null && binding.messageInputView.inputEditText != null) { val mentionSpans = editable.getSpans( - 0, binding.messageInputView.inputEditText!!.length(), + 0, + binding.messageInputView.inputEditText!!.length(), Spans.MentionChipSpan::class.java ) var mentionSpan: Spans.MentionChipSpan @@ -938,7 +939,6 @@ class ChatController(args: Bundle) : } private fun startPlayback(message: ChatMessage) { - if (!this.isAttached) { // don't begin to play voice message if screen is not visible anymore. // this situation might happen if file is downloading but user already left the chatview. @@ -1090,7 +1090,8 @@ class ChatController(args: Bundle) : val fileNameWithoutSuffix = String.format( context!!.resources.getString(R.string.nc_voice_message_filename), - date, currentConversation!!.displayName + date, + currentConversation!!.displayName ) val fileName = fileNameWithoutSuffix + VOICE_MESSAGE_FILE_SUFFIX @@ -1305,7 +1306,6 @@ class ChatController(args: Bundle) : currentConversation?.isLobbyViewApplicable(conversationUser!!) ?: false && isAlive() ) { - if (!checkingLobbyStatus) { getRoomInfo() } @@ -1603,7 +1603,8 @@ class ChatController(args: Bundle) : if (!isVoiceMessage) { Toast.makeText( - context, context?.getString(R.string.nc_upload_in_progess), + context, + context?.getString(R.string.nc_upload_in_progess), Toast.LENGTH_LONG ).show() } @@ -2000,7 +2001,8 @@ class ChatController(args: Bundle) : if (binding.messageInputView.inputEditText != null) { val editable = binding.messageInputView.inputEditText!!.editableText val mentionSpans = editable.getSpans( - 0, editable.length, + 0, + editable.length, Spans.MentionChipSpan::class.java ) var mentionSpan: Spans.MentionChipSpan @@ -2029,7 +2031,6 @@ class ChatController(args: Bundle) : } private fun sendMessage(message: CharSequence, replyTo: Int?, sendWithoutNotification: Boolean) { - if (conversationUser != null) { val apiVersion = ApiUtils.getChatApiVersion(conversationUser, intArrayOf(1)) @@ -2167,7 +2168,8 @@ class ChatController(args: Bundle) : Log.d(TAG, "pullChatMessages - pullChatMessages[lookIntoFuture > 0] - calling") ncApi.pullChatMessages( credentials, - ApiUtils.getUrlForChat(apiVersion, conversationUser?.baseUrl, roomToken), fieldMap + ApiUtils.getUrlForChat(apiVersion, conversationUser?.baseUrl, roomToken), + fieldMap ) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) @@ -2209,7 +2211,8 @@ class ChatController(args: Bundle) : Log.d(TAG, "pullChatMessages - pullChatMessages[lookIntoFuture <= 0] - calling") ncApi.pullChatMessages( credentials, - ApiUtils.getUrlForChat(apiVersion, conversationUser?.baseUrl, roomToken), fieldMap + ApiUtils.getUrlForChat(apiVersion, conversationUser?.baseUrl, roomToken), + fieldMap ) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) @@ -2253,7 +2256,6 @@ class ChatController(args: Bundle) : Integer.parseInt(it) } if (response.headers().size > 0 && !TextUtils.isEmpty(xChatLastGivenHeader)) { - val header = Integer.parseInt(xChatLastGivenHeader!!) if (header > 0) { if (isFromTheFuture) { @@ -2268,7 +2270,6 @@ class ChatController(args: Bundle) : } if (response.code() == HTTP_CODE_OK) { - val chatOverall = response.body() as ChatOverall? val chatMessageList = handleSystemMessages(chatOverall?.ocs!!.data!!) @@ -2331,7 +2332,6 @@ class ChatController(args: Bundle) : } scrollToRequestedMessageIfNeeded() } else { - var chatMessage: ChatMessage val shouldAddNewMessagesNotice = (adapter?.itemCount ?: 0) > 0 && chatMessageList.isNotEmpty() @@ -2746,7 +2746,8 @@ class ChatController(args: Bundle) : override fun onNext(t: ChatOverallSingleMessage) { if (t.ocs!!.meta!!.statusCode == HttpURLConnection.HTTP_ACCEPTED) { Toast.makeText( - context, R.string.nc_delete_message_leaked_to_matterbridge, + context, + R.string.nc_delete_message_leaked_to_matterbridge, Toast.LENGTH_LONG ).show() } @@ -2782,7 +2783,8 @@ class ChatController(args: Bundle) : ) ncApi!!.createRoom( credentials, - retrofitBucket.url, retrofitBucket.queryMap + retrofitBucket.url, + retrofitBucket.queryMap ) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -2801,7 +2803,8 @@ class ChatController(args: Bundle) : ncApi!!.getRoom( credentials, ApiUtils.getUrlForRoom( - apiVersion, conversationUser?.baseUrl, + apiVersion, + conversationUser?.baseUrl, roomOverall.ocs!!.data!!.token ) ) @@ -2818,8 +2821,11 @@ class ChatController(args: Bundle) : Parcels.wrap(roomOverall.ocs!!.data!!) ) remapChatController( - router, conversationUser!!.id!!, - roomOverall.ocs!!.data!!.token!!, bundle, true + router, + conversationUser!!.id!!, + roomOverall.ocs!!.data!!.token!!, + bundle, + true ) } @@ -3079,7 +3085,6 @@ class ChatController(args: Bundle) : if (currentConversation?.type != Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL || currentConversation?.name != userMentionClickEvent.userId ) { - var apiVersion = 1 // FIXME Fix API checking with guests? if (conversationUser != null) { @@ -3097,7 +3102,8 @@ class ChatController(args: Bundle) : ncApi.createRoom( credentials, - retrofitBucket.url, retrofitBucket.queryMap + retrofitBucket.url, + retrofitBucket.queryMap ) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) @@ -3121,8 +3127,11 @@ class ChatController(args: Bundle) : conversationIntent.putExtras(bundle) ConductorRemapping.remapChatController( - router, conversationUser.id!!, - roomOverall.ocs!!.data!!.token!!, bundle, false + router, + conversationUser.id!!, + roomOverall.ocs!!.data!!.token!!, + bundle, + false ) } else { conversationIntent.putExtras(bundle) From dff2549c365c1b0710c71b5f144dfb81d37ba210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Wed, 10 Aug 2022 16:42:05 +0200 Subject: [PATCH 045/398] Increase allowed lint warnings from 111 to 112 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- scripts/analysis/lint-results.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/analysis/lint-results.txt b/scripts/analysis/lint-results.txt index ce07a366cd3..02dd5476d95 100644 --- a/scripts/analysis/lint-results.txt +++ b/scripts/analysis/lint-results.txt @@ -1,2 +1,2 @@ DO NOT TOUCH; GENERATED BY DRONE - Lint Report: 1 error and 111 warnings + Lint Report: 1 error and 112 warnings From 9bbeb9b420d4db3a24daea78f203a5bf79db0b7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Thu, 14 Jul 2022 17:46:11 +0200 Subject: [PATCH 046/398] Base framework for server theming MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Includes PoC with ConversationListController's FAB Signed-off-by: Álvaro Brey --- .../application/NextcloudTalkApplication.kt | 5 +- .../ConversationsListController.java | 6 +++ .../json/capabilities/ThemingCapability.kt | 7 ++- .../nextcloud/talk/ui/theme/ServerTheme.kt | 53 +++++++++++++++++++ .../talk/ui/theme/ServerThemeImpl.kt | 45 ++++++++++++++++ .../talk/ui/theme/ServerThemeProvider.kt | 31 +++++++++++ .../talk/ui/theme/ServerThemeProviderImpl.kt | 46 ++++++++++++++++ .../nextcloud/talk/ui/theme/ThemeModule.kt | 45 ++++++++++++++++ .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 48 +++++++++++++++++ .../layout/controller_conversations_rv.xml | 4 +- 10 files changed, 286 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/ui/theme/ServerTheme.kt create mode 100644 app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt create mode 100644 app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt create mode 100644 app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt create mode 100644 app/src/main/java/com/nextcloud/talk/ui/theme/ThemeModule.kt create mode 100644 app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt index c8e05df8ff9..5407a12f4de 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt @@ -61,6 +61,7 @@ import com.nextcloud.talk.dagger.modules.ViewModelModule import com.nextcloud.talk.jobs.AccountRemovalWorker import com.nextcloud.talk.jobs.CapabilitiesWorker import com.nextcloud.talk.jobs.SignalingSettingsWorker +import com.nextcloud.talk.ui.theme.ThemeModule import com.nextcloud.talk.utils.ClosedInterfaceImpl import com.nextcloud.talk.utils.DeviceUtils import com.nextcloud.talk.utils.DisplayUtils @@ -96,7 +97,8 @@ import javax.inject.Singleton ArbitraryStorageModule::class, ViewModelModule::class, RepositoryModule::class, - UtilsModule::class + UtilsModule::class, + ThemeModule::class ] ) @Singleton @@ -120,6 +122,7 @@ class NextcloudTalkApplication : MultiDexApplication(), LifecycleObserver { override fun preKey(database: SQLiteDatabase) { // unused atm } + override fun postKey(database: SQLiteDatabase) { Log.i("TalkApplication", "DB cipher_migrate START") database.rawExecSQL("PRAGMA cipher_migrate;") diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index a15883a29a4..07de2674d51 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -92,6 +92,8 @@ import com.nextcloud.talk.repositories.unifiedsearch.UnifiedSearchRepository; import com.nextcloud.talk.ui.dialog.ChooseAccountDialogFragment; import com.nextcloud.talk.ui.dialog.ConversationsListBottomDialog; +import com.nextcloud.talk.ui.theme.ServerTheme; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.users.UserManager; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.AttendeePermissionsUtil; @@ -181,6 +183,9 @@ public class ConversationsListController extends BaseController implements Flexi @Inject UnifiedSearchRepository unifiedSearchRepository; + @Inject + ServerTheme serverTheme; + @BindView(R.id.recycler_view) RecyclerView recyclerView; @@ -784,6 +789,7 @@ public void onScrollStateChanged(@NotNull RecyclerView recyclerView, int newStat ContactAddressBookWorker.Companion.run(context); showNewConversationsScreen(); }); + new ViewThemeUtils(serverTheme).themeFAB(floatingActionButton); if (getActivity() != null && getActivity() instanceof MainActivity) { MainActivity activity = (MainActivity) getActivity(); diff --git a/app/src/main/java/com/nextcloud/talk/models/json/capabilities/ThemingCapability.kt b/app/src/main/java/com/nextcloud/talk/models/json/capabilities/ThemingCapability.kt index 6dfdcae7b9d..bfa86bb6147 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/capabilities/ThemingCapability.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/capabilities/ThemingCapability.kt @@ -43,6 +43,11 @@ data class ThemingCapability( var colorText: String?, @JsonField(name = ["color-element"]) var colorElement: String?, + // TODO check what happens with users with already fetched capabilities + @JsonField(name = ["color-element-bright"]) + var colorElementBright: String?, + @JsonField(name = ["color-element-dark"]) + var colorElementDark: String?, @JsonField(name = ["logo"]) var logo: String?, @JsonField(name = ["background"]) @@ -53,5 +58,5 @@ data class ThemingCapability( var backgroundDefault: Boolean? ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' - constructor() : this(null, null, null, null, null, null, null, null, null, null) + constructor() : this(null, null, null, null, null, null, null, null, null, null, null, null) } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerTheme.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerTheme.kt new file mode 100644 index 00000000000..ad31f29d927 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerTheme.kt @@ -0,0 +1,53 @@ +/* + * Nextcloud Talk application + * + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.ui.theme + +import androidx.annotation.ColorInt + +interface ServerTheme { + @get:ColorInt + val primaryColor: Int + + /** + * Default element color + */ + @get:ColorInt + val colorElement: Int + + /** + * Element color for bright backgrounds + */ + @get:ColorInt + val colorElementBright: Int + + /** + * Element color for dark backgrounds + */ + @get:ColorInt + val colorElementDark: Int + + /** + * Text color for elements + */ + @get:ColorInt + val colorText: Int +} diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt new file mode 100644 index 00000000000..cd4607e221d --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt @@ -0,0 +1,45 @@ +/* + * Nextcloud Talk application + * + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.ui.theme + +import android.content.Context +import android.graphics.Color +import com.nextcloud.talk.models.json.capabilities.ThemingCapability + +internal class ServerThemeImpl(context: Context, themingCapability: ThemingCapability) : + ServerTheme { + + override val primaryColor: Int + override val colorElement: Int + override val colorElementBright: Int + override val colorElementDark: Int + override val colorText: Int + + // TODO fallback when some of these are null + init { + primaryColor = Color.parseColor(themingCapability.color!!) + colorElement = Color.parseColor(themingCapability.colorElement!!) + colorElementBright = Color.parseColor(themingCapability.colorElementBright!!) + colorElementDark = Color.parseColor(themingCapability.colorElementDark!!) + colorText = Color.parseColor(themingCapability.colorText!!) + } +} diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt new file mode 100644 index 00000000000..2646e9a79f6 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt @@ -0,0 +1,31 @@ +/* + * Nextcloud Talk application + * + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.ui.theme + +import com.nextcloud.talk.data.user.model.User +import com.nextcloud.talk.models.json.capabilities.Capabilities + +interface ServerThemeProvider { + fun getServerThemeForUser(user: User): ServerTheme + fun getServerThemeForCurrentUser(): ServerTheme + fun getServerThemeForCapabilities(capabilities: Capabilities): ServerTheme +} diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt new file mode 100644 index 00000000000..f10ad61e4c5 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt @@ -0,0 +1,46 @@ +/* + * Nextcloud Talk application + * + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.ui.theme + +import android.content.Context +import com.nextcloud.talk.data.user.model.User +import com.nextcloud.talk.models.json.capabilities.Capabilities +import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew + +// TODO cache theme, keyed by server url +internal class ServerThemeProviderImpl( + private val context: Context, + private val userProvider: CurrentUserProviderNew +) : + ServerThemeProvider { + override fun getServerThemeForUser(user: User): ServerTheme { + return getServerThemeForCapabilities(user.capabilities!!) + } + + override fun getServerThemeForCurrentUser(): ServerTheme { + return getServerThemeForUser(userProvider.currentUser.blockingGet()) + } + + override fun getServerThemeForCapabilities(capabilities: Capabilities): ServerTheme { + return ServerThemeImpl(context, capabilities.themingCapability!!) + } +} diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ThemeModule.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ThemeModule.kt new file mode 100644 index 00000000000..f1db5ed269d --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ThemeModule.kt @@ -0,0 +1,45 @@ +/* + * Nextcloud Talk application + * + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.ui.theme + +import android.content.Context +import com.nextcloud.talk.dagger.modules.ContextModule +import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew +import com.nextcloud.talk.utils.database.user.UserModule +import dagger.Module +import dagger.Provides +import dagger.Reusable + +@Module(includes = [ContextModule::class, UserModule::class]) +class ThemeModule { + + @Provides + @Reusable + fun provideServerThemeProvider(context: Context, userProvider: CurrentUserProviderNew): ServerThemeProvider { + return ServerThemeProviderImpl(context, userProvider) + } + + @Provides + fun provideCurrentServerTheme(themeProvider: ServerThemeProvider): ServerTheme { + return themeProvider.getServerThemeForCurrentUser() + } +} diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt new file mode 100644 index 00000000000..512189085b9 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -0,0 +1,48 @@ +/* + * Nextcloud Talk application + * + * @author Álvaro Brey + * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.ui.theme + +import android.content.Context +import android.content.res.ColorStateList +import android.content.res.Configuration +import com.google.android.material.floatingactionbutton.FloatingActionButton + +class ViewThemeUtils(val theme: ServerTheme) { + + private fun isDarkMode(context: Context): Boolean = when ( + context.resources.configuration.uiMode and + Configuration.UI_MODE_NIGHT_MASK + ) { + Configuration.UI_MODE_NIGHT_YES -> true + else -> false + } + + private fun getElementColor(context: Context): Int = when { + isDarkMode(context) -> theme.colorElementDark + else -> theme.colorElementBright + } + + fun themeFAB(fab: FloatingActionButton) { + fab.backgroundTintList = ColorStateList.valueOf(getElementColor(fab.context)) + fab.imageTintList = ColorStateList.valueOf(theme.colorText) + } +} diff --git a/app/src/main/res/layout/controller_conversations_rv.xml b/app/src/main/res/layout/controller_conversations_rv.xml index c595b9ed86d..06aa71d2b9e 100644 --- a/app/src/main/res/layout/controller_conversations_rv.xml +++ b/app/src/main/res/layout/controller_conversations_rv.xml @@ -115,11 +115,11 @@ android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="16dp" - android:backgroundTint="@color/colorPrimary" android:contentDescription="@string/nc_new_conversation" app:borderWidth="0dp" app:srcCompat="@drawable/ic_add_white_24px" - app:tint="@color/white" /> + app:tint="@color/white" + app:backgroundTint="@color/colorPrimary"/> Date: Fri, 15 Jul 2022 14:24:13 +0200 Subject: [PATCH 047/398] Automatically update current user with room observable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../ConversationsListController.java | 1 + .../com/nextcloud/talk/data/user/UsersDao.kt | 5 +++++ .../talk/data/user/UsersRepository.kt | 2 ++ .../talk/data/user/UsersRepositoryImpl.kt | 5 +++++ .../talk/ui/theme/ServerThemeProvider.kt | 2 +- .../talk/ui/theme/ServerThemeProviderImpl.kt | 22 ++++++++++++++++++- .../com/nextcloud/talk/users/UserManager.kt | 8 ++++++- .../database/user/CurrentUserProviderNew.kt | 2 ++ 8 files changed, 44 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index 07de2674d51..c57041ca742 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -93,6 +93,7 @@ import com.nextcloud.talk.ui.dialog.ChooseAccountDialogFragment; import com.nextcloud.talk.ui.dialog.ConversationsListBottomDialog; import com.nextcloud.talk.ui.theme.ServerTheme; +import com.nextcloud.talk.ui.theme.ServerThemeProvider; import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.users.UserManager; import com.nextcloud.talk.utils.ApiUtils; diff --git a/app/src/main/java/com/nextcloud/talk/data/user/UsersDao.kt b/app/src/main/java/com/nextcloud/talk/data/user/UsersDao.kt index 16e72e20c57..dc0cd86cc17 100644 --- a/app/src/main/java/com/nextcloud/talk/data/user/UsersDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/user/UsersDao.kt @@ -32,6 +32,7 @@ import androidx.room.Transaction import androidx.room.Update import com.nextcloud.talk.data.user.model.UserEntity import io.reactivex.Maybe +import io.reactivex.Observable import io.reactivex.Single @Dao @@ -41,6 +42,10 @@ abstract class UsersDao { @Query("SELECT * FROM User where current = 1") abstract fun getActiveUser(): Maybe + // get active user + @Query("SELECT * FROM User where current = 1") + abstract fun getActiveUserObservable(): Observable + @Query("SELECT * FROM User where current = 1") abstract fun getActiveUserSynchronously(): UserEntity? diff --git a/app/src/main/java/com/nextcloud/talk/data/user/UsersRepository.kt b/app/src/main/java/com/nextcloud/talk/data/user/UsersRepository.kt index 624d8df2b5a..4d15a97b856 100644 --- a/app/src/main/java/com/nextcloud/talk/data/user/UsersRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/data/user/UsersRepository.kt @@ -24,11 +24,13 @@ package com.nextcloud.talk.data.user import com.nextcloud.talk.data.user.model.User import io.reactivex.Maybe +import io.reactivex.Observable import io.reactivex.Single @Suppress("TooManyFunctions") interface UsersRepository { fun getActiveUser(): Maybe + fun getActiveUserObservable(): Observable fun getUsers(): Single> fun getUserWithId(id: Long): Maybe fun getUserWithIdNotScheduledForDeletion(id: Long): Maybe diff --git a/app/src/main/java/com/nextcloud/talk/data/user/UsersRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/data/user/UsersRepositoryImpl.kt index 5dbda623c9c..d88d2147a99 100644 --- a/app/src/main/java/com/nextcloud/talk/data/user/UsersRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/data/user/UsersRepositoryImpl.kt @@ -24,6 +24,7 @@ package com.nextcloud.talk.data.user import com.nextcloud.talk.data.user.model.User import io.reactivex.Maybe +import io.reactivex.Observable import io.reactivex.Single @Suppress("TooManyFunctions") @@ -33,6 +34,10 @@ class UsersRepositoryImpl(private val usersDao: UsersDao) : UsersRepository { return usersDao.getActiveUser().map { UserMapper.toModel(it) } } + override fun getActiveUserObservable(): Observable { + return usersDao.getActiveUserObservable().map { UserMapper.toModel(it) } + } + override fun getUsers(): Single> { return usersDao.getUsers().map { UserMapper.toModel(it) } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt index 2646e9a79f6..1d299ca7bd3 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt @@ -26,6 +26,6 @@ import com.nextcloud.talk.models.json.capabilities.Capabilities interface ServerThemeProvider { fun getServerThemeForUser(user: User): ServerTheme - fun getServerThemeForCurrentUser(): ServerTheme fun getServerThemeForCapabilities(capabilities: Capabilities): ServerTheme + fun getServerThemeForCurrentUser(): ServerTheme } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt index f10ad61e4c5..949288ce239 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt @@ -21,6 +21,7 @@ package com.nextcloud.talk.ui.theme +import android.annotation.SuppressLint import android.content.Context import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.models.json.capabilities.Capabilities @@ -32,12 +33,31 @@ internal class ServerThemeProviderImpl( private val userProvider: CurrentUserProviderNew ) : ServerThemeProvider { + // TODO move this logic to currentUserProvider or something + private var _currentUser: User? = null + private val currentUser: User + @SuppressLint("CheckResult") + get() { + return when (_currentUser) { + null -> { + // immediately get a result synchronously + _currentUser = userProvider.currentUser.blockingGet() + // start observable for auto-updates + userProvider.currentUserObservable.subscribe { _currentUser = it } + _currentUser!! + } + else -> { + _currentUser!! + } + } + } + override fun getServerThemeForUser(user: User): ServerTheme { return getServerThemeForCapabilities(user.capabilities!!) } override fun getServerThemeForCurrentUser(): ServerTheme { - return getServerThemeForUser(userProvider.currentUser.blockingGet()) + return getServerThemeForUser(currentUser) } override fun getServerThemeForCapabilities(capabilities: Capabilities): ServerTheme { diff --git a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt index 06f70b4eeec..485022992a2 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -30,6 +30,7 @@ import com.nextcloud.talk.models.json.capabilities.Capabilities import com.nextcloud.talk.models.json.push.PushConfigurationState import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import io.reactivex.Maybe +import io.reactivex.Observable import io.reactivex.Single @Suppress("TooManyFunctions") @@ -45,7 +46,12 @@ class UserManager internal constructor(private val userRepository: UsersReposito return userRepository.getActiveUser() } - fun deleteUser(internalId: Long): Int { + override val currentUserObservable: Observable + get() { + return userRepository.getActiveUserObservable() + } + + fun deleteUser(internalId: Long) { return userRepository.deleteUser(userRepository.getUserWithId(internalId).blockingGet()) } diff --git a/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt b/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt index b1b457ce5c9..cf92b9925ec 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/database/user/CurrentUserProviderNew.kt @@ -22,7 +22,9 @@ package com.nextcloud.talk.utils.database.user import com.nextcloud.talk.data.user.model.User import io.reactivex.Maybe +import io.reactivex.Observable interface CurrentUserProviderNew { val currentUser: Maybe + val currentUserObservable: Observable } From 5ec18780ff009bd5daa5c9db295cdea78c02ef8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Thu, 21 Jul 2022 13:45:07 +0200 Subject: [PATCH 048/398] Color list headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../adapters/items/GenericTextHeaderItem.java | 6 +++++- .../talk/adapters/items/MessageResultItem.kt | 6 ++++-- .../adapters/items/MessagesTextHeaderItem.kt | 4 +++- .../talk/controllers/ContactsController.kt | 6 +++++- .../ConversationsListController.java | 13 ++++++------- .../messagesearch/MessageSearchActivity.kt | 10 ++++++++-- .../talk/ui/theme/ServerThemeProviderImpl.kt | 3 ++- .../nextcloud/talk/ui/theme/ThemeModule.kt | 19 +++++++++---------- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 8 +++++++- 9 files changed, 49 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.java index c3e63df75ff..017a0e9260a 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.java @@ -27,6 +27,7 @@ import com.nextcloud.talk.R; import com.nextcloud.talk.databinding.RvItemTitleHeaderBinding; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import java.util.List; @@ -39,12 +40,14 @@ public class GenericTextHeaderItem extends AbstractHeaderItem adapter, HeaderViewHolder Log.d(TAG, "We have payloads, so ignoring!"); } else { holder.binding.titleTextView.setText(title); + viewThemeUtils.colorTextView(holder.binding.titleTextView); } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/MessageResultItem.kt b/app/src/main/java/com/nextcloud/talk/adapters/items/MessageResultItem.kt index bdef86685bb..dc8751dfbbe 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/MessageResultItem.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/MessageResultItem.kt @@ -30,6 +30,7 @@ import com.nextcloud.talk.R import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.RvItemSearchMessageBinding import com.nextcloud.talk.models.domain.SearchMessageEntry +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.DisplayUtils import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractFlexibleItem @@ -42,7 +43,8 @@ data class MessageResultItem constructor( private val context: Context, private val currentUser: User, val messageEntry: SearchMessageEntry, - private val showHeader: Boolean = false + private val showHeader: Boolean = false, + private val viewThemeUtils: ViewThemeUtils ) : AbstractFlexibleItem(), IFilterable, @@ -104,7 +106,7 @@ data class MessageResultItem constructor( const val VIEW_TYPE: Int = R.layout.rv_item_search_message } - override fun getHeader(): GenericTextHeaderItem = MessagesTextHeaderItem(context) + override fun getHeader(): GenericTextHeaderItem = MessagesTextHeaderItem(context, viewThemeUtils) .apply { isHidden = showHeader // FlexibleAdapter needs this hack for some reason } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/MessagesTextHeaderItem.kt b/app/src/main/java/com/nextcloud/talk/adapters/items/MessagesTextHeaderItem.kt index 24ddeabc58a..3ade534b66c 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/MessagesTextHeaderItem.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/MessagesTextHeaderItem.kt @@ -23,8 +23,10 @@ package com.nextcloud.talk.adapters.items import android.content.Context import com.nextcloud.talk.R +import com.nextcloud.talk.ui.theme.ViewThemeUtils -class MessagesTextHeaderItem(context: Context) : GenericTextHeaderItem(context.getString(R.string.messages)) { +class MessagesTextHeaderItem(context: Context, viewThemeUtils: ViewThemeUtils) : + GenericTextHeaderItem(context.getString(R.string.messages), viewThemeUtils) { companion object { /** * "Random" value, just has to be different than other view types diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt index 8aea30693fa..2868f430dad 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt @@ -65,6 +65,7 @@ import com.nextcloud.talk.models.json.converters.EnumActorTypeConverter import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.ui.dialog.ContactsBottomDialog import com.nextcloud.talk.users.UserManager +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ConductorRemapping import com.nextcloud.talk.utils.bundle.BundleKeys @@ -103,6 +104,9 @@ class ContactsController(args: Bundle) : @Inject lateinit var ncApi: NcApi + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private var credentials: String? = null private var currentUser: User? = null private var contactsQueryDisposable: Disposable? = null @@ -492,7 +496,7 @@ class ContactsController(args: Bundle) : val headerTitle = getHeaderTitle(participant) var genericTextHeaderItem: GenericTextHeaderItem if (!userHeaderItems.containsKey(headerTitle)) { - genericTextHeaderItem = GenericTextHeaderItem(headerTitle) + genericTextHeaderItem = GenericTextHeaderItem(headerTitle, viewThemeUtils) userHeaderItems.put(headerTitle, genericTextHeaderItem) } val newContactItem = ContactItem( diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index c57041ca742..edc5c8d66f1 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -92,8 +92,6 @@ import com.nextcloud.talk.repositories.unifiedsearch.UnifiedSearchRepository; import com.nextcloud.talk.ui.dialog.ChooseAccountDialogFragment; import com.nextcloud.talk.ui.dialog.ConversationsListBottomDialog; -import com.nextcloud.talk.ui.theme.ServerTheme; -import com.nextcloud.talk.ui.theme.ServerThemeProvider; import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.users.UserManager; import com.nextcloud.talk.utils.ApiUtils; @@ -185,7 +183,7 @@ public class ConversationsListController extends BaseController implements Flexi UnifiedSearchRepository unifiedSearchRepository; @Inject - ServerTheme serverTheme; + ViewThemeUtils viewThemeUtils; @BindView(R.id.recycler_view) RecyclerView recyclerView; @@ -624,7 +622,7 @@ private void fetchRooms() { GenericTextHeaderItem genericTextHeaderItem; if (!callHeaderItems.containsKey(headerTitle)) { - genericTextHeaderItem = new GenericTextHeaderItem(headerTitle); + genericTextHeaderItem = new GenericTextHeaderItem(headerTitle, viewThemeUtils); callHeaderItems.put(headerTitle, genericTextHeaderItem); } @@ -705,7 +703,7 @@ private void fetchOpenConversations(int apiVersion) { GenericTextHeaderItem genericTextHeaderItem; if (!callHeaderItems.containsKey(headerTitle)) { - genericTextHeaderItem = new GenericTextHeaderItem(headerTitle); + genericTextHeaderItem = new GenericTextHeaderItem(headerTitle, viewThemeUtils); callHeaderItems.put(headerTitle, genericTextHeaderItem); } @@ -790,7 +788,8 @@ public void onScrollStateChanged(@NotNull RecyclerView recyclerView, int newStat ContactAddressBookWorker.Companion.run(context); showNewConversationsScreen(); }); - new ViewThemeUtils(serverTheme).themeFAB(floatingActionButton); + + viewThemeUtils.themeFAB(floatingActionButton); if (getActivity() != null && getActivity() instanceof MainActivity) { MainActivity activity = (MainActivity) getActivity(); @@ -1416,7 +1415,7 @@ public void onMessageSearchResult(@NonNull MessageSearchHelper.MessageSearchResu List adapterItems = new ArrayList<>(entries.size() + 1); for (int i = 0; i < entries.size(); i++) { final boolean showHeader = i == 0; - adapterItems.add(new MessageResultItem(context, currentUser, entries.get(i), showHeader)); + adapterItems.add(new MessageResultItem(context, currentUser, entries.get(i), showHeader, viewThemeUtils)); } if (results.getHasMore()) { adapterItems.add(LoadMoreResultsItem.INSTANCE); diff --git a/app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt b/app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt index 7c288325896..a9d553b25e2 100644 --- a/app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt @@ -41,6 +41,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.controllers.ConversationsListController import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityMessageSearchBinding +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew @@ -64,6 +65,9 @@ class MessageSearchActivity : BaseActivity() { @Inject lateinit var userProvider: CurrentUserProviderNew + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private lateinit var binding: ActivityMessageSearchBinding private lateinit var searchView: SearchView @@ -105,7 +109,9 @@ class MessageSearchActivity : BaseActivity() { DisplayUtils.applyColorToStatusBar( this, ResourcesCompat.getColor( - resources, R.color.appbar, null + resources, + R.color.appbar, + null ) ) DisplayUtils.applyColorToNavigationBar( @@ -154,7 +160,7 @@ class MessageSearchActivity : BaseActivity() { emptyList() } val newItems = - state.results.map { MessageResultItem(this, user, it) } + loadMoreItems + state.results.map { MessageResultItem(this, user, it, false, viewThemeUtils) } + loadMoreItems if (adapter != null) { adapter!!.updateDataSet(newItems) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt index 949288ce239..b4a4df43f85 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt @@ -26,9 +26,10 @@ import android.content.Context import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.models.json.capabilities.Capabilities import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew +import javax.inject.Inject // TODO cache theme, keyed by server url -internal class ServerThemeProviderImpl( +internal class ServerThemeProviderImpl @Inject constructor( private val context: Context, private val userProvider: CurrentUserProviderNew ) : diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ThemeModule.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ThemeModule.kt index f1db5ed269d..54410e609f3 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ThemeModule.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ThemeModule.kt @@ -21,25 +21,24 @@ package com.nextcloud.talk.ui.theme -import android.content.Context import com.nextcloud.talk.dagger.modules.ContextModule -import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import com.nextcloud.talk.utils.database.user.UserModule +import dagger.Binds import dagger.Module import dagger.Provides import dagger.Reusable @Module(includes = [ContextModule::class, UserModule::class]) -class ThemeModule { +internal abstract class ThemeModule { - @Provides + @Binds @Reusable - fun provideServerThemeProvider(context: Context, userProvider: CurrentUserProviderNew): ServerThemeProvider { - return ServerThemeProviderImpl(context, userProvider) - } + abstract fun bindServerThemeProvider(provider: ServerThemeProviderImpl): ServerThemeProvider - @Provides - fun provideCurrentServerTheme(themeProvider: ServerThemeProvider): ServerTheme { - return themeProvider.getServerThemeForCurrentUser() + companion object { + @Provides + fun provideCurrentServerTheme(themeProvider: ServerThemeProvider): ServerTheme { + return themeProvider.getServerThemeForCurrentUser() + } } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 512189085b9..13361a9f428 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -24,9 +24,11 @@ package com.nextcloud.talk.ui.theme import android.content.Context import android.content.res.ColorStateList import android.content.res.Configuration +import android.widget.TextView import com.google.android.material.floatingactionbutton.FloatingActionButton +import javax.inject.Inject -class ViewThemeUtils(val theme: ServerTheme) { +class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { private fun isDarkMode(context: Context): Boolean = when ( context.resources.configuration.uiMode and @@ -45,4 +47,8 @@ class ViewThemeUtils(val theme: ServerTheme) { fab.backgroundTintList = ColorStateList.valueOf(getElementColor(fab.context)) fab.imageTintList = ColorStateList.valueOf(theme.colorText) } + + fun colorTextView(titleTextView: TextView) { + titleTextView.setTextColor(getElementColor(titleTextView.context)) + } } From 54d1ac9de748352cc7ad9317d3f9c7fc20172846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Thu, 21 Jul 2022 13:56:12 +0200 Subject: [PATCH 049/398] ContactsController: tint "public conversation" button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../talk/controllers/ContactsController.kt | 7 +------ .../com/nextcloud/talk/ui/theme/ViewThemeUtils.kt | 13 +++++++++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt index 2868f430dad..523d09a7383 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt @@ -631,12 +631,7 @@ class ContactsController(args: Bundle) : ResourcesCompat.getColor(resources!!, R.color.colorBackgroundDarker, null), PorterDuff.Mode.SRC_IN ) - binding.conversationPrivacyToggle.publicCallLink - .background - .setColorFilter( - ResourcesCompat.getColor(resources!!, R.color.colorPrimary, null), - PorterDuff.Mode.SRC_IN - ) + viewThemeUtils.colorImageViewButton(binding.conversationPrivacyToggle.publicCallLink) disengageProgressBar() } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 13361a9f428..2dfc3c41f79 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -24,6 +24,7 @@ package com.nextcloud.talk.ui.theme import android.content.Context import android.content.res.ColorStateList import android.content.res.Configuration +import android.widget.ImageView import android.widget.TextView import com.google.android.material.floatingactionbutton.FloatingActionButton import javax.inject.Inject @@ -48,7 +49,15 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { fab.imageTintList = ColorStateList.valueOf(theme.colorText) } - fun colorTextView(titleTextView: TextView) { - titleTextView.setTextColor(getElementColor(titleTextView.context)) + fun colorTextView(textView: TextView) { + textView.setTextColor(getElementColor(textView.context)) + } + + /** + * Colors the background as element color and the foreground as text color. + */ + fun colorImageViewButton(imageView: ImageView) { + imageView.imageTintList = ColorStateList.valueOf(theme.colorText) + imageView.backgroundTintList = ColorStateList.valueOf(getElementColor(imageView.context)) } } From 4af491c7df7948713dff16fd4922bc3d410faad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Thu, 21 Jul 2022 15:00:09 +0200 Subject: [PATCH 050/398] Color search highlights MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../talk/adapters/items/ConversationItem.java | 19 ++++++++----------- .../talk/adapters/items/MessageResultItem.kt | 3 +-- .../ConversationsListController.java | 9 ++++++--- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 5 ++++- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index 7f4b69070ac..d6c7ff7ade8 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -46,6 +46,7 @@ import com.nextcloud.talk.models.json.conversations.Conversation; import com.nextcloud.talk.models.json.status.Status; import com.nextcloud.talk.ui.StatusDrawable; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew; @@ -76,22 +77,22 @@ public class ConversationItem extends AbstractFlexibleItem adapter, if (adapter.hasFilter()) { FlexibleUtils.highlightText(holder.binding.dialogName, conversation.getDisplayName(), String.valueOf(adapter.getFilter(String.class)), - NextcloudTalkApplication - .Companion - .getSharedApplication() - .getResources() - .getColor(R.color.colorPrimary)); + viewThemeUtils.getElementColor(holder.binding.dialogName.getContext())); } else { holder.binding.dialogName.setText(conversation.getDisplayName()); } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/MessageResultItem.kt b/app/src/main/java/com/nextcloud/talk/adapters/items/MessageResultItem.kt index dc8751dfbbe..287afdf5c0f 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/MessageResultItem.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/MessageResultItem.kt @@ -24,7 +24,6 @@ package com.nextcloud.talk.adapters.items import android.content.Context import android.text.SpannableString import android.view.View -import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.nextcloud.talk.R import com.nextcloud.talk.data.user.model.User @@ -79,7 +78,7 @@ data class MessageResultItem constructor( private fun bindMessageExcerpt(holder: ViewHolder) { val messageSpannable = SpannableString(messageEntry.messageExcerpt) - val highlightColor = ContextCompat.getColor(context, R.color.colorPrimary) + val highlightColor = viewThemeUtils.getElementColor(holder.binding.messageExcerpt.context) val highlightedSpan = DisplayUtils.searchAndColor(messageSpannable, messageEntry.searchTerm, highlightColor) holder.binding.messageExcerpt.text = highlightedSpan } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index edc5c8d66f1..4b9399d2aca 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -631,7 +631,8 @@ private void fetchRooms() { conversation, currentUser, getActivity(), - userStatuses.get(conversation.getName())); + userStatuses.get(conversation.getName()), + viewThemeUtils); conversationItems.add(conversationItem); ConversationItem conversationItemWithHeader = new ConversationItem( @@ -639,7 +640,8 @@ private void fetchRooms() { currentUser, getActivity(), callHeaderItems.get(headerTitle), - userStatuses.get(conversation.getName())); + userStatuses.get(conversation.getName()), + viewThemeUtils); conversationItemsWithHeader.add(conversationItemWithHeader); } } @@ -712,7 +714,8 @@ private void fetchOpenConversations(int apiVersion) { currentUser, getActivity(), callHeaderItems.get(headerTitle), - userStatuses.get(conversation.getName())); + userStatuses.get(conversation.getName()), + viewThemeUtils); openConversationItems.add(conversationItem); } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 2dfc3c41f79..7dcb23c6b82 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -39,7 +39,10 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { else -> false } - private fun getElementColor(context: Context): Int = when { + /** + * Color for painting elements + */ + fun getElementColor(context: Context): Int = when { isDarkMode(context) -> theme.colorElementDark else -> theme.colorElementBright } From d60fdd03c5c4940b0845e67be2b653354202f42c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Thu, 21 Jul 2022 15:53:05 +0200 Subject: [PATCH 051/398] Color SetStatusDialog and ChooseAccountDialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../adapters/items/GenericTextHeaderItem.java | 2 +- .../dialog/ChooseAccountDialogFragment.java | 7 +++ .../talk/ui/dialog/SetStatusDialogFragment.kt | 56 ++++++++--------- .../talk/ui/theme/ServerThemeProviderImpl.kt | 1 + .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 60 +++++++++++++++++-- .../main/res/layout/current_account_item.xml | 1 + .../main/res/layout/dialog_choose_account.xml | 1 + 7 files changed, 95 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.java index 017a0e9260a..657a605b7ae 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.java @@ -74,7 +74,7 @@ public void bindViewHolder(FlexibleAdapter adapter, HeaderViewHolder Log.d(TAG, "We have payloads, so ignoring!"); } else { holder.binding.titleTextView.setText(title); - viewThemeUtils.colorTextView(holder.binding.titleTextView); + viewThemeUtils.colorTextViewElement(holder.binding.titleTextView); } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java index c78db0e4c2c..3881bed5c9b 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java @@ -51,6 +51,7 @@ import com.nextcloud.talk.models.json.status.StatusOverall; import com.nextcloud.talk.ui.StatusDrawable; import com.nextcloud.talk.users.UserManager; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew; @@ -87,6 +88,9 @@ public class ChooseAccountDialogFragment extends DialogFragment { @Inject NcApi ncApi; + @Inject + ViewThemeUtils viewThemeUtils; + private DialogChooseAccountBinding binding; private View dialogView; @@ -120,6 +124,9 @@ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { binding.currentAccount.ticker.setVisibility(View.GONE); binding.currentAccount.account.setText((Uri.parse(user.getBaseUrl()).getHost())); + viewThemeUtils.colorImageView(binding.currentAccount.accountMenu); + + if (user.getBaseUrl() != null && (user.getBaseUrl().startsWith("http://") || user.getBaseUrl().startsWith("https://"))) { binding.currentAccount.userIcon.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index e0d8630f9e6..69407cc5fe0 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -34,12 +34,15 @@ import android.view.inputmethod.InputMethodManager import android.widget.AdapterView import android.widget.AdapterView.OnItemSelectedListener import android.widget.ArrayAdapter +import android.widget.ImageView +import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.DialogFragment import androidx.recyclerview.widget.LinearLayoutManager import autodagger.AutoInjector import com.bluelinelabs.logansquare.LoganSquare +import com.google.android.material.card.MaterialCardView import com.nextcloud.talk.R import com.nextcloud.talk.adapters.PredefinedStatusClickListener import com.nextcloud.talk.adapters.PredefinedStatusListAdapter @@ -53,6 +56,7 @@ import com.nextcloud.talk.models.json.status.Status import com.nextcloud.talk.models.json.status.StatusType import com.nextcloud.talk.models.json.status.predefined.PredefinedStatus import com.nextcloud.talk.models.json.status.predefined.PredefinedStatusOverall +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.vanniktech.emoji.EmojiPopup @@ -105,6 +109,9 @@ class SetStatusDialogFragment : @Inject lateinit var ncApi: NcApi + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + lateinit var credentials: String override fun onCreate(savedInstanceState: Bundle?) { @@ -234,8 +241,8 @@ class SetStatusDialogFragment : } } - binding.clearStatus.setTextColor(resources.getColor(R.color.colorPrimary)) - binding.setStatus.setBackgroundColor(resources.getColor(R.color.colorPrimary)) + viewThemeUtils.colorMaterialButtonText(binding.clearStatus) + viewThemeUtils.colorMaterialButtonBackground(binding.setStatus) binding.customStatusInput.highlightColor = resources.getColor(R.color.colorPrimary) @@ -258,7 +265,6 @@ class SetStatusDialogFragment : @Suppress("ComplexMethod") private fun setClearStatusAfterValue(item: Int) { - val currentTime = System.currentTimeMillis() / ONE_SECOND_IN_MILLIS when (item) { @@ -310,7 +316,6 @@ class SetStatusDialogFragment : } private fun clearAtToUnixTime(clearAt: ClearAt?): Long { - var returnValue = -1L if (clearAt != null) { @@ -400,25 +405,19 @@ class SetStatusDialogFragment : private fun visualizeStatus(statusType: StatusType) { clearTopStatus() - when (statusType) { - StatusType.ONLINE -> { - binding.onlineStatus.setCardBackgroundColor(resources.getColor(R.color.colorPrimary)) - binding.onlineHeadline.setTextColor(resources.getColor(R.color.high_emphasis_text_dark_background)) - } - StatusType.AWAY -> { - binding.awayStatus.setCardBackgroundColor(resources.getColor(R.color.colorPrimary)) - binding.awayHeadline.setTextColor(resources.getColor(R.color.high_emphasis_text_dark_background)) - } - StatusType.DND -> { - binding.dndStatus.setCardBackgroundColor(resources.getColor(R.color.colorPrimary)) - binding.dndHeadline.setTextColor(resources.getColor(R.color.high_emphasis_text_dark_background)) - } - StatusType.INVISIBLE -> { - binding.invisibleStatus.setCardBackgroundColor(resources.getColor(R.color.colorPrimary)) - binding.invisibleHeadline.setTextColor(resources.getColor(R.color.high_emphasis_text_dark_background)) + val views: Triple = when (statusType) { + StatusType.ONLINE -> Triple(binding.onlineStatus, binding.onlineHeadline, binding.onlineIcon) + StatusType.AWAY -> Triple(binding.awayStatus, binding.awayHeadline, binding.awayIcon) + StatusType.DND -> Triple(binding.dndStatus, binding.dndHeadline, binding.dndIcon) + StatusType.INVISIBLE -> Triple(binding.invisibleStatus, binding.invisibleHeadline, binding.invisibleIcon) + else -> { + Log.d(TAG, "unknown status") + return } - else -> Log.d(TAG, "unknown status") } + viewThemeUtils.colorCardViewBackground(views.first) + viewThemeUtils.colorTextViewText(views.second) + viewThemeUtils.colorImageViewText(views.third) } private fun clearTopStatus() { @@ -433,11 +432,15 @@ class SetStatusDialogFragment : binding.awayHeadline.setTextColor(resources.getColor(R.color.high_emphasis_text)) binding.dndHeadline.setTextColor(resources.getColor(R.color.high_emphasis_text)) binding.invisibleHeadline.setTextColor(resources.getColor(R.color.high_emphasis_text)) + + binding.onlineIcon.imageTintList = null + binding.awayIcon.imageTintList = null + binding.dndIcon.imageTintList = null + binding.invisibleIcon.imageTintList = null } } private fun setStatusMessage() { - val inputText = binding.customStatusInput.text.toString().ifEmpty { "" } // The endpoint '/message/custom' expects a valid emoji as string or null val statusIcon = binding.emoji.text.toString().ifEmpty { null } @@ -446,7 +449,6 @@ class SetStatusDialogFragment : selectedPredefinedStatus!!.message != inputText || selectedPredefinedStatus!!.icon != binding.emoji.text.toString() ) { - ncApi.setCustomStatusMessage( credentials, ApiUtils.getUrlForSetCustomStatus(currentUser?.baseUrl), @@ -476,12 +478,13 @@ class SetStatusDialogFragment : } }) } else { - val clearAt = clearAtToUnixTime(selectedPredefinedStatus!!.clearAt) ncApi.setPredefinedStatusMessage( - credentials, ApiUtils.getUrlForSetPredefinedStatus(currentUser?.baseUrl), - selectedPredefinedStatus!!.id, if (clearAt == -1L) null else clearAt + credentials, + ApiUtils.getUrlForSetPredefinedStatus(currentUser?.baseUrl), + selectedPredefinedStatus!!.id, + if (clearAt == -1L) null else clearAt ) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())?.subscribe(object : Observer { @@ -506,7 +509,6 @@ class SetStatusDialogFragment : } override fun onClick(predefinedStatus: PredefinedStatus) { - selectedPredefinedStatus = predefinedStatus clearAt = clearAtToUnixTime(predefinedStatus.clearAt) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt index b4a4df43f85..87cdcee6b61 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt @@ -29,6 +29,7 @@ import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import javax.inject.Inject // TODO cache theme, keyed by server url +// TODO reload UI when account changes internal class ServerThemeProviderImpl @Inject constructor( private val context: Context, private val userProvider: CurrentUserProviderNew diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 7dcb23c6b82..99373ba762b 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -24,8 +24,11 @@ package com.nextcloud.talk.ui.theme import android.content.Context import android.content.res.ColorStateList import android.content.res.Configuration +import android.view.View import android.widget.ImageView import android.widget.TextView +import com.google.android.material.button.MaterialButton +import com.google.android.material.card.MaterialCardView import com.google.android.material.floatingactionbutton.FloatingActionButton import javax.inject.Inject @@ -47,20 +50,67 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { else -> theme.colorElementBright } + private fun withElementColor(view: View, block: (Int) -> Unit) { + block(getElementColor(view.context)) + } + fun themeFAB(fab: FloatingActionButton) { - fab.backgroundTintList = ColorStateList.valueOf(getElementColor(fab.context)) - fab.imageTintList = ColorStateList.valueOf(theme.colorText) + withElementColor(fab) { color -> + fab.backgroundTintList = ColorStateList.valueOf(color) + fab.imageTintList = ColorStateList.valueOf(theme.colorText) + } } - fun colorTextView(textView: TextView) { - textView.setTextColor(getElementColor(textView.context)) + fun colorTextViewElement(textView: TextView) { + withElementColor(textView) { color -> + textView.setTextColor(color) + } + } + + fun colorTextViewText(textView: TextView) { + textView.setTextColor(theme.colorText) } /** * Colors the background as element color and the foreground as text color. */ fun colorImageViewButton(imageView: ImageView) { + withElementColor(imageView) { color -> + imageView.imageTintList = ColorStateList.valueOf(theme.colorText) + imageView.backgroundTintList = ColorStateList.valueOf(color) + } + } + + /** + * Tints the image with element color + */ + fun colorImageView(imageView: ImageView) { + withElementColor(imageView) { color -> + imageView.imageTintList = ColorStateList.valueOf(color) + } + } + + /** + * Tints the image with text color + */ + fun colorImageViewText(imageView: ImageView) { imageView.imageTintList = ColorStateList.valueOf(theme.colorText) - imageView.backgroundTintList = ColorStateList.valueOf(getElementColor(imageView.context)) + } + + fun colorMaterialButtonText(button: MaterialButton) { + colorTextViewElement(button) + } + + fun colorMaterialButtonBackground(button: MaterialButton) { + withElementColor(button) { color -> + button.setBackgroundColor(color) + button.setTextColor(theme.colorText) + } + } + + fun colorCardViewBackground(card: MaterialCardView) { + withElementColor(card) { color -> + card.setCardBackgroundColor(color) + } } } diff --git a/app/src/main/res/layout/current_account_item.xml b/app/src/main/res/layout/current_account_item.xml index 680fb3a36e6..d1972e62ac3 100644 --- a/app/src/main/res/layout/current_account_item.xml +++ b/app/src/main/res/layout/current_account_item.xml @@ -31,6 +31,7 @@ app:cardElevation="0dp"> From 5abdacab2509025da316cdb53a3c8f847f4cdc5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Thu, 21 Jul 2022 16:06:26 +0200 Subject: [PATCH 052/398] SettingsController: color section headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../talk/controllers/SettingsController.kt | 25 +++++++++++++++++-- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 8 ++++++ .../main/res/layout/controller_settings.xml | 8 +++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt index 98f7c5364b6..8eede30cd96 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt @@ -78,6 +78,7 @@ import com.nextcloud.talk.jobs.ContactAddressBookWorker.Companion.deleteAll import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.userprofile.UserProfileOverall import com.nextcloud.talk.users.UserManager +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.LoggingUtils.sendMailWithAttachment @@ -118,6 +119,9 @@ class SettingsController : NewBaseController(R.layout.controller_settings) { @Inject lateinit var currentUserProvider: CurrentUserProviderNew + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private var saveStateHandler: LovelySaveStateHandler? = null private var currentUser: User? = null private var credentials: String? = null @@ -402,7 +406,8 @@ class SettingsController : NewBaseController(R.layout.controller_settings) { .setIcon( DisplayUtils.getTintedDrawable( resources, - R.drawable.ic_delete_black_24dp, R.color.bg_default + R.drawable.ic_delete_black_24dp, + R.color.bg_default ) ) .setPositiveButtonColor(context!!.resources.getColor(R.color.nc_darkRed)) @@ -511,6 +516,20 @@ class SettingsController : NewBaseController(R.layout.controller_settings) { ) } + + themeCategories() + } + + private fun themeCategories() { + binding.run { + listOf( + settingsNotificationsCategory, + settingsAboutCategory, + settingsAdvancedCategory, + settingsAppearanceCategory, + settingsPrivacyCategory + ).forEach(viewThemeUtils::colorPreferenceCategory) + } } private fun setupProxyTypeSettings() { @@ -952,7 +971,9 @@ class SettingsController : NewBaseController(R.layout.controller_settings) { val phoneNumber = textInputLayout.editText!!.text.toString() ncApi.setUserData( ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token), - ApiUtils.getUrlForUserData(currentUser!!.baseUrl, currentUser!!.userId), "phone", phoneNumber + ApiUtils.getUrlForUserData(currentUser!!.baseUrl, currentUser!!.userId), + "phone", + phoneNumber ).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Observer { diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 99373ba762b..4ad72b83a2b 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -30,6 +30,7 @@ import android.widget.TextView import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.yarolegovich.mp.MaterialPreferenceCategory import javax.inject.Inject class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { @@ -113,4 +114,11 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { card.setCardBackgroundColor(color) } } + + // TODO split this util into classes depending on framework views vs library views + fun colorPreferenceCategory(category: MaterialPreferenceCategory) { + withElementColor(category) { color -> + category.setTitleColor(color) + } + } } diff --git a/app/src/main/res/layout/controller_settings.xml b/app/src/main/res/layout/controller_settings.xml index 04c19a4d178..7c239a303df 100644 --- a/app/src/main/res/layout/controller_settings.xml +++ b/app/src/main/res/layout/controller_settings.xml @@ -27,6 +27,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:fresco="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" + tools:background="@color/white" android:id="@+id/settings_screen" android:layout_width="match_parent" android:layout_height="match_parent"> @@ -43,6 +44,7 @@ android:id="@+id/message_text" android:layout_width="match_parent" android:layout_height="match_parent" + tools:text="This is a test message" android:gravity="center" /> @@ -105,10 +107,10 @@ android:id="@+id/server_age_warning_text" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_centerHorizontal="true" android:layout_toEndOf="@id/server_age_warning_icon" android:paddingStart="@dimen/standard_padding" android:paddingEnd="0dp" - android:layout_centerHorizontal="true" android:textAlignment="viewStart" android:textColor="@color/nc_darkRed" tools:text="@string/nc_settings_server_almost_eol" /> @@ -142,6 +144,7 @@ Date: Thu, 21 Jul 2022 17:24:42 +0200 Subject: [PATCH 053/398] SettingsController: theme switch preferences MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../talk/controllers/SettingsController.kt | 14 ++++++ .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 45 +++++++++++++++++++ app/src/main/res/values-night/colors.xml | 4 ++ app/src/main/res/values/colors.xml | 3 ++ 4 files changed, 66 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt index 8eede30cd96..3ad36737b23 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt @@ -518,6 +518,20 @@ class SettingsController : NewBaseController(R.layout.controller_settings) { } themeCategories() + themeSwitchPreferences() + } + + private fun themeSwitchPreferences() { + binding.run { + listOf( + settingsScreenLock, + settingsScreenSecurity, + settingsIncognitoKeyboard, + settingsPhoneBookIntegration, + settingsReadPrivacy, + settingsProxyUseCredentials + ).forEach(viewThemeUtils::colorSwitchPreference) + } } private fun themeCategories() { diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 4ad72b83a2b..df5b587f6f4 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -24,13 +24,19 @@ package com.nextcloud.talk.ui.theme import android.content.Context import android.content.res.ColorStateList import android.content.res.Configuration +import android.graphics.Color import android.view.View import android.widget.ImageView import android.widget.TextView +import androidx.appcompat.widget.SwitchCompat +import androidx.core.content.res.ResourcesCompat +import androidx.core.view.children import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.nextcloud.talk.R import com.yarolegovich.mp.MaterialPreferenceCategory +import com.yarolegovich.mp.MaterialSwitchPreference import javax.inject.Inject class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { @@ -121,4 +127,43 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { category.setTitleColor(color) } } + + fun colorSwitchPreference(preference: MaterialSwitchPreference) { + val children = preference.children + val switch = children.find { it is SwitchCompat } + if (switch != null) { + val switchCompat = (switch as SwitchCompat) + colorSwitchCompat(switchCompat) + } + } + + // TODO cleanup + fun colorSwitchCompat(switchCompat: SwitchCompat) { + withElementColor(switchCompat) { color -> + + val context = switchCompat.context + + val thumbUncheckedColor = ResourcesCompat.getColor( + context.resources, + R.color.switch_thumb_color_unchecked, + context.theme + ) + val trackUncheckedColor = ResourcesCompat.getColor( + context.resources, + R.color.switch_track_color_unchecked, + context.theme + ) + + val trackColor = Color.argb(77, Color.red(color), Color.green(color), Color.blue(color)) + switchCompat.thumbTintList = ColorStateList( + arrayOf(intArrayOf(android.R.attr.state_checked), intArrayOf()), + intArrayOf(color, thumbUncheckedColor) + ) + + switchCompat.trackTintList = ColorStateList( + arrayOf(intArrayOf(android.R.attr.state_checked), intArrayOf()), + intArrayOf(trackColor, trackUncheckedColor) + ) + } + } } diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 86f4044a533..ae1bcea4dae 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -76,4 +76,8 @@ #353535 #424242 + + #cbcbcb + #5a5a5a + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2993412c918..28ff0ff06db 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -111,4 +111,7 @@ #FFFFFF #FFFFFF + #ececec + #b2b2b2 + From a4c01978a8de44da3da150166416e6dd85eec4a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Fri, 22 Jul 2022 14:28:09 +0200 Subject: [PATCH 054/398] Theme ProfileController MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../talk/controllers/ProfileController.kt | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt index 52631f15fc6..9db7d8781ba 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt @@ -69,6 +69,7 @@ import com.nextcloud.talk.models.json.userprofile.UserProfileFieldsOverall import com.nextcloud.talk.models.json.userprofile.UserProfileOverall import com.nextcloud.talk.remotefilebrowser.activities.RemoteFileBrowserActivity import com.nextcloud.talk.ui.dialog.ScopeDialog +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils @@ -110,6 +111,9 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { @Inject lateinit var permissionUtil: PlatformPermissionUtil + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private var currentUser: User? = null private var edit = false private var adapter: UserInfoAdapter? = null @@ -196,7 +200,7 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { override fun onAttach(view: View) { super.onAttach(view) - adapter = UserInfoAdapter(null, activity!!.resources.getColor(R.color.colorPrimary), this) + adapter = UserInfoAdapter(null, viewThemeUtils.getElementColor(activity!!), this) binding.userinfoList.adapter = adapter binding.userinfoList.setItemViewCacheSize(DEFAULT_CACHE_SIZE) currentUser = userManager.currentUser.blockingGet() @@ -260,6 +264,13 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { // unused atm } }) + + colorIcons() + } + + private fun colorIcons() { + viewThemeUtils.colorImageView(binding.avatarChoose) + viewThemeUtils.colorImageView(binding.avatarCamera) } private fun isAllEmpty(items: Array): Boolean { @@ -301,7 +312,8 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { binding.emptyList.root.visibility = View.VISIBLE setErrorMessageForMultiList( activity!!.getString(R.string.userinfo_no_info_headline), - activity!!.getString(R.string.userinfo_no_info_text), R.drawable.ic_user + activity!!.getString(R.string.userinfo_no_info_text), + R.drawable.ic_user ) } else { binding.emptyList.root.visibility = View.GONE @@ -616,11 +628,13 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { val builder = MultipartBody.Builder() builder.setType(MultipartBody.FORM) builder.addFormDataPart( - "files[]", file!!.name, + "files[]", + file!!.name, file.asRequestBody(IMAGE_PREFIX_GENERIC.toMediaTypeOrNull()) ) val filePart: MultipartBody.Part = MultipartBody.Part.createFormData( - "files[]", file.name, + "files[]", + file.name, file.asRequestBody(IMAGE_JPG.toMediaTypeOrNull()) ) @@ -643,7 +657,8 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { override fun onError(e: Throwable) { Toast.makeText( - applicationContext, context.getString(R.string.default_error_msg), + applicationContext, + context.getString(R.string.default_error_msg), Toast .LENGTH_LONG ).show() @@ -688,7 +703,8 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { } class UserInfoDetailsItem( - @field:DrawableRes @param:DrawableRes var icon: Int, + @field:DrawableRes @param:DrawableRes + var icon: Int, var text: String?, var hint: String, val field: Field, From 49f9e0ffc4055bb6cefb154273c3ee60421eda8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Fri, 22 Jul 2022 15:04:15 +0200 Subject: [PATCH 055/398] Theme RemoteFileBrowser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../activities/RemoteFileBrowserActivity.kt | 8 ++++-- .../adapters/RemoteFileBrowserItemsAdapter.kt | 9 ++++--- .../RemoteFileBrowserItemsListViewHolder.kt | 26 ++++++++++++++++--- .../ui/dialog/SortingOrderDialogFragment.java | 16 ++++++------ .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 23 ++++++++++++++++ 5 files changed, 65 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt index 75f87bf9351..da0d78049b3 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt @@ -44,6 +44,7 @@ import com.nextcloud.talk.remotefilebrowser.SelectionInterface import com.nextcloud.talk.remotefilebrowser.adapters.RemoteFileBrowserItemsAdapter import com.nextcloud.talk.remotefilebrowser.viewmodels.RemoteFileBrowserItemsViewModel import com.nextcloud.talk.ui.dialog.SortingOrderDialogFragment +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.FileSortOrder import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_MIME_TYPE_FILTER @@ -59,6 +60,9 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe @Inject lateinit var currentUserProvider: CurrentUserProviderNew + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private lateinit var binding: ActivityRemoteFileBrowserBinding private lateinit var viewModel: RemoteFileBrowserItemsViewModel @@ -91,8 +95,7 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe initViewModel(mimeTypeSelectionFilter) binding.swipeRefreshList.setOnRefreshListener(this) - binding.swipeRefreshList.setColorSchemeResources(R.color.colorPrimary) - binding.swipeRefreshList.setProgressBackgroundColorSchemeResource(R.color.refresh_spinner_background) + viewThemeUtils.themeSwipeRefreshLayout(binding.swipeRefreshList) binding.pathNavigationBackButton.setOnClickListener { viewModel.navigateUp() } binding.sortButton.setOnClickListener { changeSorting() } @@ -160,6 +163,7 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe mimeTypeSelectionFilter = mimeTypeSelectionFilter, user = currentUserProvider.currentUser.blockingGet(), selectionInterface = this, + viewThemeUtils = viewThemeUtils, onItemClicked = viewModel::onItemClicked ) adapter.items = remoteFileBrowserItems diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsAdapter.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsAdapter.kt index 5a146cb11b0..d63da5449af 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsAdapter.kt @@ -28,19 +28,20 @@ import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.RvItemBrowserFileBinding import com.nextcloud.talk.remotefilebrowser.SelectionInterface import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem +import com.nextcloud.talk.ui.theme.ViewThemeUtils class RemoteFileBrowserItemsAdapter( private val showGrid: Boolean = false, private val mimeTypeSelectionFilter: String? = null, private val user: User, private val selectionInterface: SelectionInterface, + private val viewThemeUtils: ViewThemeUtils, private val onItemClicked: (RemoteFileBrowserItem) -> Unit ) : RecyclerView.Adapter() { var items: List = emptyList() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RemoteFileBrowserItemsViewHolder { - return if (showGrid) { RemoteFileBrowserItemsListViewHolder( RvItemBrowserFileBinding.inflate( @@ -50,7 +51,8 @@ class RemoteFileBrowserItemsAdapter( ), mimeTypeSelectionFilter, user, - selectionInterface + selectionInterface, + viewThemeUtils ) { onItemClicked(items[it]) } @@ -63,7 +65,8 @@ class RemoteFileBrowserItemsAdapter( ), mimeTypeSelectionFilter, user, - selectionInterface + selectionInterface, + viewThemeUtils ) { onItemClicked(items[it]) } diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt index 22ad32704e7..5ef9d2852c5 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt @@ -20,6 +20,7 @@ package com.nextcloud.talk.remotefilebrowser.adapters +import android.graphics.drawable.Drawable import android.text.format.Formatter import android.view.View import androidx.appcompat.content.res.AppCompatResources @@ -33,6 +34,7 @@ import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.RvItemBrowserFileBinding import com.nextcloud.talk.remotefilebrowser.SelectionInterface import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DateUtils.getLocalDateTimeStringFromTimestamp import com.nextcloud.talk.utils.DisplayUtils @@ -45,6 +47,7 @@ class RemoteFileBrowserItemsListViewHolder( mimeTypeSelectionFilter: String?, currentUser: User, selectionInterface: SelectionInterface, + private val viewThemeUtils: ViewThemeUtils, onItemClicked: (Int) -> Unit ) : RemoteFileBrowserItemsViewHolder(binding, mimeTypeSelectionFilter, currentUser, selectionInterface) { @@ -66,7 +69,6 @@ class RemoteFileBrowserItemsListViewHolder( } override fun onBind(item: RemoteFileBrowserItem) { - super.onBind(item) binding.fileIcon.controller = null @@ -99,9 +101,7 @@ class RemoteFileBrowserItemsListViewHolder( binding.fileIcon .hierarchy .setPlaceholderImage( - AppCompatResources.getDrawable( - binding.fileIcon.context, getDrawableResourceIdForMimeType(item.mimeType) - ) + getPlaceholderImage(item) ) if (item.hasPreview) { @@ -129,9 +129,23 @@ class RemoteFileBrowserItemsListViewHolder( binding.selectFileCheckbox.isChecked = selectionInterface.isPathSelected(item.path!!) } + private fun getPlaceholderImage(item: RemoteFileBrowserItem): Drawable? { + val drawableResourceId = getDrawableResourceIdForMimeType(item.mimeType) + val context = binding.fileIcon.context + val drawable = AppCompatResources.getDrawable( + context, + drawableResourceId + ) + if (drawable != null && THEMEABLE_PLACEHOLDER_IDS.contains(drawableResourceId)) { + viewThemeUtils.colorDrawable(context, drawable) + } + return drawable + } + private fun setSelectability() { if (selectable) { binding.selectFileCheckbox.visibility = View.VISIBLE + viewThemeUtils.themeCheckbox(binding.selectFileCheckbox) } else { binding.selectFileCheckbox.visibility = View.GONE } @@ -150,5 +164,9 @@ class RemoteFileBrowserItemsListViewHolder( companion object { private const val DISABLED_ALPHA: Float = 0.38f private const val ENABLED_ALPHA: Float = 1.0f + private val THEMEABLE_PLACEHOLDER_IDS = listOf( + R.drawable.ic_mimetype_package_x_generic, + R.drawable.ic_mimetype_folder + ) } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SortingOrderDialogFragment.java b/app/src/main/java/com/nextcloud/talk/ui/dialog/SortingOrderDialogFragment.java index f2d5c8d669a..e348504cd86 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SortingOrderDialogFragment.java +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SortingOrderDialogFragment.java @@ -33,9 +33,9 @@ import com.google.android.material.button.MaterialButton; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.databinding.SortingOrderFragmentBinding; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.utils.FileSortOrder; import com.nextcloud.talk.utils.preferences.AppPreferences; @@ -46,7 +46,6 @@ import androidx.annotation.NonNull; import androidx.fragment.app.DialogFragment; import autodagger.AutoInjector; -import kotlin.jvm.JvmField; /** * Dialog to show and choose the sorting order for the file listing. @@ -60,9 +59,11 @@ public class SortingOrderDialogFragment extends DialogFragment implements View.O private static final String KEY_SORT_ORDER = "SORT_ORDER"; @Inject - @JvmField AppPreferences appPreferences; + @Inject + ViewThemeUtils viewThemeUtils; + private SortingOrderFragmentBinding binding; private View dialogView; @@ -119,7 +120,7 @@ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { * find all relevant UI elements and set their values. */ private void setupDialogElements() { - binding.cancel.setTextColor(getResources().getColor(R.color.colorPrimary)); + viewThemeUtils.colorMaterialButtonText(binding.cancel); taggedViews = new View[12]; taggedViews[0] = binding.sortByNameAscending; @@ -154,18 +155,17 @@ private void setupDialogElements() { * tints the icon reflecting the actual sorting choice in the apps primary color. */ private void setupActiveOrderSelection() { - final int color = getResources().getColor(R.color.colorPrimary); - Log.i("SortOrder", "currentSortOrderName="+currentSortOrderName); + Log.i("SortOrder", "currentSortOrderName=" + currentSortOrderName); for (View view : taggedViews) { Log.i("SortOrder", ((FileSortOrder) view.getTag()).getName()); if (!((FileSortOrder) view.getTag()).getName().equals(currentSortOrderName)) { continue; } if (view instanceof MaterialButton) { - ((MaterialButton) view).setIconTintResource(R.color.colorPrimary); + viewThemeUtils.colorMaterialButtonText((MaterialButton) view); } if (view instanceof TextView) { - ((TextView) view).setTextColor(color); + viewThemeUtils.colorTextViewElement((TextView) view); ((TextView) view).setTypeface(Typeface.DEFAULT_BOLD); } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index df5b587f6f4..eaf5496ab8d 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -25,12 +25,15 @@ import android.content.Context import android.content.res.ColorStateList import android.content.res.Configuration import android.graphics.Color +import android.graphics.drawable.Drawable import android.view.View +import android.widget.CheckBox import android.widget.ImageView import android.widget.TextView import androidx.appcompat.widget.SwitchCompat import androidx.core.content.res.ResourcesCompat import androidx.core.view.children +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.floatingactionbutton.FloatingActionButton @@ -106,6 +109,7 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { fun colorMaterialButtonText(button: MaterialButton) { colorTextViewElement(button) + button.iconTint = ColorStateList.valueOf(getElementColor(button.context)) } fun colorMaterialButtonBackground(button: MaterialButton) { @@ -166,4 +170,23 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { ) } } + + fun colorDrawable(context: Context, drawable: Drawable) { + val color = getElementColor(context) + drawable.setTint(color) + } + + fun themeCheckbox(checkbox: CheckBox) { + withElementColor(checkbox) { color -> + checkbox.setTextColor(color) + checkbox.buttonTintList = ColorStateList.valueOf(color) + } + } + + fun themeSwipeRefreshLayout(swipeRefreshLayout: SwipeRefreshLayout) { + withElementColor(swipeRefreshLayout) { color -> + swipeRefreshLayout.setColorSchemeColors(color) + swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.refresh_spinner_background) + } + } } From b4ed79dc3894ff4e749779aa1d28fd6c99420e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Fri, 22 Jul 2022 15:47:26 +0200 Subject: [PATCH 056/398] Theme EntryMenuController MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../bottomsheet/EntryMenuController.kt | 23 +++++++++++-------- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 8 +++++++ .../main/res/layout/controller_entry_menu.xml | 2 +- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt index 801ea39ac7c..b592b2a5476 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt @@ -25,7 +25,7 @@ package com.nextcloud.talk.controllers.bottomsheet import android.content.ComponentName import android.content.Intent -import android.graphics.PorterDuff +import android.content.res.ColorStateList import android.os.Bundle import android.os.Parcelable import android.text.Editable @@ -34,6 +34,7 @@ import android.text.TextUtils import android.text.TextWatcher import android.view.View import android.view.inputmethod.EditorInfo +import androidx.core.content.res.ResourcesCompat import autodagger.AutoInjector import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler @@ -45,6 +46,7 @@ import com.nextcloud.talk.controllers.base.NewBaseController import com.nextcloud.talk.controllers.util.viewBinding import com.nextcloud.talk.databinding.ControllerEntryMenuBinding import com.nextcloud.talk.models.json.conversations.Conversation +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.ShareUtils import com.nextcloud.talk.utils.UriUtils @@ -71,6 +73,9 @@ class EntryMenuController(args: Bundle) : @Inject lateinit var userManager: UserManager + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private val operation: ConversationOperationEnum private var conversation: Conversation? = null private var shareIntent: Intent? = null @@ -125,17 +130,11 @@ class EntryMenuController(args: Bundle) : rootView = view, editText = binding.textEdit, onEmojiPopupShownListener = { - if (resources != null) { - binding.smileyButton.setColorFilter( - resources!!.getColor(R.color.colorPrimary), - PorterDuff.Mode.SRC_IN - ) - } + viewThemeUtils.colorImageView(binding.smileyButton) }, onEmojiPopupDismissListener = { - binding.smileyButton.setColorFilter( - resources!!.getColor(R.color.emoji_icons), - PorterDuff.Mode.SRC_IN + binding.smileyButton.imageTintList = ColorStateList.valueOf( + ResourcesCompat.getColor(resources!!, R.color.medium_emphasis_text, context.theme) ) }, onEmojiClickListener = { @@ -171,6 +170,10 @@ class EntryMenuController(args: Bundle) : binding.textInputLayout.endIconMode = TextInputLayout.END_ICON_NONE } + viewThemeUtils.colorTextInputLayout(binding.textInputLayout) + binding.textEdit.setTextColor(viewThemeUtils.theme.colorText) + viewThemeUtils.colorMaterialButtonText(binding.okButton) + binding.textInputLayout.hint = labelText binding.textInputLayout.requestFocus() diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index eaf5496ab8d..916b1b9813c 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -37,6 +37,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.google.android.material.textfield.TextInputLayout import com.nextcloud.talk.R import com.yarolegovich.mp.MaterialPreferenceCategory import com.yarolegovich.mp.MaterialSwitchPreference @@ -189,4 +190,11 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.refresh_spinner_background) } } + + fun colorTextInputLayout(textInputLayout: TextInputLayout) { + withElementColor(textInputLayout) { color -> + textInputLayout.hintTextColor = ColorStateList.valueOf(color) + textInputLayout.boxStrokeColor = color + } + } } diff --git a/app/src/main/res/layout/controller_entry_menu.xml b/app/src/main/res/layout/controller_entry_menu.xml index 8bf6fc67491..2f50f3d687b 100644 --- a/app/src/main/res/layout/controller_entry_menu.xml +++ b/app/src/main/res/layout/controller_entry_menu.xml @@ -78,7 +78,7 @@ android:contentDescription="@string/nc_add_emojis" android:src="@drawable/ic_insert_emoticon_black_24dp" android:visibility="gone" - app:tint="@color/emoji_icons" + app:tint="@color/medium_emphasis_text" tools:visibility="visible" /> From b66ec4a1501f05dc1df531b9bf377f0e91513173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Fri, 22 Jul 2022 16:06:09 +0200 Subject: [PATCH 057/398] Theme ConversationInfoController MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../controllers/ConversationInfoController.kt | 94 +++++++++++++------ .../layout/controller_conversation_info.xml | 2 + .../res/layout/notification_settings_item.xml | 1 + 3 files changed, 66 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt index 866a5024ff3..6347acbb855 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt @@ -73,6 +73,7 @@ import com.nextcloud.talk.models.json.participants.Participant.ActorType.GROUPS import com.nextcloud.talk.models.json.participants.Participant.ActorType.USERS import com.nextcloud.talk.models.json.participants.ParticipantsOverall import com.nextcloud.talk.shareditems.activities.SharedItemsActivity +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DateConstants import com.nextcloud.talk.utils.DateUtils @@ -112,6 +113,9 @@ class ConversationInfoController(args: Bundle) : @Inject lateinit var eventBus: EventBus + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private val conversationToken: String? private val conversationUser: User? private val hasAvatarSpacing: Boolean @@ -181,6 +185,34 @@ class ConversationInfoController(args: Bundle) : } fetchRoomInfo() + + themeCategories() + themeSwitchPreferences() + } + + private fun themeSwitchPreferences() { + binding.run { + listOf( + binding.webinarInfoView.conversationInfoLobby, + binding.notificationSettingsView.callNotifications, + binding.notificationSettingsView.conversationInfoPriorityConversation + ).forEach(viewThemeUtils::colorSwitchPreference) + } + } + + private fun themeCategories() { + binding.run { + listOf( + conversationInfoName, + conversationDescription, + otherRoomOptions, + participantsListCategory, + ownOptions, + categorySharedItems, + binding.webinarInfoView.conversationInfoWebinar, + binding.notificationSettingsView.notificationSettingsCategory + ).forEach(viewThemeUtils::colorPreferenceCategory) + } } private fun showSharedItems() { @@ -299,7 +331,7 @@ class ConversationInfoController(args: Bundle) : val apiVersion = ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1)) - ncApi?.setLobbyForConversation( + ncApi.setLobbyForConversation( ApiUtils.getCredentials(conversationUser!!.username, conversationUser.token), ApiUtils.getUrlForRoomWebinaryLobby(apiVersion, conversationUser.baseUrl, conversation!!.token), state, @@ -343,7 +375,7 @@ class ConversationInfoController(args: Bundle) : override fun onDetach(view: View) { super.onDetach(view) - eventBus?.unregister(this) + eventBus.unregister(this) } private fun showDeleteConversationDialog(savedInstanceState: Bundle?) { @@ -352,11 +384,11 @@ class ConversationInfoController(args: Bundle) : .setTopColorRes(R.color.nc_darkRed) .setIcon( DisplayUtils.getTintedDrawable( - context!!.resources, + context.resources, R.drawable.ic_delete_black_24dp, R.color.bg_default ) ) - .setPositiveButtonColor(context!!.resources.getColor(R.color.nc_darkRed)) + .setPositiveButtonColor(context.resources.getColor(R.color.nc_darkRed)) .setTitle(R.string.nc_delete_call) .setMessage(R.string.nc_delete_conversation_more) .setPositiveButton(R.string.nc_delete) { deleteConversation() } @@ -409,7 +441,7 @@ class ConversationInfoController(args: Bundle) : if (participant.sessionId != null) { userItem.isOnline = !participant.sessionId.equals("0") } else { - userItem.isOnline = !participant.sessionIds!!.isEmpty() + userItem.isOnline = !participant.sessionIds.isEmpty() } if (participant.calculatedActorType == USERS && @@ -453,7 +485,7 @@ class ConversationInfoController(args: Bundle) : val fieldMap = HashMap() fieldMap["includeStatus"] = true - ncApi?.getPeersForCall( + ncApi.getPeersForCall( credentials, ApiUtils.getUrlForParticipants( apiVersion, @@ -504,7 +536,7 @@ class ConversationInfoController(args: Bundle) : bundle.putStringArrayList(BundleKeys.KEY_EXISTING_PARTICIPANTS, existingParticipantsId) bundle.putString(BundleKeys.KEY_TOKEN, conversation!!.token) - getRouter().pushController( + router.pushController( ( RouterTransaction.with( ContactsController(bundle) @@ -537,11 +569,11 @@ class ConversationInfoController(args: Bundle) : .setTopColorRes(R.color.nc_darkRed) .setIcon( DisplayUtils.getTintedDrawable( - context!!.resources, + context.resources, R.drawable.ic_delete_black_24dp, R.color.bg_default ) ) - .setPositiveButtonColor(context!!.resources.getColor(R.color.nc_darkRed)) + .setPositiveButtonColor(context.resources.getColor(R.color.nc_darkRed)) .setTitle(R.string.nc_clear_history) .setMessage(R.string.nc_clear_history_warning) .setPositiveButton(R.string.nc_delete_all) { clearHistory() } @@ -555,7 +587,7 @@ class ConversationInfoController(args: Bundle) : private fun clearHistory() { val apiVersion = ApiUtils.getChatApiVersion(conversationUser, intArrayOf(1)) - ncApi?.clearChatHistory( + ncApi.clearChatHistory( credentials, ApiUtils.getUrlForChat(apiVersion, conversationUser!!.baseUrl, conversationToken) ) @@ -567,7 +599,7 @@ class ConversationInfoController(args: Bundle) : } override fun onNext(genericOverall: GenericOverall) { - Toast.makeText(context, context?.getString(R.string.nc_clear_history_success), Toast.LENGTH_LONG) + Toast.makeText(context, context.getString(R.string.nc_clear_history_success), Toast.LENGTH_LONG) .show() } @@ -606,7 +638,7 @@ class ConversationInfoController(args: Bundle) : apiVersion = ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1)) } - ncApi?.getRoom(credentials, ApiUtils.getUrlForRoom(apiVersion, conversationUser!!.baseUrl, conversationToken)) + ncApi.getRoom(credentials, ApiUtils.getUrlForRoom(apiVersion, conversationUser!!.baseUrl, conversationToken)) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) ?.subscribe(object : Observer { @@ -765,8 +797,8 @@ class ConversationInfoController(args: Bundle) : ) Conversation.ConversationType.ROOM_SYSTEM -> { val layers = arrayOfNulls(2) - layers[0] = ContextCompat.getDrawable(context!!, R.drawable.ic_launcher_background) - layers[1] = ContextCompat.getDrawable(context!!, R.drawable.ic_launcher_foreground) + layers[0] = ContextCompat.getDrawable(context, R.drawable.ic_launcher_background) + layers[1] = ContextCompat.getDrawable(context, R.drawable.ic_launcher_foreground) val layerDrawable = LayerDrawable(layers) binding.avatarImage.hierarchy.setPlaceholderImage(DisplayUtils.getRoundedDrawable(layerDrawable)) } @@ -800,7 +832,7 @@ class ConversationInfoController(args: Bundle) : if (participant.type == Participant.ParticipantType.MODERATOR || participant.type == Participant.ParticipantType.GUEST_MODERATOR ) { - ncApi?.demoteAttendeeFromModerator( + ncApi.demoteAttendeeFromModerator( credentials, ApiUtils.getUrlForRoomModerators( apiVersion, @@ -815,7 +847,7 @@ class ConversationInfoController(args: Bundle) : } else if (participant.type == Participant.ParticipantType.USER || participant.type == Participant.ParticipantType.GUEST ) { - ncApi?.promoteAttendeeToModerator( + ncApi.promoteAttendeeToModerator( credentials, ApiUtils.getUrlForRoomModerators( apiVersion, @@ -851,7 +883,7 @@ class ConversationInfoController(args: Bundle) : } if (participant.type == Participant.ParticipantType.MODERATOR) { - ncApi?.demoteModeratorToUser( + ncApi.demoteModeratorToUser( credentials, ApiUtils.getUrlForRoomModerators( apiVersion, @@ -864,7 +896,7 @@ class ConversationInfoController(args: Bundle) : ?.observeOn(AndroidSchedulers.mainThread()) ?.subscribe(subscriber) } else if (participant.type == Participant.ParticipantType.USER) { - ncApi?.promoteUserToModerator( + ncApi.promoteUserToModerator( credentials, ApiUtils.getUrlForRoomModerators( apiVersion, @@ -881,7 +913,7 @@ class ConversationInfoController(args: Bundle) : fun removeAttendeeFromConversation(apiVersion: Int, participant: Participant) { if (apiVersion >= ApiUtils.APIv4) { - ncApi?.removeAttendeeFromConversation( + ncApi.removeAttendeeFromConversation( credentials, ApiUtils.getUrlForAttendees( apiVersion, @@ -914,7 +946,7 @@ class ConversationInfoController(args: Bundle) : if (participant.type == Participant.ParticipantType.GUEST || participant.type == Participant.ParticipantType.USER_FOLLOWING_LINK ) { - ncApi?.removeParticipantFromConversation( + ncApi.removeParticipantFromConversation( credentials, ApiUtils.getUrlForRemovingParticipantFromConversation( conversationUser!!.baseUrl, @@ -944,7 +976,7 @@ class ConversationInfoController(args: Bundle) : } }) } else { - ncApi?.removeParticipantFromConversation( + ncApi.removeParticipantFromConversation( credentials, ApiUtils.getUrlForRemovingParticipantFromConversation( conversationUser!!.baseUrl, @@ -987,12 +1019,12 @@ class ConversationInfoController(args: Bundle) : val apiVersion = ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1)) - if (participant.calculatedActorType == USERS && participant.calculatedActorId == conversationUser!!.userId) { + if (participant.calculatedActorType == USERS && participant.calculatedActorId == conversationUser.userId) { if (participant.attendeePin?.isNotEmpty() == true) { val items = mutableListOf( BasicListItemWithImage( R.drawable.ic_lock_grey600_24px, - context!!.getString(R.string.nc_attendee_pin, participant.attendeePin) + context.getString(R.string.nc_attendee_pin, participant.attendeePin) ) ) MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show { @@ -1018,7 +1050,7 @@ class ConversationInfoController(args: Bundle) : val items = mutableListOf( BasicListItemWithImage( R.drawable.ic_delete_grey600_24dp, - context!!.getString(R.string.nc_remove_group_and_members) + context.getString(R.string.nc_remove_group_and_members) ) ) MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show { @@ -1038,7 +1070,7 @@ class ConversationInfoController(args: Bundle) : val items = mutableListOf( BasicListItemWithImage( R.drawable.ic_delete_grey600_24dp, - context!!.getString(R.string.nc_remove_circle_and_members) + context.getString(R.string.nc_remove_circle_and_members) ) ) MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show { @@ -1057,19 +1089,19 @@ class ConversationInfoController(args: Bundle) : val items = mutableListOf( BasicListItemWithImage( R.drawable.ic_lock_grey600_24px, - context!!.getString(R.string.nc_attendee_pin, participant.attendeePin) + context.getString(R.string.nc_attendee_pin, participant.attendeePin) ), BasicListItemWithImage( R.drawable.ic_pencil_grey600_24dp, - context!!.getString(R.string.nc_promote) + context.getString(R.string.nc_promote) ), BasicListItemWithImage( R.drawable.ic_pencil_grey600_24dp, - context!!.getString(R.string.nc_demote) + context.getString(R.string.nc_demote) ), BasicListItemWithImage( R.drawable.ic_delete_grey600_24dp, - context!!.getString(R.string.nc_remove_participant) + context.getString(R.string.nc_remove_participant) ) ) @@ -1167,8 +1199,8 @@ class ConversationInfoController(args: Bundle) : return 1 } - return left.model.displayName!!.toLowerCase(Locale.ROOT).compareTo( - right.model.displayName!!.toLowerCase(Locale.ROOT) + return left.model.displayName!!.lowercase(Locale.ROOT).compareTo( + right.model.displayName!!.lowercase(Locale.ROOT) ) } } diff --git a/app/src/main/res/layout/controller_conversation_info.xml b/app/src/main/res/layout/controller_conversation_info.xml index 269449006c1..42944cdd395 100644 --- a/app/src/main/res/layout/controller_conversation_info.xml +++ b/app/src/main/res/layout/controller_conversation_info.xml @@ -23,6 +23,7 @@ @@ -76,6 +77,7 @@ android:layout_width="@dimen/avatar_size_big" android:layout_height="@dimen/avatar_size_big" android:layout_centerHorizontal="true" + tools:background="@color/hwSecurityRed" apc:roundAsCircle="true" /> diff --git a/app/src/main/res/layout/notification_settings_item.xml b/app/src/main/res/layout/notification_settings_item.xml index 4834b49425f..8551de88436 100644 --- a/app/src/main/res/layout/notification_settings_item.xml +++ b/app/src/main/res/layout/notification_settings_item.xml @@ -27,6 +27,7 @@ android:layout_height="wrap_content"> Date: Fri, 22 Jul 2022 16:14:45 +0200 Subject: [PATCH 058/398] Theme TakePhotoActivity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../talk/activities/TakePhotoActivity.java | 13 +++++++++++++ app/src/main/res/layout/activity_take_picture.xml | 1 + 2 files changed, 14 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java b/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java index 5eea1d84cb5..08b972545f0 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java @@ -41,8 +41,10 @@ import com.google.common.util.concurrent.ListenableFuture; import com.nextcloud.talk.R; +import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.databinding.ActivityTakePictureBinding; import com.nextcloud.talk.models.TakePictureViewModel; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.utils.BitmapShrinker; import com.nextcloud.talk.utils.FileUtils; @@ -52,6 +54,8 @@ import java.util.Locale; import java.util.concurrent.ExecutionException; +import javax.inject.Inject; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.OptIn; @@ -66,9 +70,11 @@ import androidx.core.content.ContextCompat; import androidx.exifinterface.media.ExifInterface; import androidx.lifecycle.ViewModelProvider; +import autodagger.AutoInjector; import static com.nextcloud.talk.utils.Mimetype.IMAGE_JPEG; +@AutoInjector(NextcloudTalkApplication.class) public class TakePhotoActivity extends AppCompatActivity { private static final String TAG = TakePhotoActivity.class.getSimpleName(); @@ -86,15 +92,22 @@ public class TakePhotoActivity extends AppCompatActivity { private Camera camera; + @Inject + ViewThemeUtils viewThemeUtils; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + NextcloudTalkApplication.Companion.getSharedApplication().getComponentApplication().inject(this); binding = ActivityTakePictureBinding.inflate(getLayoutInflater()); viewModel = new ViewModelProvider(this).get(TakePictureViewModel.class); setContentView(binding.getRoot()); + viewThemeUtils.themeFAB(binding.takePhoto); + viewThemeUtils.colorMaterialButtonBackground(binding.send); + cameraProviderFuture = ProcessCameraProvider.getInstance(this); cameraProviderFuture.addListener(() -> { try { diff --git a/app/src/main/res/layout/activity_take_picture.xml b/app/src/main/res/layout/activity_take_picture.xml index 8f4d1de8052..5382eb3e488 100644 --- a/app/src/main/res/layout/activity_take_picture.xml +++ b/app/src/main/res/layout/activity_take_picture.xml @@ -222,6 +222,7 @@ android:theme="@style/Button.Primary" android:tint="@android:color/white" android:visibility="gone" + tools:visibility="visible" app:backgroundTint="@color/colorPrimary" app:cornerRadius="48dp" app:elevation="0dp" From 4de7d06e8ef701fb4c4896fe44d619ed614a719f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Fri, 22 Jul 2022 16:35:04 +0200 Subject: [PATCH 059/398] Theme SharedItemsActivity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../RemoteFileBrowserItemsListViewHolder.kt | 22 +-------------- .../activities/SharedItemsActivity.kt | 14 ++++++++-- .../adapters/SharedItemsAdapter.kt | 11 +++++--- .../adapters/SharedItemsGridViewHolder.kt | 6 ++-- .../adapters/SharedItemsListViewHolder.kt | 8 ++++-- .../adapters/SharedItemsViewHolder.kt | 17 +++-------- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 28 +++++++++++++++++++ 7 files changed, 60 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt index 5ef9d2852c5..241707a913f 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt @@ -20,10 +20,8 @@ package com.nextcloud.talk.remotefilebrowser.adapters -import android.graphics.drawable.Drawable import android.text.format.Formatter import android.view.View -import androidx.appcompat.content.res.AppCompatResources import autodagger.AutoInjector import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.drawee.interfaces.DraweeController @@ -38,7 +36,6 @@ import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DateUtils.getLocalDateTimeStringFromTimestamp import com.nextcloud.talk.utils.DisplayUtils -import com.nextcloud.talk.utils.DrawableUtils.getDrawableResourceIdForMimeType import com.nextcloud.talk.utils.Mimetype.FOLDER @AutoInjector(NextcloudTalkApplication::class) @@ -101,7 +98,7 @@ class RemoteFileBrowserItemsListViewHolder( binding.fileIcon .hierarchy .setPlaceholderImage( - getPlaceholderImage(item) + viewThemeUtils.getPlaceholderImage(binding.root.context, item.mimeType) ) if (item.hasPreview) { @@ -129,19 +126,6 @@ class RemoteFileBrowserItemsListViewHolder( binding.selectFileCheckbox.isChecked = selectionInterface.isPathSelected(item.path!!) } - private fun getPlaceholderImage(item: RemoteFileBrowserItem): Drawable? { - val drawableResourceId = getDrawableResourceIdForMimeType(item.mimeType) - val context = binding.fileIcon.context - val drawable = AppCompatResources.getDrawable( - context, - drawableResourceId - ) - if (drawable != null && THEMEABLE_PLACEHOLDER_IDS.contains(drawableResourceId)) { - viewThemeUtils.colorDrawable(context, drawable) - } - return drawable - } - private fun setSelectability() { if (selectable) { binding.selectFileCheckbox.visibility = View.VISIBLE @@ -164,9 +148,5 @@ class RemoteFileBrowserItemsListViewHolder( companion object { private const val DISABLED_ALPHA: Float = 0.38f private const val ENABLED_ALPHA: Float = 1.0f - private val THEMEABLE_PLACEHOLDER_IDS = listOf( - R.drawable.ic_mimetype_package_x_generic, - R.drawable.ic_mimetype_folder - ) } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 2689e082921..48b415c5947 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -41,6 +41,7 @@ import com.nextcloud.talk.databinding.ActivitySharedItemsBinding import com.nextcloud.talk.shareditems.adapters.SharedItemsAdapter import com.nextcloud.talk.shareditems.model.SharedItemType import com.nextcloud.talk.shareditems.viewmodels.SharedItemsViewModel +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_CONVERSATION_NAME import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN @@ -53,6 +54,9 @@ class SharedItemsActivity : AppCompatActivity() { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private lateinit var binding: ActivitySharedItemsBinding private lateinit var viewModel: SharedItemsViewModel @@ -72,7 +76,9 @@ class SharedItemsActivity : AppCompatActivity() { DisplayUtils.applyColorToStatusBar( this, ResourcesCompat.getColor( - resources, R.color.appbar, null + resources, + R.color.appbar, + null ) ) DisplayUtils.applyColorToNavigationBar( @@ -130,7 +136,8 @@ class SharedItemsActivity : AppCompatActivity() { showGrid, user, roomToken, - isUserConversationOwnerOrModerator + isUserConversationOwnerOrModerator, + viewThemeUtils ).apply { items = sharedMediaItems.items } @@ -142,6 +149,8 @@ class SharedItemsActivity : AppCompatActivity() { } else -> {} } + + viewThemeUtils.colorTabLayout(binding.sharedItemsTabs) } private fun clearEmptyLoading() { @@ -161,7 +170,6 @@ class SharedItemsActivity : AppCompatActivity() { } private fun initTabs(sharedItemTypes: Set) { - binding.sharedItemsTabs.removeAllTabs() if (sharedItemTypes.contains(SharedItemType.MEDIA)) { diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt index ac98b91b1fd..5c2719e9d07 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsAdapter.kt @@ -37,18 +37,19 @@ import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedLocationItem import com.nextcloud.talk.shareditems.model.SharedOtherItem import com.nextcloud.talk.shareditems.model.SharedPollItem +import com.nextcloud.talk.ui.theme.ViewThemeUtils class SharedItemsAdapter( private val showGrid: Boolean, private val user: User, private val roomToken: String, - private val isUserConversationOwnerOrModerator: Boolean + private val isUserConversationOwnerOrModerator: Boolean, + private val viewThemeUtils: ViewThemeUtils ) : RecyclerView.Adapter() { var items: List = emptyList() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SharedItemsViewHolder { - return if (showGrid) { SharedItemsGridViewHolder( SharedItemGridBinding.inflate( @@ -56,7 +57,8 @@ class SharedItemsAdapter( parent, false ), - user + user, + viewThemeUtils ) } else { SharedItemsListViewHolder( @@ -65,7 +67,8 @@ class SharedItemsAdapter( parent, false ), - user + user, + viewThemeUtils ) } } diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt index 4e672754e76..30977e6c86e 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsGridViewHolder.kt @@ -27,11 +27,13 @@ import android.widget.ProgressBar import com.facebook.drawee.view.SimpleDraweeView import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.SharedItemGridBinding +import com.nextcloud.talk.ui.theme.ViewThemeUtils class SharedItemsGridViewHolder( override val binding: SharedItemGridBinding, - user: User -) : SharedItemsViewHolder(binding, user) { + user: User, + viewThemeUtils: ViewThemeUtils +) : SharedItemsViewHolder(binding, user, viewThemeUtils) { override val image: SimpleDraweeView get() = binding.image diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt index fa611d8399c..6aa5722ca74 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsListViewHolder.kt @@ -38,11 +38,14 @@ import com.nextcloud.talk.shareditems.model.SharedItem import com.nextcloud.talk.shareditems.model.SharedLocationItem import com.nextcloud.talk.shareditems.model.SharedOtherItem import com.nextcloud.talk.shareditems.model.SharedPollItem +import com.nextcloud.talk.ui.theme.ViewThemeUtils +import com.nextcloud.talk.utils.DateUtils class SharedItemsListViewHolder( override val binding: SharedItemListBinding, - user: User -) : SharedItemsViewHolder(binding, user) { + user: User, + viewThemeUtils: ViewThemeUtils +) : SharedItemsViewHolder(binding, user, viewThemeUtils) { override val image: SimpleDraweeView get() = binding.fileImage @@ -52,7 +55,6 @@ class SharedItemsListViewHolder( get() = binding.progressBar override fun onBind(item: SharedFileItem) { - super.onBind(item) binding.fileName.text = item.name diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt index 205bbcb7ca8..184ef30910f 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/adapters/SharedItemsViewHolder.kt @@ -28,7 +28,6 @@ import android.net.Uri import android.util.Log import android.view.View import android.widget.ProgressBar -import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding import com.facebook.drawee.backends.pipeline.Fresco @@ -43,16 +42,17 @@ import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.shareditems.model.SharedDeckCardItem import com.nextcloud.talk.shareditems.model.SharedFileItem import com.nextcloud.talk.shareditems.model.SharedItem +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.shareditems.model.SharedLocationItem import com.nextcloud.talk.shareditems.model.SharedOtherItem import com.nextcloud.talk.shareditems.model.SharedPollItem import com.nextcloud.talk.utils.ApiUtils -import com.nextcloud.talk.utils.DrawableUtils import com.nextcloud.talk.utils.FileViewerUtils abstract class SharedItemsViewHolder( open val binding: ViewBinding, - internal val user: User + internal val user: User, + private val viewThemeUtils: ViewThemeUtils ) : RecyclerView.ViewHolder(binding.root) { companion object { @@ -71,7 +71,7 @@ abstract class SharedItemsViewHolder( ) open fun onBind(item: SharedFileItem) { - image.hierarchy.setPlaceholderImage(staticImage(item.mimeType, image)) + image.hierarchy.setPlaceholderImage(viewThemeUtils.getPlaceholderImage(image.context, item.mimeType)) if (item.previewAvailable) { image.controller = configurePreview(item) } @@ -107,7 +107,6 @@ abstract class SharedItemsViewHolder( } private fun configurePreview(item: SharedFileItem): DraweeController { - val imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(item.previewLink)) .setProgressiveRenderingEnabled(true) .setRotationOptions(RotationOptions.autoRotate()) @@ -136,12 +135,4 @@ abstract class SharedItemsViewHolder( open fun onBind(item: SharedOtherItem) {} open fun onBind(item: SharedDeckCardItem) {} - - private fun staticImage( - mimeType: String?, - image: SimpleDraweeView - ): Drawable { - val drawableResourceId = DrawableUtils.getDrawableResourceIdForMimeType(mimeType) - return ContextCompat.getDrawable(image.context, drawableResourceId)!! - } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 916b1b9813c..d7de8875059 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -30,6 +30,7 @@ import android.view.View import android.widget.CheckBox import android.widget.ImageView import android.widget.TextView +import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.SwitchCompat import androidx.core.content.res.ResourcesCompat import androidx.core.view.children @@ -37,8 +38,10 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.google.android.material.tabs.TabLayout import com.google.android.material.textfield.TextInputLayout import com.nextcloud.talk.R +import com.nextcloud.talk.utils.DrawableUtils import com.yarolegovich.mp.MaterialPreferenceCategory import com.yarolegovich.mp.MaterialSwitchPreference import javax.inject.Inject @@ -197,4 +200,29 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { textInputLayout.boxStrokeColor = color } } + + fun colorTabLayout(tabLayout: TabLayout) { + withElementColor(tabLayout) { color -> + tabLayout.setSelectedTabIndicatorColor(color) + } + } + + fun getPlaceholderImage(context: Context, mimetype: String?): Drawable? { + val drawableResourceId = DrawableUtils.getDrawableResourceIdForMimeType(mimetype) + val drawable = AppCompatResources.getDrawable( + context, + drawableResourceId + ) + if (drawable != null && THEMEABLE_PLACEHOLDER_IDS.contains(drawableResourceId)) { + colorDrawable(context, drawable) + } + return drawable + } + + companion object { + private val THEMEABLE_PLACEHOLDER_IDS = listOf( + R.drawable.ic_mimetype_package_x_generic, + R.drawable.ic_mimetype_folder + ) + } } From 3283e5b4f6e6cdf2f7bafc5fcbe88c9c4cce9607 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Fri, 22 Jul 2022 16:51:38 +0200 Subject: [PATCH 060/398] ConversationItem: theme unread message bubbles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../talk/adapters/items/ConversationItem.java | 19 ++++--------------- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index d6c7ff7ade8..e9c172173a5 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -168,29 +168,18 @@ public void bindViewHolder(FlexibleAdapter adapter, int lightBubbleTextColor = ContextCompat.getColor( context, R.color.conversation_unread_bubble_text); - ColorStateList lightBubbleStrokeColor = ColorStateList.valueOf( - ContextCompat.getColor(context, - R.color.colorPrimary)); if (conversation.getType() == Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL) { - holder.binding.dialogUnreadBubble.setChipBackgroundColorResource(R.color.colorPrimary); - holder.binding.dialogUnreadBubble.setTextColor(Color.WHITE); + viewThemeUtils.colorChipBackground(holder.binding.dialogUnreadBubble); } else if (conversation.getUnreadMention()) { if (CapabilitiesUtilNew.hasSpreedFeatureCapability(user, "direct-mention-flag")) { if (conversation.getUnreadMentionDirect()) { - holder.binding.dialogUnreadBubble.setChipBackgroundColorResource(R.color.colorPrimary); - holder.binding.dialogUnreadBubble.setTextColor(Color.WHITE); + viewThemeUtils.colorChipBackground(holder.binding.dialogUnreadBubble); } else { - holder.binding.dialogUnreadBubble.setChipBackgroundColorResource(R.color.bg_default); - holder.binding.dialogUnreadBubble.setTextColor(ContextCompat.getColor( - context, - R.color.colorPrimary)); - holder.binding.dialogUnreadBubble.setChipStrokeWidth(6.0f); - holder.binding.dialogUnreadBubble.setChipStrokeColor(lightBubbleStrokeColor); + viewThemeUtils.colorChipOutlined(holder.binding.dialogUnreadBubble, 6.0f); } } else { - holder.binding.dialogUnreadBubble.setChipBackgroundColorResource(R.color.colorPrimary); - holder.binding.dialogUnreadBubble.setTextColor(Color.WHITE); + viewThemeUtils.colorChipBackground(holder.binding.dialogUnreadBubble); } } else { holder.binding.dialogUnreadBubble.setChipBackgroundColor(lightBubbleFillColor); diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index d7de8875059..8ddc46d52a4 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -37,6 +37,7 @@ import androidx.core.view.children import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView +import com.google.android.material.chip.Chip import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.tabs.TabLayout import com.google.android.material.textfield.TextInputLayout @@ -219,6 +220,22 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { return drawable } + fun colorChipBackground(chip: Chip) { + withElementColor(chip) { color -> + chip.chipBackgroundColor = ColorStateList.valueOf(color) + chip.setTextColor(theme.colorText) + } + } + + fun colorChipOutlined(chip: Chip, strokeWidth: Float) { + withElementColor(chip) { color -> + chip.chipBackgroundColor = ColorStateList.valueOf(Color.TRANSPARENT) + chip.chipStrokeWidth = strokeWidth + chip.chipStrokeColor = ColorStateList.valueOf(color) + chip.setTextColor(color) + } + } + companion object { private val THEMEABLE_PLACEHOLDER_IDS = listOf( R.drawable.ic_mimetype_package_x_generic, From e5bf5ec2618a15b7fe2557ef3d7aa4396505e5db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Brey?= Date: Fri, 22 Jul 2022 17:37:03 +0200 Subject: [PATCH 061/398] WIP: theme chat controller and message viewholders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Brey --- .../MagicOutcomingTextMessageViewHolder.kt | 33 ++++++++++++------- .../talk/controllers/ChatController.kt | 6 ++++ .../bottomsheet/EntryMenuController.kt | 6 +++- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 2 +- 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt index d4508c8e15e..90d36e70b48 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt @@ -25,7 +25,6 @@ package com.nextcloud.talk.adapters.messages import android.content.Context import android.content.Intent -import android.graphics.PorterDuff import android.net.Uri import android.text.Spannable import android.text.SpannableString @@ -33,6 +32,7 @@ import android.util.TypedValue import android.view.View import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.ColorUtils import androidx.core.view.ViewCompat import autodagger.AutoInjector import coil.load @@ -44,22 +44,29 @@ import com.nextcloud.talk.databinding.ItemCustomOutcomingTextMessageBinding import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.chat.ReadStatus import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback +import com.nextcloud.talk.ui.theme.ServerTheme +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils.getMessageSelector import com.nextcloud.talk.utils.DisplayUtils.searchAndReplaceWithMentionSpan import com.nextcloud.talk.utils.TextMatchers import com.stfalcon.chatkit.messages.MessageHolders.OutcomingTextMessageViewHolder -import java.util.HashMap import javax.inject.Inject +import kotlin.math.roundToInt @AutoInjector(NextcloudTalkApplication::class) class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewHolder(itemView) { private val binding: ItemCustomOutcomingTextMessageBinding = ItemCustomOutcomingTextMessageBinding.bind(itemView) private val realView: View = itemView - @JvmField @Inject - var context: Context? = null + lateinit var context: Context + + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + + @Inject + lateinit var serverTheme: ServerTheme lateinit var reactionsInterface: ReactionsInterface @@ -69,7 +76,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage val messageParameters: HashMap>? = message.messageParameters var messageString: Spannable = SpannableString(message.text) realView.isSelected = false - binding.messageTime.setTextColor(context!!.resources.getColor(R.color.white60)) + binding.messageTime.setTextColor(ColorUtils.setAlphaComponent(serverTheme.colorText, ALPHA_60_INT)) val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams layoutParams.isWrapBefore = false var textSize = context!!.resources.getDimension(R.dimen.chat_text_size) @@ -89,6 +96,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) binding.messageTime.layoutParams = layoutParams binding.messageText.text = messageString + binding.messageText.setTextColor(serverTheme.colorText) // parent message handling if (!message.isDeleted && message.parentMessage != null) { @@ -112,8 +120,8 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage readStatusDrawableInt?.let { drawableInt -> ResourcesCompat.getDrawable(context!!.resources, drawableInt, null)?.let { - it.setColorFilter(ContextCompat.getColor(context!!, R.color.white60), PorterDuff.Mode.SRC_ATOP) binding.checkMark.setImageDrawable(it) + viewThemeUtils.colorImageViewText(binding.checkMark) } } @@ -148,20 +156,19 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName ?: context!!.getText(R.string.nc_nick_guest) binding.messageQuote.quotedMessage.text = parentChatMessage.text - binding.messageQuote.quotedMessage.setTextColor( - ContextCompat.getColor(context!!, R.color.nc_outcoming_text_default) - ) - binding.messageQuote.quotedMessageAuthor.setTextColor(ContextCompat.getColor(context!!, R.color.nc_grey)) + binding.messageQuote.quotedMessage.setTextColor(serverTheme.colorText) + binding.messageQuote.quotedMessageAuthor.setTextColor(ContextCompat.getColor(context, R.color.nc_grey)) binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.white) } private fun setBubbleOnChatMessage(message: ChatMessage) { val resources = sharedApplication!!.resources + val elementColor = viewThemeUtils.getElementColor(binding.root.context) val bgBubbleColor = if (message.isDeleted) { - ResourcesCompat.getColor(resources, R.color.bg_message_list_outcoming_bubble_deleted, null) + ColorUtils.setAlphaComponent(elementColor, HALF_ALPHA_INT) } else { - ResourcesCompat.getColor(resources, R.color.bg_message_list_outcoming_bubble, null) + elementColor } if (message.isGrouped) { val bubbleDrawable = getMessageSelector( @@ -221,5 +228,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage companion object { const val TEXT_SIZE_MULTIPLIER = 2.5 + private const val HALF_ALPHA_INT: Int = 255 / 2 + private val ALPHA_60_INT: Int = (255 * 0.6).roundToInt() } } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 170ddc44736..e925039b387 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -154,6 +154,7 @@ import com.nextcloud.talk.ui.dialog.MessageActionsDialog import com.nextcloud.talk.ui.dialog.ShowReactionsDialog import com.nextcloud.talk.ui.recyclerview.MessageSwipeActions import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.AttendeePermissionsUtil import com.nextcloud.talk.utils.ConductorRemapping @@ -235,6 +236,9 @@ class ChatController(args: Bundle) : @Inject lateinit var permissionUtil: PlatformPermissionUtil + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + val disposables = DisposableSet() var roomToken: String? = null @@ -872,6 +876,8 @@ class ChatController(args: Bundle) : .nc_description_send_message_button ) + viewThemeUtils.colorImageView(binding.messageInputView.button) + if (currentConversation != null && currentConversation?.roomId != null) { loadAvatarForStatusBar() setTitle() diff --git a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt index b592b2a5476..f652b427ed9 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt @@ -46,6 +46,7 @@ import com.nextcloud.talk.controllers.base.NewBaseController import com.nextcloud.talk.controllers.util.viewBinding import com.nextcloud.talk.databinding.ControllerEntryMenuBinding import com.nextcloud.talk.models.json.conversations.Conversation +import com.nextcloud.talk.ui.theme.ServerTheme import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.ShareUtils @@ -76,6 +77,9 @@ class EntryMenuController(args: Bundle) : @Inject lateinit var viewThemeUtils: ViewThemeUtils + @Inject + lateinit var serverTheme: ServerTheme + private val operation: ConversationOperationEnum private var conversation: Conversation? = null private var shareIntent: Intent? = null @@ -171,7 +175,7 @@ class EntryMenuController(args: Bundle) : } viewThemeUtils.colorTextInputLayout(binding.textInputLayout) - binding.textEdit.setTextColor(viewThemeUtils.theme.colorText) + binding.textEdit.setTextColor(serverTheme.colorText) viewThemeUtils.colorMaterialButtonText(binding.okButton) binding.textInputLayout.hint = labelText diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 8ddc46d52a4..0aa31d67431 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -47,7 +47,7 @@ import com.yarolegovich.mp.MaterialPreferenceCategory import com.yarolegovich.mp.MaterialSwitchPreference import javax.inject.Inject -class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { +class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { private fun isDarkMode(context: Context): Boolean = when ( context.resources.configuration.uiMode and From d1a562cf80d70199e3491a88824354df7662b1d0 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 26 Jul 2022 22:38:14 +0200 Subject: [PATCH 062/398] fix after rebase Signed-off-by: Andy Scherzinger --- app/src/main/java/com/nextcloud/talk/users/UserManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt index 485022992a2..978e04c1881 100644 --- a/app/src/main/java/com/nextcloud/talk/users/UserManager.kt +++ b/app/src/main/java/com/nextcloud/talk/users/UserManager.kt @@ -51,7 +51,7 @@ class UserManager internal constructor(private val userRepository: UsersReposito return userRepository.getActiveUserObservable() } - fun deleteUser(internalId: Long) { + fun deleteUser(internalId: Long): Int { return userRepository.deleteUser(userRepository.getUserWithId(internalId).blockingGet()) } From 9be4358ae0c375d7598bbbceec1500996cc4b006 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 26 Jul 2022 23:45:04 +0200 Subject: [PATCH 063/398] theme contacts selector icon Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/adapters/items/ContactItem.java | 7 ++++++- .../com/nextcloud/talk/controllers/ContactsController.kt | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ContactItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ContactItem.java index a358c931c5a..5090bc7616d 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ContactItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ContactItem.java @@ -35,6 +35,7 @@ import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.databinding.RvItemContactBinding; import com.nextcloud.talk.models.json.participants.Participant; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.DisplayUtils; @@ -59,14 +60,17 @@ public class ContactItem extends AbstractFlexibleItem Date: Wed, 27 Jul 2022 00:09:43 +0200 Subject: [PATCH 064/398] first steps to theme poll creation Signed-off-by: Andy Scherzinger --- .../talk/polls/ui/PollCreateDialogFragment.kt | 20 +++++++++++++++++++ .../main/res/layout/dialog_poll_create.xml | 3 +++ 2 files changed, 23 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt index e94f1e7501b..33e12c1aa4c 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt @@ -43,6 +43,7 @@ import com.nextcloud.talk.polls.adapters.PollCreateOptionItem import com.nextcloud.talk.polls.adapters.PollCreateOptionsAdapter import com.nextcloud.talk.polls.adapters.PollCreateOptionsItemListener import com.nextcloud.talk.polls.viewmodels.PollCreateViewModel +import com.nextcloud.talk.ui.theme.ViewThemeUtils import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -51,6 +52,9 @@ class PollCreateDialogFragment : DialogFragment(), PollCreateOptionsItemListener @Inject lateinit var viewModelFactory: ViewModelProvider.Factory + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private lateinit var binding: DialogPollCreateBinding private lateinit var viewModel: PollCreateViewModel @@ -88,10 +92,26 @@ class PollCreateDialogFragment : DialogFragment(), PollCreateOptionsItemListener adapter = PollCreateOptionsAdapter(this) binding.pollCreateOptionsList.adapter = adapter + themeDialog() + setupListeners() setupStateObserver() } + private fun themeDialog() { + viewThemeUtils.colorTextViewText(binding.pollQuestion) + viewThemeUtils.colorTextViewText(binding.pollOptions) + viewThemeUtils.colorTextViewText(binding.pollSettings) + + viewThemeUtils.colorMaterialButtonText(binding.pollAddOptionsItem) + // TODO button also needs a disabled state handling for colors + viewThemeUtils.colorMaterialButtonText(binding.pollDismiss) + viewThemeUtils.colorMaterialButtonBackground(binding.pollCreateButton) + + viewThemeUtils.themeCheckbox(binding.pollPrivatePollCheckbox) + viewThemeUtils.themeCheckbox(binding.pollMultipleAnswersCheckbox) + } + private fun setupListeners() { binding.pollAddOptionsItem.setOnClickListener { viewModel.addOption() diff --git a/app/src/main/res/layout/dialog_poll_create.xml b/app/src/main/res/layout/dialog_poll_create.xml index da0fe5f7fca..b03a5c14641 100644 --- a/app/src/main/res/layout/dialog_poll_create.xml +++ b/app/src/main/res/layout/dialog_poll_create.xml @@ -35,6 +35,7 @@ android:paddingTop="@dimen/dialog_padding_top_bottom"> Date: Wed, 27 Jul 2022 00:10:17 +0200 Subject: [PATCH 065/398] add proper checkbox- state coloring Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 0aa31d67431..f3b9050e3d7 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -183,8 +183,13 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { fun themeCheckbox(checkbox: CheckBox) { withElementColor(checkbox) { color -> - checkbox.setTextColor(color) - checkbox.buttonTintList = ColorStateList.valueOf(color) + checkbox.buttonTintList = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_checked), + intArrayOf(android.R.attr.state_checked), + ), + intArrayOf(Color.GRAY, color) + ) } } From 907386e9b7d1f949cfbbefa3c33d5e32b9deee36 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 27 Jul 2022 00:18:54 +0200 Subject: [PATCH 066/398] add proper button-state coloring for button text/icon Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/ui/theme/ViewThemeUtils.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index f3b9050e3d7..e1097781930 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -32,6 +32,7 @@ import android.widget.ImageView import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.SwitchCompat +import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.core.view.children import androidx.swiperefreshlayout.widget.SwipeRefreshLayout @@ -113,8 +114,17 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { } fun colorMaterialButtonText(button: MaterialButton) { - colorTextViewElement(button) - button.iconTint = ColorStateList.valueOf(getElementColor(button.context)) + withElementColor(button) { color -> + val disabledColor = ContextCompat.getColor(button.context, R.color.disabled_text) + val colorStateList = ColorStateList( + arrayOf( + intArrayOf(android.R.attr.state_enabled), + intArrayOf(-android.R.attr.state_enabled)), + intArrayOf(color, disabledColor) + ) + button.setTextColor(colorStateList) + button.iconTint = colorStateList + } } fun colorMaterialButtonBackground(button: MaterialButton) { From 28aae006418e53c86bbc68cb470f820bab68bf6d Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 27 Jul 2022 00:31:25 +0200 Subject: [PATCH 067/398] extend text input layout theming Signed-off-by: Andy Scherzinger --- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index e1097781930..a2670f4af86 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -119,7 +119,8 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { val colorStateList = ColorStateList( arrayOf( intArrayOf(android.R.attr.state_enabled), - intArrayOf(-android.R.attr.state_enabled)), + intArrayOf(-android.R.attr.state_enabled) + ), intArrayOf(color, disabledColor) ) button.setTextColor(colorStateList) @@ -212,8 +213,55 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { fun colorTextInputLayout(textInputLayout: TextInputLayout) { withElementColor(textInputLayout) { color -> - textInputLayout.hintTextColor = ColorStateList.valueOf(color) + // TODO calculate error color based on primary color, dark/light aware + val errorColor = Color.GRAY textInputLayout.boxStrokeColor = color + textInputLayout.setErrorIconTintList( + ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_focused), + intArrayOf(android.R.attr.state_focused) + ), + intArrayOf( + errorColor, + errorColor + ) + ) + ) + textInputLayout.setErrorTextColor( + ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_focused), + intArrayOf(android.R.attr.state_focused) + ), + intArrayOf( + errorColor, + errorColor + ) + ) + ) + textInputLayout.boxStrokeErrorColor = + ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_focused), + intArrayOf(android.R.attr.state_focused) + ), + intArrayOf( + errorColor, + errorColor + ) + ) + textInputLayout.defaultHintTextColor = + ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_focused), + intArrayOf(android.R.attr.state_focused) + ), + intArrayOf( + Color.GRAY, + color + ) + ) } } From 0463a39bfb71dbfa1b93c6de5a7698e1afc5b7e5 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 27 Jul 2022 00:40:46 +0200 Subject: [PATCH 068/398] Add EditText coloring Signed-off-by: Andy Scherzinger --- .../adapters/PollCreateOptionViewHolder.kt | 5 ++++- .../adapters/PollCreateOptionsAdapter.kt | 6 ++++-- .../talk/polls/ui/PollCreateDialogFragment.kt | 4 +++- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 20 +++++++++++++++++++ 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt index 91afdd16c71..c84060b5e7a 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionViewHolder.kt @@ -26,10 +26,12 @@ import android.text.TextWatcher import androidx.recyclerview.widget.RecyclerView import com.nextcloud.talk.R import com.nextcloud.talk.databinding.PollCreateOptionsItemBinding +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.EmojiTextInputEditText class PollCreateOptionViewHolder( - private val binding: PollCreateOptionsItemBinding + private val binding: PollCreateOptionsItemBinding, + private val viewThemeUtils: ViewThemeUtils ) : RecyclerView.ViewHolder(binding.root) { lateinit var optionText: EmojiTextInputEditText @@ -48,6 +50,7 @@ class PollCreateOptionViewHolder( } binding.pollOptionTextEdit.setText(pollCreateOptionItem.pollOption) + viewThemeUtils.colorEditText(binding.pollOptionText) if (focus) { itemsListener.requestFocus(binding.pollOptionTextEdit) diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionsAdapter.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionsAdapter.kt index e827a56a602..724d87f40a4 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollCreateOptionsAdapter.kt @@ -24,9 +24,11 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.nextcloud.talk.databinding.PollCreateOptionsItemBinding +import com.nextcloud.talk.ui.theme.ViewThemeUtils class PollCreateOptionsAdapter( - private val clickListener: PollCreateOptionsItemListener + private val clickListener: PollCreateOptionsItemListener, + private val viewThemeUtils: ViewThemeUtils ) : RecyclerView.Adapter() { internal var list: ArrayList = ArrayList() @@ -34,7 +36,7 @@ class PollCreateOptionsAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PollCreateOptionViewHolder { val itemBinding = PollCreateOptionsItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return PollCreateOptionViewHolder(itemBinding) + return PollCreateOptionViewHolder(itemBinding, viewThemeUtils) } override fun onBindViewHolder(holder: PollCreateOptionViewHolder, position: Int) { diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt index 33e12c1aa4c..080c9fadb2c 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt @@ -89,7 +89,7 @@ class PollCreateDialogFragment : DialogFragment(), PollCreateOptionsItemListener binding.pollCreateOptionsList.layoutManager = LinearLayoutManager(context) - adapter = PollCreateOptionsAdapter(this) + adapter = PollCreateOptionsAdapter(this, viewThemeUtils) binding.pollCreateOptionsList.adapter = adapter themeDialog() @@ -103,6 +103,8 @@ class PollCreateDialogFragment : DialogFragment(), PollCreateOptionsItemListener viewThemeUtils.colorTextViewText(binding.pollOptions) viewThemeUtils.colorTextViewText(binding.pollSettings) + viewThemeUtils.colorEditText(binding.pollCreateQuestion) + viewThemeUtils.colorMaterialButtonText(binding.pollAddOptionsItem) // TODO button also needs a disabled state handling for colors viewThemeUtils.colorMaterialButtonText(binding.pollDismiss) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index a2670f4af86..57a21b52dde 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -25,9 +25,11 @@ import android.content.Context import android.content.res.ColorStateList import android.content.res.Configuration import android.graphics.Color +import android.graphics.PorterDuff import android.graphics.drawable.Drawable import android.view.View import android.widget.CheckBox +import android.widget.EditText import android.widget.ImageView import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources @@ -211,6 +213,24 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { } } + fun colorEditText(editText: EditText) { + withElementColor(editText) { color -> + editText.setTextColor(color) + // TODO check API-level compatibility + //editText.background.setColorFilter(color, PorterDuff.Mode.SRC_ATOP) + editText.backgroundTintList = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_focused), + intArrayOf(android.R.attr.state_focused) + ), + intArrayOf( + Color.GRAY, + color + ) + ) + } + } + fun colorTextInputLayout(textInputLayout: TextInputLayout) { withElementColor(textInputLayout) { color -> // TODO calculate error color based on primary color, dark/light aware From e54abe63f18c0c9f056fc30b7b445a0845665bae Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 27 Jul 2022 20:15:26 +0200 Subject: [PATCH 069/398] theme polls and add further theming functions to the utils Signed-off-by: Andy Scherzinger --- .../adapters/PollResultHeaderViewHolder.kt | 6 ++- .../talk/polls/adapters/PollResultsAdapter.kt | 4 +- .../talk/polls/ui/PollResultsFragment.kt | 15 ++++++- .../talk/polls/ui/PollVoteFragment.kt | 14 ++++++ .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 45 +++++++++++++++++-- 5 files changed, 77 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt index b963f515de2..f08cb68cf3e 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultHeaderViewHolder.kt @@ -23,15 +23,19 @@ package com.nextcloud.talk.polls.adapters import android.annotation.SuppressLint import android.graphics.Typeface import com.nextcloud.talk.databinding.PollResultHeaderItemBinding +import com.nextcloud.talk.ui.theme.ViewThemeUtils class PollResultHeaderViewHolder( - override val binding: PollResultHeaderItemBinding + override val binding: PollResultHeaderItemBinding, + private val viewThemeUtils: ViewThemeUtils ) : PollResultViewHolder(binding) { @SuppressLint("SetTextI18n") override fun bind(pollResultItem: PollResultItem, clickListener: PollResultItemClickListener) { val item = pollResultItem as PollResultHeaderItem + viewThemeUtils.colorProgressBar(binding.pollOptionBar) + binding.root.setOnClickListener { clickListener.onClick() } binding.pollOptionText.text = item.name diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt index 98a576cba73..df600fd37f1 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt @@ -27,10 +27,12 @@ import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.PollResultHeaderItemBinding import com.nextcloud.talk.databinding.PollResultVoterItemBinding import com.nextcloud.talk.databinding.PollResultVotersOverviewItemBinding +import com.nextcloud.talk.ui.theme.ViewThemeUtils class PollResultsAdapter( private val user: User, private val clickListener: PollResultItemClickListener, + private val viewThemeUtils: ViewThemeUtils ) : RecyclerView.Adapter() { internal var list: MutableList = ArrayList() @@ -43,7 +45,7 @@ class PollResultsAdapter( LayoutInflater.from(parent.context), parent, false ) - viewHolder = PollResultHeaderViewHolder(itemBinding) + viewHolder = PollResultHeaderViewHolder(itemBinding, viewThemeUtils) } PollResultVoterItem.VIEW_TYPE -> { val itemBinding = PollResultVoterItemBinding.inflate( diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt index b1cbe4392c3..0a9c3db1234 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt @@ -38,6 +38,7 @@ import com.nextcloud.talk.polls.adapters.PollResultItemClickListener import com.nextcloud.talk.polls.adapters.PollResultsAdapter import com.nextcloud.talk.polls.viewmodels.PollMainViewModel import com.nextcloud.talk.polls.viewmodels.PollResultsViewModel +import com.nextcloud.talk.ui.theme.ViewThemeUtils import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -46,6 +47,9 @@ class PollResultsFragment : Fragment(), PollResultItemClickListener { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private lateinit var parentViewModel: PollMainViewModel lateinit var viewModel: PollResultsViewModel @@ -82,17 +86,24 @@ class PollResultsFragment : Fragment(), PollResultItemClickListener { } viewModel.items.observe(viewLifecycleOwner) { - val adapter = PollResultsAdapter(parentViewModel.user, this).apply { + val adapter = PollResultsAdapter(parentViewModel.user, this, viewThemeUtils).apply { if (it != null) { list = it } } binding.pollResultsList.adapter = adapter } + + themeDialog() + } + + private fun themeDialog() { + viewThemeUtils.colorMaterialButtonBackground(binding.editVoteButton) + viewThemeUtils.colorMaterialButtonText(binding.pollResultsEndPollButton) } private fun initAdapter() { - adapter = PollResultsAdapter(parentViewModel.user, this) + adapter = PollResultsAdapter(parentViewModel.user, this, viewThemeUtils) binding.pollResultsList.adapter = adapter binding.pollResultsList.layoutManager = LinearLayoutManager(context) } diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt index 67b87844255..39b637637eb 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt @@ -43,6 +43,7 @@ import com.nextcloud.talk.databinding.DialogPollVoteBinding import com.nextcloud.talk.polls.model.Poll import com.nextcloud.talk.polls.viewmodels.PollMainViewModel import com.nextcloud.talk.polls.viewmodels.PollVoteViewModel +import com.nextcloud.talk.ui.theme.ViewThemeUtils import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) @@ -51,6 +52,9 @@ class PollVoteFragment : Fragment() { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private lateinit var parentViewModel: PollMainViewModel lateinit var viewModel: PollVoteViewModel @@ -117,6 +121,14 @@ class PollVoteFragment : Fragment() { binding.pollVoteEditDismiss.setOnClickListener { parentViewModel.dismissEditVotes() } + + themeDialog() + } + + private fun themeDialog() { + viewThemeUtils.colorMaterialButtonBackground(binding.pollVoteSubmitButton) + viewThemeUtils.colorMaterialButtonText(binding.pollVoteEndPollButton) + viewThemeUtils.colorMaterialButtonText(binding.pollVoteEndPollButton) } private fun updateDismissEditButton(showDismissEditButton: Boolean) { @@ -136,6 +148,7 @@ class PollVoteFragment : Fragment() { RadioButton(context).apply { text = option } }?.forEachIndexed { index, radioButton -> radioButton.id = index + viewThemeUtils.themeRadioButton(radioButton) makeOptionBoldIfSelfVoted(radioButton, poll, index) binding.pollVoteRadioGroup.addView(radioButton) @@ -156,6 +169,7 @@ class PollVoteFragment : Fragment() { setLayoutParams(layoutParams) } }?.forEachIndexed { index, checkBox -> + viewThemeUtils.themeCheckbox(checkBox) checkBox.id = index makeOptionBoldIfSelfVoted(checkBox, poll, index) binding.voteOptionsCheckboxesWrapper.addView(checkBox) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 57a21b52dde..9778e12f20f 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -25,23 +25,25 @@ import android.content.Context import android.content.res.ColorStateList import android.content.res.Configuration import android.graphics.Color -import android.graphics.PorterDuff import android.graphics.drawable.Drawable import android.view.View import android.widget.CheckBox import android.widget.EditText import android.widget.ImageView +import android.widget.RadioButton import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.SwitchCompat import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.ColorUtils import androidx.core.view.children import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.chip.Chip import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.google.android.material.progressindicator.LinearProgressIndicator import com.google.android.material.tabs.TabLayout import com.google.android.material.textfield.TextInputLayout import com.nextcloud.talk.R @@ -50,6 +52,7 @@ import com.yarolegovich.mp.MaterialPreferenceCategory import com.yarolegovich.mp.MaterialSwitchPreference import javax.inject.Inject +@Suppress("Detekt.TooManyFunctions") class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { private fun isDarkMode(context: Context): Boolean = when ( @@ -176,7 +179,7 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { context.theme ) - val trackColor = Color.argb(77, Color.red(color), Color.green(color), Color.blue(color)) + val trackColor = Color.argb(TRACK_ALPHA, Color.red(color), Color.green(color), Color.blue(color)) switchCompat.thumbTintList = ColorStateList( arrayOf(intArrayOf(android.R.attr.state_checked), intArrayOf()), intArrayOf(color, thumbUncheckedColor) @@ -206,6 +209,18 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { } } + fun themeRadioButton(radioButton: RadioButton) { + withElementColor(radioButton) { color -> + radioButton.buttonTintList = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_checked), + intArrayOf(android.R.attr.state_checked), + ), + intArrayOf(Color.GRAY, color) + ) + } + } + fun themeSwipeRefreshLayout(swipeRefreshLayout: SwipeRefreshLayout) { withElementColor(swipeRefreshLayout) { color -> swipeRefreshLayout.setColorSchemeColors(color) @@ -213,11 +228,17 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { } } + fun colorProgressBar(progressIndicator: LinearProgressIndicator) { + withElementColor(progressIndicator) { color -> + progressIndicator.setIndicatorColor(progressColor(progressIndicator.context, color)) + } + } + fun colorEditText(editText: EditText) { withElementColor(editText) { color -> editText.setTextColor(color) // TODO check API-level compatibility - //editText.background.setColorFilter(color, PorterDuff.Mode.SRC_ATOP) + // editText.background.setColorFilter(color, PorterDuff.Mode.SRC_ATOP) editText.backgroundTintList = ColorStateList( arrayOf( intArrayOf(-android.R.attr.state_focused), @@ -319,10 +340,28 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { } } + private fun progressColor(context: Context, color: Int): Int { + val hsl = FloatArray(HSL_SIZE) + ColorUtils.RGBToHSL(Color.red(color), Color.green(color), Color.blue(color), hsl) + + if (isDarkMode(context)) { + hsl[INDEX_LUMINATION] = LUMINATION_DARK_THEME + } else { + hsl[INDEX_LUMINATION] = LUMINATION_LIGHT_THEME + } + + return ColorUtils.HSLToColor(hsl) + } + companion object { private val THEMEABLE_PLACEHOLDER_IDS = listOf( R.drawable.ic_mimetype_package_x_generic, R.drawable.ic_mimetype_folder ) + private const val TRACK_ALPHA: Int = 77 + private const val HSL_SIZE: Int = 3 + private const val INDEX_LUMINATION: Int = 2 + private const val LUMINATION_LIGHT_THEME: Float = 0.76f + private const val LUMINATION_DARK_THEME: Float = 0.28f } } From 9aabb8804ed6c588be71734db2894474c1c842ff Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 27 Jul 2022 20:25:46 +0200 Subject: [PATCH 070/398] extend button theming for primary actions to respect states and also cover icons Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/ui/theme/ViewThemeUtils.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 9778e12f20f..5769c2ca3e1 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -136,7 +136,18 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { fun colorMaterialButtonBackground(button: MaterialButton) { withElementColor(button) { color -> button.setBackgroundColor(color) - button.setTextColor(theme.colorText) + + val disabledColor = ContextCompat.getColor(button.context, R.color.disabled_text) + val colorStateList = ColorStateList( + arrayOf( + intArrayOf(android.R.attr.state_enabled), + intArrayOf(-android.R.attr.state_enabled) + ), + intArrayOf(theme.colorText, disabledColor) + ) + + button.setTextColor(colorStateList) + button.iconTint = colorStateList } } From a907b1ba519da8ffc4dbf9ce8f0cd2fff0ff725a Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 27 Jul 2022 22:50:26 +0200 Subject: [PATCH 071/398] fix theming for poll button Signed-off-by: Andy Scherzinger --- .../main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt index 39b637637eb..5972334dbc6 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt @@ -128,7 +128,7 @@ class PollVoteFragment : Fragment() { private fun themeDialog() { viewThemeUtils.colorMaterialButtonBackground(binding.pollVoteSubmitButton) viewThemeUtils.colorMaterialButtonText(binding.pollVoteEndPollButton) - viewThemeUtils.colorMaterialButtonText(binding.pollVoteEndPollButton) + viewThemeUtils.colorMaterialButtonText(binding.pollVoteEditDismiss) } private fun updateDismissEditButton(showDismissEditButton: Boolean) { From 0f94b8c473f08c467ee020c335a24a3e2d28c7e9 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 27 Jul 2022 22:50:54 +0200 Subject: [PATCH 072/398] theme outgoing poll bubble Signed-off-by: Andy Scherzinger --- .../OutcomingPollMessageViewHolder.kt | 35 +++++++++++++++---- .../item_custom_outcoming_poll_message.xml | 8 ++--- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt index 2d1726d57c2..497e2841a05 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt @@ -23,9 +23,12 @@ package com.nextcloud.talk.adapters.messages import android.annotation.SuppressLint import android.content.Context +import android.content.res.ColorStateList import android.graphics.PorterDuff import android.view.View import androidx.appcompat.content.res.AppCompatResources +import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.ColorUtils import androidx.core.view.ViewCompat import autodagger.AutoInjector import coil.load @@ -38,11 +41,14 @@ import com.nextcloud.talk.databinding.ItemCustomOutcomingPollMessageBinding import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.chat.ReadStatus import com.nextcloud.talk.polls.ui.PollMainDialogFragment +import com.nextcloud.talk.ui.theme.ServerTheme +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.preferences.AppPreferences import com.stfalcon.chatkit.messages.MessageHolders import javax.inject.Inject +import kotlin.math.roundToInt @AutoInjector(NextcloudTalkApplication::class) class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : MessageHolders @@ -54,6 +60,12 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag @Inject lateinit var context: Context + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + + @Inject + lateinit var serverTheme: ServerTheme + @Inject lateinit var appPreferences: AppPreferences @@ -73,7 +85,12 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag colorizeMessageBubble(message) itemView.isSelected = false - binding.messageTime.setTextColor(context.resources.getColor(R.color.white60)) + binding.messageTime.setTextColor( + ColorUtils.setAlphaComponent( + serverTheme.colorText, + ALPHA_60_INT + ) + ) // parent message handling setParentMessageDataOnMessageItem(message) @@ -92,8 +109,8 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag readStatusDrawableInt?.let { drawableInt -> AppCompatResources.getDrawable(context, drawableInt)?.let { - it.setColorFilter(context.resources!!.getColor(R.color.white60), PorterDuff.Mode.SRC_ATOP) binding.checkMark.setImageDrawable(it) + viewThemeUtils.colorImageViewText(binding.checkMark) } } @@ -126,6 +143,9 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag } if (pollId != null && pollName != null) { + binding.messagePollTitle.setTextColor(serverTheme.colorText) + binding.messagePollSubtitle.setTextColor(serverTheme.colorText) + binding.messagePollIcon.imageTintList = ColorStateList.valueOf(serverTheme.colorText) binding.messagePollTitle.text = pollName val roomToken = (payload as? MessagePayload)!!.roomToken @@ -180,15 +200,16 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag private fun colorizeMessageBubble(message: ChatMessage) { val resources = sharedApplication!!.resources + val elementColor = viewThemeUtils.getElementColor(binding.root.context) val bgBubbleColor = if (message.isDeleted) { - resources.getColor(R.color.bg_message_list_outcoming_bubble_deleted) + ColorUtils.setAlphaComponent(elementColor, HALF_ALPHA_INT) } else { - resources.getColor(R.color.bg_message_list_outcoming_bubble) + elementColor } if (message.isGrouped) { val bubbleDrawable = DisplayUtils.getMessageSelector( bgBubbleColor, - resources.getColor(R.color.transparent), + ResourcesCompat.getColor(resources, R.color.transparent, null), bgBubbleColor, R.drawable.shape_grouped_outcoming_message ) @@ -196,7 +217,7 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag } else { val bubbleDrawable = DisplayUtils.getMessageSelector( bgBubbleColor, - resources.getColor(R.color.transparent), + ResourcesCompat.getColor(resources, R.color.transparent, null), bgBubbleColor, R.drawable.shape_outcoming_message ) @@ -210,5 +231,7 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag companion object { private val TAG = NextcloudTalkApplication::class.java.simpleName + private val ALPHA_60_INT: Int = (255 * 0.6).roundToInt() + private const val HALF_ALPHA_INT: Int = 255 / 2 } } diff --git a/app/src/main/res/layout/item_custom_outcoming_poll_message.xml b/app/src/main/res/layout/item_custom_outcoming_poll_message.xml index 1f3cfbdfb4d..d19fc32820c 100644 --- a/app/src/main/res/layout/item_custom_outcoming_poll_message.xml +++ b/app/src/main/res/layout/item_custom_outcoming_poll_message.xml @@ -63,8 +63,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textAlignment="viewStart" - android:textStyle="bold" android:textColor="@color/nc_outcoming_text_default" + android:textStyle="bold" tools:text="This is the poll title?" /> @@ -83,8 +83,8 @@ android:layout_height="wrap_content" android:layout_below="@id/messageText" android:layout_marginStart="8dp" - app:layout_alignSelf="center" android:textColor="@color/nc_outcoming_text_default" + app:layout_alignSelf="center" tools:text="10:35" /> + app:layout_alignSelf="center" /> Date: Wed, 27 Jul 2022 23:40:28 +0200 Subject: [PATCH 073/398] extend outgoing messages' theming Signed-off-by: Andy Scherzinger --- .../MagicOutcomingTextMessageViewHolder.kt | 12 ++++-- .../OutcomingLocationMessageViewHolder.kt | 38 +++++++++++++------ .../OutcomingPollMessageViewHolder.kt | 12 +++--- .../OutcomingVoiceMessageViewHolder.kt | 32 ++++++++++++---- 4 files changed, 67 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt index 90d36e70b48..757e0563be5 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt @@ -30,7 +30,6 @@ import android.text.Spannable import android.text.SpannableString import android.util.TypedValue import android.view.View -import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.ColorUtils import androidx.core.view.ViewCompat @@ -157,9 +156,15 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage ?: context!!.getText(R.string.nc_nick_guest) binding.messageQuote.quotedMessage.text = parentChatMessage.text binding.messageQuote.quotedMessage.setTextColor(serverTheme.colorText) - binding.messageQuote.quotedMessageAuthor.setTextColor(ContextCompat.getColor(context, R.color.nc_grey)) - binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.white) + binding.messageQuote.quotedMessageAuthor.setTextColor( + ColorUtils.setAlphaComponent( + serverTheme.colorText, + ALPHA_80_INT + ) + ) + + binding.messageQuote.quoteColoredView.setBackgroundColor(serverTheme.colorText) } private fun setBubbleOnChatMessage(message: ChatMessage) { @@ -230,5 +235,6 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage const val TEXT_SIZE_MULTIPLIER = 2.5 private const val HALF_ALPHA_INT: Int = 255 / 2 private val ALPHA_60_INT: Int = (255 * 0.6).roundToInt() + private val ALPHA_80_INT: Int = (255 * 0.8).roundToInt() } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt index 91fb93583d5..04eca1e4d32 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt @@ -25,7 +25,6 @@ package com.nextcloud.talk.adapters.messages import android.annotation.SuppressLint import android.content.Context import android.content.Intent -import android.graphics.PorterDuff import android.net.Uri import android.util.Log import android.util.TypedValue @@ -35,6 +34,8 @@ import android.webkit.WebView import android.webkit.WebViewClient import android.widget.Toast import androidx.appcompat.content.res.AppCompatResources +import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.ColorUtils import androidx.core.view.ViewCompat import autodagger.AutoInjector import coil.load @@ -45,12 +46,15 @@ import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedA import com.nextcloud.talk.databinding.ItemCustomOutcomingLocationMessageBinding import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.chat.ReadStatus +import com.nextcloud.talk.ui.theme.ServerTheme +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.UriUtils import com.stfalcon.chatkit.messages.MessageHolders import java.net.URLEncoder import javax.inject.Inject +import kotlin.math.roundToInt @AutoInjector(NextcloudTalkApplication::class) class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders @@ -68,6 +72,12 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders @Inject var context: Context? = null + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + + @Inject + lateinit var serverTheme: ServerTheme + lateinit var reactionsInterface: ReactionsInterface @SuppressLint("SetTextI18n") @@ -76,7 +86,6 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders sharedApplication!!.componentApplication.inject(this) realView.isSelected = false - binding.messageTime.setTextColor(context!!.resources.getColor(R.color.white60)) val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams layoutParams.isWrapBefore = false @@ -85,7 +94,10 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders colorizeMessageBubble(message) binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) binding.messageTime.layoutParams = layoutParams + binding.messageTime.setTextColor(ColorUtils.setAlphaComponent(serverTheme.colorText, ALPHA_60_INT)) + binding.messageText.text = message.text + binding.messageText.setTextColor(serverTheme.colorText) // parent message handling setParentMessageDataOnMessageItem(message) @@ -104,8 +116,8 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders readStatusDrawableInt?.let { drawableInt -> AppCompatResources.getDrawable(context!!, drawableInt)?.let { - it.setColorFilter(context?.resources!!.getColor(R.color.white60), PorterDuff.Mode.SRC_ATOP) binding.checkMark.setImageDrawable(it) + viewThemeUtils.colorImageViewText(binding.checkMark) } } @@ -200,12 +212,12 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName ?: context!!.getText(R.string.nc_nick_guest) binding.messageQuote.quotedMessage.text = parentChatMessage.text - binding.messageQuote.quotedMessage.setTextColor( - context!!.resources.getColor(R.color.nc_outcoming_text_default) + binding.messageQuote.quotedMessage.setTextColor(serverTheme.colorText) + binding.messageQuote.quotedMessageAuthor.setTextColor( + ColorUtils.setAlphaComponent(serverTheme.colorText, ALPHA_80_INT) ) - binding.messageQuote.quotedMessageAuthor.setTextColor(context!!.resources.getColor(R.color.nc_grey)) - binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.white) + binding.messageQuote.quoteColoredView.setBackgroundColor(serverTheme.colorText) binding.messageQuote.quotedChatMessageView.visibility = View.VISIBLE } else { @@ -215,15 +227,16 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders private fun colorizeMessageBubble(message: ChatMessage) { val resources = sharedApplication!!.resources + val elementColor = viewThemeUtils.getElementColor(binding.root.context) val bgBubbleColor = if (message.isDeleted) { - resources.getColor(R.color.bg_message_list_outcoming_bubble_deleted) + ColorUtils.setAlphaComponent(elementColor, HALF_ALPHA_INT) } else { - resources.getColor(R.color.bg_message_list_outcoming_bubble) + elementColor } if (message.isGrouped) { val bubbleDrawable = DisplayUtils.getMessageSelector( bgBubbleColor, - resources.getColor(R.color.transparent), + ResourcesCompat.getColor(resources, R.color.transparent, null), bgBubbleColor, R.drawable.shape_grouped_outcoming_message ) @@ -231,7 +244,7 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders } else { val bubbleDrawable = DisplayUtils.getMessageSelector( bgBubbleColor, - resources.getColor(R.color.transparent), + ResourcesCompat.getColor(resources, R.color.transparent, null), bgBubbleColor, R.drawable.shape_outcoming_message ) @@ -261,5 +274,8 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders companion object { private const val TAG = "LocOutMessageView" + private const val HALF_ALPHA_INT: Int = 255 / 2 + private val ALPHA_60_INT: Int = (255 * 0.6).roundToInt() + private val ALPHA_80_INT: Int = (255 * 0.8).roundToInt() } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt index 497e2841a05..302929188d9 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt @@ -24,7 +24,6 @@ package com.nextcloud.talk.adapters.messages import android.annotation.SuppressLint import android.content.Context import android.content.res.ColorStateList -import android.graphics.PorterDuff import android.view.View import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.res.ResourcesCompat @@ -185,12 +184,14 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName ?: context.getText(R.string.nc_nick_guest) binding.messageQuote.quotedMessage.text = parentChatMessage.text - binding.messageQuote.quotedMessage.setTextColor( - context.resources.getColor(R.color.nc_outcoming_text_default) + binding.messageQuote.quotedMessage.setTextColor(serverTheme.colorText) + binding.messageQuote.quotedMessageAuthor.setTextColor( + ColorUtils.setAlphaComponent(serverTheme.colorText, + ALPHA_80_INT + ) ) - binding.messageQuote.quotedMessageAuthor.setTextColor(context.resources.getColor(R.color.nc_grey)) - binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.white) + binding.messageQuote.quoteColoredView.setBackgroundColor(serverTheme.colorText) binding.messageQuote.quotedChatMessageView.visibility = View.VISIBLE } else { @@ -232,6 +233,7 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag companion object { private val TAG = NextcloudTalkApplication::class.java.simpleName private val ALPHA_60_INT: Int = (255 * 0.6).roundToInt() + private val ALPHA_80_INT: Int = (255 * 0.8).roundToInt() private const val HALF_ALPHA_INT: Int = 255 / 2 } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt index b964d3b1fe1..bbbba64d560 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt @@ -31,6 +31,8 @@ import android.view.View import android.widget.SeekBar import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.ContextCompat +import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.ColorUtils import androidx.core.view.ViewCompat import androidx.work.WorkInfo import androidx.work.WorkManager @@ -42,12 +44,15 @@ import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedA import com.nextcloud.talk.databinding.ItemCustomOutcomingVoiceMessageBinding import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.chat.ReadStatus +import com.nextcloud.talk.ui.theme.ServerTheme +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.preferences.AppPreferences import com.stfalcon.chatkit.messages.MessageHolders import java.util.concurrent.ExecutionException import javax.inject.Inject +import kotlin.math.roundToInt @AutoInjector(NextcloudTalkApplication::class) class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders @@ -60,6 +65,12 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders @Inject var context: Context? = null + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + + @Inject + lateinit var serverTheme: ServerTheme + @JvmField @Inject var appPreferences: AppPreferences? = null @@ -250,12 +261,14 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName ?: context!!.getText(R.string.nc_nick_guest) binding.messageQuote.quotedMessage.text = parentChatMessage.text - binding.messageQuote.quotedMessage.setTextColor( - context!!.resources.getColor(R.color.nc_outcoming_text_default) + binding.messageQuote.quotedMessage.setTextColor(serverTheme.colorText) + binding.messageQuote.quotedMessageAuthor.setTextColor( + ColorUtils.setAlphaComponent(serverTheme.colorText, + ALPHA_80_INT + ) ) - binding.messageQuote.quotedMessageAuthor.setTextColor(context!!.resources.getColor(R.color.nc_grey)) - binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.white) + binding.messageQuote.quoteColoredView.setBackgroundColor(serverTheme.colorText) binding.messageQuote.quotedChatMessageView.visibility = View.VISIBLE } else { @@ -265,15 +278,16 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders private fun colorizeMessageBubble(message: ChatMessage) { val resources = sharedApplication!!.resources + val elementColor = viewThemeUtils.getElementColor(binding.root.context) val bgBubbleColor = if (message.isDeleted) { - resources.getColor(R.color.bg_message_list_outcoming_bubble_deleted) + ColorUtils.setAlphaComponent(elementColor, HALF_ALPHA_INT) } else { - resources.getColor(R.color.bg_message_list_outcoming_bubble) + elementColor } if (message.isGrouped) { val bubbleDrawable = DisplayUtils.getMessageSelector( bgBubbleColor, - resources.getColor(R.color.transparent), + ResourcesCompat.getColor(resources, R.color.transparent, null), bgBubbleColor, R.drawable.shape_grouped_outcoming_message ) @@ -281,7 +295,7 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders } else { val bubbleDrawable = DisplayUtils.getMessageSelector( bgBubbleColor, - resources.getColor(R.color.transparent), + ResourcesCompat.getColor(resources, R.color.transparent, null), bgBubbleColor, R.drawable.shape_outcoming_message ) @@ -300,5 +314,7 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders companion object { private const val TAG = "VoiceOutMessageView" private const val SEEKBAR_START: Int = 0 + private const val HALF_ALPHA_INT: Int = 255 / 2 + private val ALPHA_80_INT: Int = (255 * 0.8).roundToInt() } } From f68384e69da171638f08eae424cae7c90efce937 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 27 Jul 2022 23:51:28 +0200 Subject: [PATCH 074/398] theme folder/archive icon Signed-off-by: Andy Scherzinger --- .../messages/MagicPreviewMessageViewHolder.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java index 48e33915e50..e6c5a7d2337 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java @@ -29,6 +29,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; +import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.net.Uri; @@ -49,6 +50,7 @@ import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.databinding.ReactionsInsideMessageBinding; import com.nextcloud.talk.models.json.chat.ChatMessage; +import com.nextcloud.talk.ui.theme.ServerTheme; import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.DrawableUtils; import com.nextcloud.talk.utils.FileViewerUtils; @@ -91,6 +93,9 @@ public abstract class MagicPreviewMessageViewHolder extends MessageHolders.Incom @Inject Context context; + @Inject + ServerTheme serverTheme; + @Inject OkHttpClient okHttpClient; @@ -175,6 +180,13 @@ public void onBind(ChatMessage message) { String mimetype = message.getSelectedIndividualHashMap().get(KEY_MIMETYPE); int drawableResourceId = DrawableUtils.INSTANCE.getDrawableResourceIdForMimeType(mimetype); Drawable drawable = ContextCompat.getDrawable(context, drawableResourceId); + + if (drawable != null && + (drawableResourceId == R.drawable.ic_mimetype_folder || + drawableResourceId == R.drawable.ic_mimetype_package_x_generic)) { + drawable.setColorFilter(serverTheme.getPrimaryColor(), PorterDuff.Mode.SRC_ATOP); + } + image.getHierarchy().setPlaceholderImage(drawable); } else { fetchFileInformation("/" + message.getSelectedIndividualHashMap().get(KEY_PATH), From b7006230b8cd1dde6df29756abf1fe2fa3eeb615 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 27 Jul 2022 23:59:16 +0200 Subject: [PATCH 075/398] theme incoming voice message Signed-off-by: Andy Scherzinger --- .../messages/IncomingVoiceMessageViewHolder.kt | 5 +++++ .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt index e066047632f..8546dea0d7b 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt @@ -48,6 +48,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.databinding.ItemCustomIncomingVoiceMessageBinding import com.nextcloud.talk.models.json.chat.ChatMessage +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.preferences.AppPreferences @@ -66,6 +67,9 @@ class IncomingVoiceMessageViewHolder(incomingView: View, payload: Any) : Message @Inject var context: Context? = null + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + @JvmField @Inject var appPreferences: AppPreferences? = null @@ -93,6 +97,7 @@ class IncomingVoiceMessageViewHolder(incomingView: View, payload: Any) : Message updateDownloadState(message) binding.seekbar.max = message.voiceMessageDuration + viewThemeUtils.themeHorizontalSeekBar(binding.seekbar) if (message.isPlayingVoiceMessage) { showPlayButton() diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 5769c2ca3e1..3abf3bcfd74 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -25,13 +25,17 @@ import android.content.Context import android.content.res.ColorStateList import android.content.res.Configuration import android.graphics.Color +import android.graphics.PorterDuff import android.graphics.drawable.Drawable import android.view.View import android.widget.CheckBox import android.widget.EditText import android.widget.ImageView +import android.widget.ProgressBar import android.widget.RadioButton +import android.widget.SeekBar import android.widget.TextView +import androidx.annotation.ColorInt import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.SwitchCompat import androidx.core.content.ContextCompat @@ -82,6 +86,20 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { } } + fun themeHorizontalSeekBar(seekBar: SeekBar) { + withElementColor(seekBar) { color -> + themeHorizontalProgressBar(seekBar, color) + seekBar.thumb.setColorFilter(color, PorterDuff.Mode.SRC_IN) + } + } + + fun themeHorizontalProgressBar(progressBar: ProgressBar?, @ColorInt color: Int) { + if (progressBar != null) { + progressBar.indeterminateDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN) + progressBar.progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN) + } + } + fun colorTextViewElement(textView: TextView) { withElementColor(textView) { color -> textView.setTextColor(color) From e9d304a79bf11d0d801902d89bedf693611b606d Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 00:08:19 +0200 Subject: [PATCH 076/398] theme outgoing voice message seekbar Signed-off-by: Andy Scherzinger --- .../messages/OutcomingVoiceMessageViewHolder.kt | 17 ++++++++++++++--- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 8 ++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt index bbbba64d560..060897ba8ec 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt @@ -91,13 +91,19 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders colorizeMessageBubble(message) itemView.isSelected = false - binding.messageTime.setTextColor(context!!.resources.getColor(R.color.white60)) + binding.messageTime.setTextColor( + ColorUtils.setAlphaComponent( + serverTheme.colorText, + ALPHA_60_INT + ) + ) // parent message handling setParentMessageDataOnMessageItem(message) updateDownloadState(message) binding.seekbar.max = message.voiceMessageDuration + viewThemeUtils.themeHorizontalSeekBar(binding.seekbar, serverTheme.colorText) handleIsPlayingVoiceMessageState(message) @@ -135,8 +141,8 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders readStatusDrawableInt?.let { drawableInt -> AppCompatResources.getDrawable(context!!, drawableInt)?.let { - it.setColorFilter(context?.resources!!.getColor(R.color.white60), PorterDuff.Mode.SRC_ATOP) binding.checkMark.setImageDrawable(it) + viewThemeUtils.colorImageViewText(binding.checkMark) } } @@ -159,6 +165,7 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders context!!, R.drawable.ic_baseline_play_arrow_voice_message_24 ) + binding.playPauseBtn.icon.setColorFilter(serverTheme.colorText, PorterDuff.Mode.SRC_ATOP) binding.seekbar.progress = SEEKBAR_START message.resetVoiceMessage = false } @@ -179,6 +186,7 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders context!!, R.drawable.ic_baseline_pause_voice_message_24 ) + binding.playPauseBtn.icon.setColorFilter(serverTheme.colorText, PorterDuff.Mode.SRC_ATOP) binding.seekbar.progress = message.voiceMessagePlayedSeconds } else { binding.playPauseBtn.visibility = View.VISIBLE @@ -186,6 +194,7 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders context!!, R.drawable.ic_baseline_play_arrow_voice_message_24 ) + binding.playPauseBtn.icon.setColorFilter(serverTheme.colorText, PorterDuff.Mode.SRC_ATOP) } } @@ -263,7 +272,8 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders binding.messageQuote.quotedMessage.text = parentChatMessage.text binding.messageQuote.quotedMessage.setTextColor(serverTheme.colorText) binding.messageQuote.quotedMessageAuthor.setTextColor( - ColorUtils.setAlphaComponent(serverTheme.colorText, + ColorUtils.setAlphaComponent( + serverTheme.colorText, ALPHA_80_INT ) ) @@ -316,5 +326,6 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders private const val SEEKBAR_START: Int = 0 private const val HALF_ALPHA_INT: Int = 255 / 2 private val ALPHA_80_INT: Int = (255 * 0.8).roundToInt() + private val ALPHA_60_INT: Int = (255 * 0.6).roundToInt() } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 3abf3bcfd74..796df132552 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -88,11 +88,15 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { fun themeHorizontalSeekBar(seekBar: SeekBar) { withElementColor(seekBar) { color -> - themeHorizontalProgressBar(seekBar, color) - seekBar.thumb.setColorFilter(color, PorterDuff.Mode.SRC_IN) + themeHorizontalSeekBar(seekBar, color) } } + fun themeHorizontalSeekBar(seekBar: SeekBar, @ColorInt color: Int) { + themeHorizontalProgressBar(seekBar, color) + seekBar.thumb.setColorFilter(color, PorterDuff.Mode.SRC_IN) + } + fun themeHorizontalProgressBar(progressBar: ProgressBar?, @ColorInt color: Int) { if (progressBar != null) { progressBar.indeterminateDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN) From 234e97502be6e2c49369ac1c5f6e2c5b3e31ee37 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 00:16:18 +0200 Subject: [PATCH 077/398] theme reactions bottomsheet Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/controllers/ChatController.kt | 7 ++++++- .../com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index e925039b387..e868911c4fd 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -154,6 +154,7 @@ import com.nextcloud.talk.ui.dialog.MessageActionsDialog import com.nextcloud.talk.ui.dialog.ShowReactionsDialog import com.nextcloud.talk.ui.recyclerview.MessageSwipeActions import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback +import com.nextcloud.talk.ui.theme.ServerTheme import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.AttendeePermissionsUtil @@ -239,6 +240,9 @@ class ChatController(args: Bundle) : @Inject lateinit var viewThemeUtils: ViewThemeUtils + @Inject + lateinit var serverTheme: ServerTheme + val disposables = DisposableSet() var roomToken: String? = null @@ -2681,7 +2685,8 @@ class ChatController(args: Bundle) : chatMessage, conversationUser, hasChatPermission, - ncApi!! + ncApi!!, + serverTheme ).show() } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt index 602c68cdc3e..554fc27b714 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt @@ -51,6 +51,7 @@ import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.reactions.ReactionsOverall +import com.nextcloud.talk.ui.theme.ServerTheme import com.nextcloud.talk.utils.ApiUtils import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers @@ -65,7 +66,8 @@ class ShowReactionsDialog( private val chatMessage: ChatMessage, private val user: User?, private val hasChatPermission: Boolean, - private val ncApi: NcApi + private val ncApi: NcApi, + private val serverTheme: ServerTheme ) : BottomSheetDialog(activity), ReactionItemClickListener { private lateinit var binding: DialogMessageReactionsBinding @@ -96,6 +98,7 @@ class ShowReactionsDialog( adapter?.list?.clear() if (chatMessage.reactions != null && chatMessage.reactions!!.isNotEmpty()) { var reactionsTotal = 0 + binding.emojiReactionsTabs.setSelectedTabIndicatorColor(serverTheme.primaryColor) for ((emoji, amount) in chatMessage.reactions!!) { reactionsTotal = reactionsTotal.plus(amount as Int) val tab: TabLayout.Tab = binding.emojiReactionsTabs.newTab() // Create a new Tab names "First Tab" From 9eac0d3615b476e71f4f8e90a99f8733a166dcc2 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 00:26:32 +0200 Subject: [PATCH 078/398] theme audio device list Signed-off-by: Andy Scherzinger --- .../talk/ui/dialog/AudioOutputDialog.kt | 64 +++++++------------ 1 file changed, 24 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt index e4f9105f4a8..c627605f9b0 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt @@ -25,17 +25,33 @@ import android.util.Log import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat +import autodagger.AutoInjector import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.nextcloud.talk.R import com.nextcloud.talk.activities.CallActivity +import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.databinding.DialogAudioOutputBinding +import com.nextcloud.talk.ui.theme.ServerTheme +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.webrtc.WebRtcAudioManager +import javax.inject.Inject +@AutoInjector(NextcloudTalkApplication::class) class AudioOutputDialog(val callActivity: CallActivity) : BottomSheetDialog(callActivity) { + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + + @Inject + lateinit var serverTheme: ServerTheme + private lateinit var dialogAudioOutputBinding: DialogAudioOutputBinding + init { + NextcloudTalkApplication.sharedApplication?.componentApplication?.inject(this) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) dialogAudioOutputBinding = DialogAudioOutputBinding.inflate(layoutInflater) @@ -82,55 +98,23 @@ class AudioOutputDialog(val callActivity: CallActivity) : BottomSheetDialog(call private fun highlightActiveOutputChannel() { when (callActivity.audioManager?.currentAudioDevice) { WebRtcAudioManager.AudioDevice.BLUETOOTH -> { - dialogAudioOutputBinding.audioOutputBluetoothIcon.setColorFilter( - ContextCompat.getColor( - context, - R.color.colorPrimary - ), - android.graphics.PorterDuff.Mode.SRC_IN - ) - dialogAudioOutputBinding.audioOutputBluetoothText.setTextColor( - callActivity.resources.getColor(R.color.colorPrimary) - ) + viewThemeUtils.colorImageView(dialogAudioOutputBinding.audioOutputBluetoothIcon) + dialogAudioOutputBinding.audioOutputBluetoothText.setTextColor(serverTheme.primaryColor) } WebRtcAudioManager.AudioDevice.SPEAKER_PHONE -> { - dialogAudioOutputBinding.audioOutputSpeakerIcon.setColorFilter( - ContextCompat.getColor( - context, - R.color.colorPrimary - ), - android.graphics.PorterDuff.Mode.SRC_IN - ) - dialogAudioOutputBinding.audioOutputSpeakerText.setTextColor( - callActivity.resources.getColor(R.color.colorPrimary) - ) + viewThemeUtils.colorImageView(dialogAudioOutputBinding.audioOutputSpeakerIcon) + dialogAudioOutputBinding.audioOutputSpeakerText.setTextColor(serverTheme.primaryColor) } WebRtcAudioManager.AudioDevice.EARPIECE -> { - dialogAudioOutputBinding.audioOutputEarspeakerIcon.setColorFilter( - ContextCompat.getColor( - context, - R.color.colorPrimary - ), - android.graphics.PorterDuff.Mode.SRC_IN - ) - dialogAudioOutputBinding.audioOutputEarspeakerText.setTextColor( - callActivity.resources.getColor(R.color.colorPrimary) - ) + viewThemeUtils.colorImageView(dialogAudioOutputBinding.audioOutputEarspeakerIcon) + dialogAudioOutputBinding.audioOutputEarspeakerText.setTextColor(serverTheme.primaryColor) } WebRtcAudioManager.AudioDevice.WIRED_HEADSET -> { - dialogAudioOutputBinding.audioOutputWiredHeadsetIcon.setColorFilter( - ContextCompat.getColor( - context, - R.color.colorPrimary - ), - android.graphics.PorterDuff.Mode.SRC_IN - ) - dialogAudioOutputBinding.audioOutputWiredHeadsetText.setTextColor( - callActivity.resources.getColor(R.color.colorPrimary) - ) + viewThemeUtils.colorImageView(dialogAudioOutputBinding.audioOutputWiredHeadsetIcon) + dialogAudioOutputBinding.audioOutputWiredHeadsetText.setTextColor(serverTheme.primaryColor) } else -> Log.d(TAG, "AudioOutputDialog doesn't know this AudioDevice") From 278aaa437fb97948dd2b7ac3d3e3595d818db748 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 00:39:23 +0200 Subject: [PATCH 079/398] fix ktlint issues Signed-off-by: Andy Scherzinger --- .../talk/adapters/messages/OutcomingPollMessageViewHolder.kt | 4 +--- .../java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt index 302929188d9..a418ac68619 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt @@ -186,9 +186,7 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag binding.messageQuote.quotedMessage.text = parentChatMessage.text binding.messageQuote.quotedMessage.setTextColor(serverTheme.colorText) binding.messageQuote.quotedMessageAuthor.setTextColor( - ColorUtils.setAlphaComponent(serverTheme.colorText, - ALPHA_80_INT - ) + ColorUtils.setAlphaComponent(serverTheme.colorText, ALPHA_80_INT) ) binding.messageQuote.quoteColoredView.setBackgroundColor(serverTheme.colorText) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt index c627605f9b0..5e879e736b2 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt @@ -24,7 +24,6 @@ import android.os.Bundle import android.util.Log import android.view.View import android.view.ViewGroup -import androidx.core.content.ContextCompat import autodagger.AutoInjector import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog From d9c59b6f879027453a471f220dc83fedafbc0ea3 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 00:40:52 +0200 Subject: [PATCH 080/398] organize imports Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/adapters/items/ConversationItem.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index e9c172173a5..0b3cddd8627 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -27,7 +27,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; -import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; From d4c07f12786db25b58a1c185e9855c4c6ddc0bf1 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 16:06:52 +0200 Subject: [PATCH 081/398] safeguard theme values in case of null values Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/ui/theme/ColorUtil.kt | 70 +++++++++++++++++++ .../talk/ui/theme/ServerThemeImpl.kt | 17 +++-- app/src/main/res/values/colors.xml | 1 + 3 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/ui/theme/ColorUtil.kt diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ColorUtil.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ColorUtil.kt new file mode 100644 index 00000000000..4f2daa22260 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ColorUtil.kt @@ -0,0 +1,70 @@ +/* + * Nextcloud Talk application + * + * @author Andy Scherzinger + * Copyright (C) 2022 Andy Scherzinger + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.nextcloud.talk.ui.theme + +import android.content.Context +import android.graphics.Color +import androidx.annotation.ColorInt +import androidx.annotation.ColorRes +import androidx.core.content.ContextCompat +import androidx.core.graphics.ColorUtils +import com.nextcloud.talk.R + +object ColorUtil { + private const val HSL_SIZE: Int = 3 + private const val INDEX_LUMINATION: Int = 2 + private const val LUMINATION_DARK_THRESHOLD: Float = 0.6f + + fun getPrimaryColor(context: Context, primaryColor: String?, @ColorRes fallbackColor: Int): Int { + return if (primaryColor != null) { + Color.parseColor(primaryColor) + } else { + ContextCompat.getColor(context, fallbackColor) + } + } + + fun getNullsafeColor(color: String?, @ColorInt fallbackColor: Int): Int { + return if (color != null) { + Color.parseColor(color) + } else { + fallbackColor + } + } + + fun getTextColor(context: Context, colorText: String?, @ColorInt fallBackPrimaryColor: Int): Int { + return if (colorText != null) { + Color.parseColor(colorText) + } else { + getForegroundColorForBackgroundColor(context, fallBackPrimaryColor) + } + } + + @ColorInt + public fun getForegroundColorForBackgroundColor(context: Context, @ColorInt color: Int): Int { + val hsl = FloatArray(HSL_SIZE) + ColorUtils.RGBToHSL(Color.red(color), Color.green(color), Color.blue(color), hsl) + + return if (hsl[INDEX_LUMINATION] < LUMINATION_DARK_THRESHOLD) { + Color.WHITE + } else { + ContextCompat.getColor(context, R.color.grey_900) + } + } +} diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt index cd4607e221d..6d4c5f47fd0 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt @@ -2,7 +2,9 @@ * Nextcloud Talk application * * @author Álvaro Brey + * @author Andy Scherzinger * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Andy Scherzinger * Copyright (C) 2022 Nextcloud GmbH * * This program is free software: you can redistribute it and/or modify @@ -22,7 +24,7 @@ package com.nextcloud.talk.ui.theme import android.content.Context -import android.graphics.Color +import com.nextcloud.talk.R import com.nextcloud.talk.models.json.capabilities.ThemingCapability internal class ServerThemeImpl(context: Context, themingCapability: ThemingCapability) : @@ -34,12 +36,13 @@ internal class ServerThemeImpl(context: Context, themingCapability: ThemingCapab override val colorElementDark: Int override val colorText: Int - // TODO fallback when some of these are null init { - primaryColor = Color.parseColor(themingCapability.color!!) - colorElement = Color.parseColor(themingCapability.colorElement!!) - colorElementBright = Color.parseColor(themingCapability.colorElementBright!!) - colorElementDark = Color.parseColor(themingCapability.colorElementDark!!) - colorText = Color.parseColor(themingCapability.colorText!!) + primaryColor = ColorUtil.getPrimaryColor(context, themingCapability.color, R.color.colorPrimary) + + colorElement = ColorUtil.getNullsafeColor(themingCapability.colorElement, primaryColor) + colorElementBright = ColorUtil.getNullsafeColor(themingCapability.colorElementBright, primaryColor) + colorElementDark = ColorUtil.getNullsafeColor(themingCapability.colorElementDark, primaryColor) + + colorText = ColorUtil.getTextColor(context, themingCapability.colorText, primaryColor) } } diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 28ff0ff06db..9fcf53e79d3 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -63,6 +63,7 @@ #006400 #E8E8E8 #757575 + #212121 #D5D5D5 #E9FFFFFF #111111 From eb967fbf7d0d36b807091e8d3e69e37969589bcb Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 16:37:18 +0200 Subject: [PATCH 082/398] harden theming calculations to handle null values Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/ui/theme/ServerThemeImpl.kt | 12 ++++++------ .../nextcloud/talk/ui/theme/ServerThemeProvider.kt | 2 +- .../talk/ui/theme/ServerThemeProviderImpl.kt | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt index 6d4c5f47fd0..0ad068eacd5 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeImpl.kt @@ -27,7 +27,7 @@ import android.content.Context import com.nextcloud.talk.R import com.nextcloud.talk.models.json.capabilities.ThemingCapability -internal class ServerThemeImpl(context: Context, themingCapability: ThemingCapability) : +internal class ServerThemeImpl(context: Context, themingCapability: ThemingCapability?) : ServerTheme { override val primaryColor: Int @@ -37,12 +37,12 @@ internal class ServerThemeImpl(context: Context, themingCapability: ThemingCapab override val colorText: Int init { - primaryColor = ColorUtil.getPrimaryColor(context, themingCapability.color, R.color.colorPrimary) + primaryColor = ColorUtil.getPrimaryColor(context, themingCapability?.color, R.color.colorPrimary) - colorElement = ColorUtil.getNullsafeColor(themingCapability.colorElement, primaryColor) - colorElementBright = ColorUtil.getNullsafeColor(themingCapability.colorElementBright, primaryColor) - colorElementDark = ColorUtil.getNullsafeColor(themingCapability.colorElementDark, primaryColor) + colorElement = ColorUtil.getNullsafeColor(themingCapability?.colorElement, primaryColor) + colorElementBright = ColorUtil.getNullsafeColor(themingCapability?.colorElementBright, primaryColor) + colorElementDark = ColorUtil.getNullsafeColor(themingCapability?.colorElementDark, primaryColor) - colorText = ColorUtil.getTextColor(context, themingCapability.colorText, primaryColor) + colorText = ColorUtil.getTextColor(context, themingCapability?.colorText, primaryColor) } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt index 1d299ca7bd3..274616432b7 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProvider.kt @@ -26,6 +26,6 @@ import com.nextcloud.talk.models.json.capabilities.Capabilities interface ServerThemeProvider { fun getServerThemeForUser(user: User): ServerTheme - fun getServerThemeForCapabilities(capabilities: Capabilities): ServerTheme + fun getServerThemeForCapabilities(capabilities: Capabilities?): ServerTheme fun getServerThemeForCurrentUser(): ServerTheme } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt index 87cdcee6b61..7becbda620f 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt @@ -55,14 +55,14 @@ internal class ServerThemeProviderImpl @Inject constructor( } override fun getServerThemeForUser(user: User): ServerTheme { - return getServerThemeForCapabilities(user.capabilities!!) + return getServerThemeForCapabilities(user.capabilities) } override fun getServerThemeForCurrentUser(): ServerTheme { return getServerThemeForUser(currentUser) } - override fun getServerThemeForCapabilities(capabilities: Capabilities): ServerTheme { - return ServerThemeImpl(context, capabilities.themingCapability!!) + override fun getServerThemeForCapabilities(capabilities: Capabilities?): ServerTheme { + return ServerThemeImpl(context, capabilities?.themingCapability) } } From b9e9c35df547e9c6c2c167f7a6a440d90fcfbef1 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 16:50:34 +0200 Subject: [PATCH 083/398] don't tint status icons on cardViews Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index 69407cc5fe0..6c6dfb9d6c2 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -417,7 +417,6 @@ class SetStatusDialogFragment : } viewThemeUtils.colorCardViewBackground(views.first) viewThemeUtils.colorTextViewText(views.second) - viewThemeUtils.colorImageViewText(views.third) } private fun clearTopStatus() { From e3c535722dd9919a68b3b1b80dbc09f1dfdf8d5d Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 17:00:09 +0200 Subject: [PATCH 084/398] theme all swipe to refresh layouts Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/controllers/ContactsController.kt | 6 +++--- .../talk/controllers/ConversationsListController.java | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt index bb370d3f3df..04398483f29 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt @@ -623,9 +623,9 @@ class ContactsController(args: Bundle) : binding.controllerGenericRv.recyclerView.setHasFixedSize(true) binding.controllerGenericRv.recyclerView.adapter = adapter binding.controllerGenericRv.swipeRefreshLayout.setOnRefreshListener { fetchData() } - binding.controllerGenericRv.swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary) - binding.controllerGenericRv.swipeRefreshLayout - .setProgressBackgroundColorSchemeResource(R.color.refresh_spinner_background) + + viewThemeUtils.themeSwipeRefreshLayout(binding.controllerGenericRv.swipeRefreshLayout) + binding.joinConversationViaLink.joinConversationViaLinkImageView .background .setColorFilter( diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index 4b9399d2aca..72a953d8bb3 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -783,8 +783,7 @@ public void onScrollStateChanged(@NotNull RecyclerView recyclerView, int newStat }); swipeRefreshLayout.setOnRefreshListener(() -> fetchData()); - swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary); - swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.refresh_spinner_background); + viewThemeUtils.themeSwipeRefreshLayout(swipeRefreshLayout); emptyLayoutView.setOnClickListener(v -> showNewConversationsScreen()); floatingActionButton.setOnClickListener(v -> { From 96c29260ab2361d1499af80a91d075aa42f457e8 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 17:22:57 +0200 Subject: [PATCH 085/398] set link colors correctly Signed-off-by: Andy Scherzinger --- .../adapters/messages/MagicOutcomingTextMessageViewHolder.kt | 1 + .../talk/adapters/messages/OutcomingLocationMessageViewHolder.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt index 757e0563be5..6102446e593 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt @@ -96,6 +96,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage binding.messageTime.layoutParams = layoutParams binding.messageText.text = messageString binding.messageText.setTextColor(serverTheme.colorText) + binding.messageText.setLinkTextColor(serverTheme.colorText) // parent message handling if (!message.isDeleted && message.parentMessage != null) { diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt index 04eca1e4d32..fecf4af6498 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt @@ -98,6 +98,7 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders binding.messageText.text = message.text binding.messageText.setTextColor(serverTheme.colorText) + binding.messageText.setLinkTextColor(serverTheme.colorText) // parent message handling setParentMessageDataOnMessageItem(message) From 6e0afac7f6fe6cf3d5829663a63033da50816b49 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 28 Jul 2022 17:23:15 +0200 Subject: [PATCH 086/398] format layout Signed-off-by: Andy Scherzinger --- .../res/layout/item_custom_outcoming_location_message.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/item_custom_outcoming_location_message.xml b/app/src/main/res/layout/item_custom_outcoming_location_message.xml index d5c9530716d..5af1bab92b3 100644 --- a/app/src/main/res/layout/item_custom_outcoming_location_message.xml +++ b/app/src/main/res/layout/item_custom_outcoming_location_message.xml @@ -77,8 +77,8 @@ android:layout_height="wrap_content" android:layout_below="@id/messageTime" android:layout_marginStart="8dp" - app:layout_alignSelf="center" - android:contentDescription="@null" /> + android:contentDescription="@null" + app:layout_alignSelf="center" /> Date: Thu, 28 Jul 2022 18:22:16 +0200 Subject: [PATCH 087/398] Add caching Signed-off-by: Andy Scherzinger --- .../talk/ui/theme/ServerThemeProviderImpl.kt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt index 7becbda620f..389785cd4a5 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ServerThemeProviderImpl.kt @@ -2,7 +2,9 @@ * Nextcloud Talk application * * @author Álvaro Brey + * @author Andy Scherzinger * Copyright (C) 2022 Álvaro Brey + * Copyright (C) 2022 Andy Scherzinger * Copyright (C) 2022 Nextcloud GmbH * * This program is free software: you can redistribute it and/or modify @@ -26,15 +28,16 @@ import android.content.Context import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.models.json.capabilities.Capabilities import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew +import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject -// TODO cache theme, keyed by server url -// TODO reload UI when account changes internal class ServerThemeProviderImpl @Inject constructor( private val context: Context, private val userProvider: CurrentUserProviderNew -) : - ServerThemeProvider { +) : ServerThemeProvider { + + val themeCache: ConcurrentHashMap = ConcurrentHashMap() + // TODO move this logic to currentUserProvider or something private var _currentUser: User? = null private val currentUser: User @@ -55,7 +58,10 @@ internal class ServerThemeProviderImpl @Inject constructor( } override fun getServerThemeForUser(user: User): ServerTheme { - return getServerThemeForCapabilities(user.capabilities) + if (user.baseUrl != null && !themeCache.containsKey(user.baseUrl)) { + themeCache[user.baseUrl!!] = getServerThemeForCapabilities(user.capabilities) + } + return themeCache[user.baseUrl]!! } override fun getServerThemeForCurrentUser(): ServerTheme { From 6e42a52a9a5190f3fcb6818445373742b19628af Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Fri, 29 Jul 2022 00:17:38 +0200 Subject: [PATCH 088/398] fix entry menu bottom sheet input layout text color Signed-off-by: Andy Scherzinger --- .../talk/controllers/bottomsheet/EntryMenuController.kt | 1 - app/src/main/res/layout/controller_entry_menu.xml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt index f652b427ed9..c7e45e489d3 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/EntryMenuController.kt @@ -175,7 +175,6 @@ class EntryMenuController(args: Bundle) : } viewThemeUtils.colorTextInputLayout(binding.textInputLayout) - binding.textEdit.setTextColor(serverTheme.colorText) viewThemeUtils.colorMaterialButtonText(binding.okButton) binding.textInputLayout.hint = labelText diff --git a/app/src/main/res/layout/controller_entry_menu.xml b/app/src/main/res/layout/controller_entry_menu.xml index 2f50f3d687b..4c851cc3f0c 100644 --- a/app/src/main/res/layout/controller_entry_menu.xml +++ b/app/src/main/res/layout/controller_entry_menu.xml @@ -63,7 +63,7 @@ android:inputType="textUri" android:singleLine="true" android:textAlignment="viewStart" - android:textColor="@color/colorPrimary" /> + android:textColor="@color/high_emphasis_text" /> From 23d436f31442506e801fd7e668d8fbf5bbd1a678 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Fri, 29 Jul 2022 00:18:21 +0200 Subject: [PATCH 089/398] fix input layout theming dark/light Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/ui/theme/ViewThemeUtils.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 796df132552..572fb1259f9 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -287,9 +287,19 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { fun colorTextInputLayout(textInputLayout: TextInputLayout) { withElementColor(textInputLayout) { color -> - // TODO calculate error color based on primary color, dark/light aware val errorColor = Color.GRAY - textInputLayout.boxStrokeColor = color + textInputLayout.setBoxStrokeColorStateList( + ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_focused), + intArrayOf(android.R.attr.state_focused) + ), + intArrayOf( + Color.GRAY, + color + ) + ) + ) textInputLayout.setErrorIconTintList( ColorStateList( arrayOf( From b34765ccf4eacb4423a18380dcf2b38c55152caa Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Fri, 29 Jul 2022 00:18:54 +0200 Subject: [PATCH 090/398] migrate profile fields to input layouts for Material3 Signed-off-by: Andy Scherzinger --- .../talk/controllers/ProfileController.kt | 40 +++++--------- .../main/res/layout/controller_profile.xml | 3 +- .../layout/user_info_details_table_item.xml | 54 +++++++++++-------- app/src/main/res/values/dimens.xml | 1 + 4 files changed, 50 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt index 9db7d8781ba..add4ac12874 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ProfileController.kt @@ -24,10 +24,8 @@ package com.nextcloud.talk.controllers import android.app.Activity import android.content.Intent import android.content.pm.PackageManager -import android.content.res.ColorStateList import android.graphics.Bitmap import android.graphics.BitmapFactory -import android.graphics.Color import android.net.Uri import android.os.Bundle import android.text.Editable @@ -43,7 +41,6 @@ import android.view.ViewGroup import android.widget.Toast import androidx.annotation.ColorInt import androidx.annotation.DrawableRes -import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.ViewCompat import androidx.recyclerview.widget.RecyclerView @@ -764,22 +761,14 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { DrawableCompat.setTint(holder.binding.icon.drawable, mTintColor) if (!TextUtils.isEmpty(item.text) || controller.edit) { holder.binding.userInfoDetailContainer.visibility = View.VISIBLE - if (controller.activity != null) { - holder.binding.userInfoEditText.setTextColor( - ContextCompat.getColor( - controller.activity!!, - R.color.conversation_item_header - ) - ) - } + controller.viewThemeUtils.colorTextInputLayout(holder.binding.userInfoInputLayout) if (controller.edit && controller.editableFields.contains(item.field.toString().lowercase()) ) { - holder.binding.userInfoEditText.isEnabled = true - holder.binding.userInfoEditText.isFocusableInTouchMode = true - holder.binding.userInfoEditText.isEnabled = true - holder.binding.userInfoEditText.isCursorVisible = true - holder.binding.userInfoEditText.backgroundTintList = ColorStateList.valueOf(mTintColor) + holder.binding.userInfoEditTextEdit.isEnabled = true + holder.binding.userInfoEditTextEdit.isFocusableInTouchMode = true + holder.binding.userInfoEditTextEdit.isEnabled = true + holder.binding.userInfoEditTextEdit.isCursorVisible = true holder.binding.scope.setOnClickListener { ScopeDialog( controller.activity!!, @@ -790,11 +779,10 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { } holder.binding.scope.alpha = HIGH_EMPHASIS_ALPHA } else { - holder.binding.userInfoEditText.isEnabled = false - holder.binding.userInfoEditText.isFocusableInTouchMode = false - holder.binding.userInfoEditText.isEnabled = false - holder.binding.userInfoEditText.isCursorVisible = false - holder.binding.userInfoEditText.backgroundTintList = ColorStateList.valueOf(Color.TRANSPARENT) + holder.binding.userInfoEditTextEdit.isEnabled = false + holder.binding.userInfoEditTextEdit.isFocusableInTouchMode = false + holder.binding.userInfoEditTextEdit.isEnabled = false + holder.binding.userInfoEditTextEdit.isCursorVisible = false holder.binding.scope.setOnClickListener(null) holder.binding.scope.alpha = MEDIUM_EMPHASIS_ALPHA } @@ -807,19 +795,19 @@ class ProfileController : NewBaseController(R.layout.controller_profile) { holder: ViewHolder, item: UserInfoDetailsItem ) { - holder.binding.userInfoEditText.setText(item.text) - holder.binding.userInfoEditText.hint = item.hint - holder.binding.userInfoEditText.addTextChangedListener(object : TextWatcher { + holder.binding.userInfoEditTextEdit.setText(item.text) + holder.binding.userInfoInputLayout.hint = item.hint + holder.binding.userInfoEditTextEdit.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { // unused atm } override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { if (controller.edit) { - displayList!![holder.adapterPosition].text = holder.binding.userInfoEditText.text.toString() + displayList!![holder.adapterPosition].text = holder.binding.userInfoEditTextEdit.text.toString() } else { filteredDisplayList[holder.adapterPosition].text = - holder.binding.userInfoEditText.text.toString() + holder.binding.userInfoEditTextEdit.text.toString() } } diff --git a/app/src/main/res/layout/controller_profile.xml b/app/src/main/res/layout/controller_profile.xml index 21447143dfb..4d850c72cd0 100644 --- a/app/src/main/res/layout/controller_profile.xml +++ b/app/src/main/res/layout/controller_profile.xml @@ -29,7 +29,8 @@ + android:layout_height="wrap_content" + android:paddingBottom="@dimen/standard_padding"> - #61000000 - #666666 #FFFFFF @@ -83,8 +80,6 @@ #EFEFEF #66EFEFEF - @color/colorPrimary - #800082C9 #FFFFFF #121212 From bb3253d5c0d166bb620470754c4c45eaa327e754 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Thu, 11 Aug 2022 04:15:05 +0000 Subject: [PATCH 104/398] [tx-robot] updated from transifex Signed-off-by: Nextcloud bot --- app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-bg-rBG/strings.xml | 23 +++++++++++++++++++++- app/src/main/res/values-ca/strings.xml | 1 + app/src/main/res/values-cs-rCZ/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-eu/strings.xml | 1 + app/src/main/res/values-fa/strings.xml | 1 + app/src/main/res/values-fi-rFI/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-gl/strings.xml | 1 + app/src/main/res/values-hr/strings.xml | 1 + app/src/main/res/values-hu-rHU/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-iw/strings.xml | 1 + app/src/main/res/values-ja-rJP/strings.xml | 1 + app/src/main/res/values-ko/strings.xml | 1 + app/src/main/res/values-nb-rNO/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sc/strings.xml | 1 + app/src/main/res/values-sk-rSK/strings.xml | 2 ++ app/src/main/res/values-sl/strings.xml | 1 + app/src/main/res/values-sr/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-vi/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + 33 files changed, 55 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 86a5870e7fd..ec30d3b854e 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -297,6 +297,7 @@ انضم للمحادثة في %1$s /index.php/call/ %2$s /كلمة المرور: %1$s أرسل هذا الموقع + بطاقة Deck الموقع الموقع المشارك رتب حسب diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index e39cde19f15..be65f19c45f 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -36,6 +36,7 @@ Z - A Първо най-големият Първо най-малкият + Докосване, за отворяне на анкета Няма резултати от търсенето Започнете да пишете, за търсене … Търсене … @@ -98,6 +99,7 @@ Присъединяване към разговор или започване на нов Поздравете приятелите и колегите си! Копиране + Създаване на анкета Днес Вчера Изтриване @@ -233,6 +235,8 @@ Изпратихте изображение. %1$s изпрати местоположение. Изпратихте местоположение. + %1$sизпрати анкета. + Изпратихте анкета. %1$s изпрати гласово съобщение. Изпратихте гласово съобщение Тестване на връзката със сървъра @@ -307,8 +311,10 @@ \nПарола: %1$s Споделяне на това местоположение Споделени елементи + Deck карта Изображения, файлове, гласови съобщения … Няма споделени елементи + Местоположение Споделено местоположение Сортиране по Начало @@ -337,11 +343,21 @@ Отворяне в приложението Файлове Възпроизвеждане/пауза на гласово съобщение Добавяне на опция + Редактиране на гласуване + Край на анкетата + Наистина ли искате да прекратите тази анкета? Това не може да бъде отменено. + Не можете да гласувате с повече опции за тази анкета. + Множество отговори + Изтриване на опция %1$s + Опция %1$s Опции Частна анкета + Въпрос + Вашият въпрос Резултати Настройки Глас + Гласуването е изпратено Всички Споделянето на файлове от хранилище не е възможно без права Записване @@ -369,6 +385,7 @@ Файл Медия Други + Анкета Гласов Любими Нямате право да започнете разговор @@ -398,4 +415,8 @@ Няма зададена лична информация Добавяне на име, снимка и подробности за контакт към страницата на вашия профил. Какъв е вашият статус? - + + %dгласувания + %d гласувания + + diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 09d2778ff71..a16fd4d8c6f 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -228,6 +228,7 @@ Afegiu-vos a la conversa a %1$s/index.php/call/%2$s \nContrasenya: %1$s Comparteix aquesta localització + Targeta de Deck Ubicació Ordena per Hora d\'inici diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index a5ae38a8f99..9b26dbc8683 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -311,6 +311,7 @@ \nHeslo: %1$s Sdílet toto umístění Sdílené položky + Karta aplikace Deck Obrázky, soubory, hlasové zprávy… Žádné sdílené položky Poloha diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 20e76a10fa2..caf930481fb 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -311,6 +311,7 @@ \nPasswort: %1$s Diesen Ort teilen Geteilte Elemente + Deck-Karte Bilder, Dateien, Sprachnachrichten … Keine geteilten Elemente Ort diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 9cfbc0e7419..60f743a9c49 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -284,6 +284,7 @@ Συμμετοχή στην συνομιλία από %1$s/index.php/call/%2$s \nΣυνθηματικό: %1$s Διαμοιρασμός αυτής της τοποθεσίας + Κάρτα του Deck Τοποθεσία Διαμοιρασμένες τοποθεσίες Ταξινόμηση κατά diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 67bdc11d8fc..cf2f80acabe 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -309,6 +309,7 @@ \nContraseña: %1$s Compartir esta ubicación Elementos compartidos + Tarjeta Deck Imágenes, archivos, mensajes de voz… No hay elementos compartidos Ubicación diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 5e04e44c4c7..6fcd0d297ea 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -311,6 +311,7 @@ \nPasahitza: %1$s Partekatu kokapen hau Partekatutako elementuak + Deck txartela Irudiak, fitxategiak, ahots-mezuak … Ez dago partekatutako elementurik Kokapena diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 34a7199ca03..204f4dfff6f 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -231,6 +231,7 @@ به مکالمه %1$s/index.php/call/%2$s ملحق شوید رمز عبور: %1$s اشتراک این مکان + کارت deck محل مرتب‌سازی بر اساس زمان شروع diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 9e9afb56e06..21522356728 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -270,6 +270,7 @@ \nSalasana: %1$s Jaa tämä sijainti Jaetut tietueet + Deck-kortti Kuvat, tiedostot, ääniviestit… Ei jaettuja kohteita Sijainti diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c572c9b765c..fcc574561b3 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -308,6 +308,7 @@ \nLe mot de passe : %1$s Partager cette position Éléments partagés + Carte de l\'application Deck Images, fichiers, messages vocaux… Pas d\'éléments partagés Position diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index defc487e5b5..a2ad6ab03e1 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -245,6 +245,7 @@ Únase á conversa en %1$s/index.php/call/%2$s \nContrasinal: %1$s Compartir esta localización + Tarxeta do Deck Localización Ordenar por Hora de comezo diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index e2faae549a3..69f323288b8 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -296,6 +296,7 @@ Pridruži se razgovoru na adresi %1$s/index.php/call/%2$s \nZaporka: %1$s Dijeli ovu lokaciju + Deck kartica Lokacija Dijeljena lokacija Razvrstaj prema diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 2605c10f3a4..a527f53a104 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -311,6 +311,7 @@ \nJelszó: %1$s Ezen hely megosztása Megosztott elemek + Kártya Képek, fájlok, hangüzenetek… Nincsenek megosztott elemek Hely diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 61753ca63dd..a0724aa6779 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -305,6 +305,7 @@ Partecipa alla conversazione su %1$s/index.php/call/%2$s \nPassword: %1$s Condividi questa posizione + Scheda di Deck Posizione Posizione condivisa Ordina per diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index de1fb21780b..227ccdd9538 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -231,6 +231,7 @@ כדאי להצטרף לדיון תחת %1$s/index.php/call/%2$s \nססמה: %1$s שיתוף המיקום הזה + כרטיס בחסיפה מיקום מיון על בסיס מועד התחלה diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index f49b429e292..8a86d9a5936 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -307,6 +307,7 @@ \nパスワード:%1$s この位置を共有 共有済みアイテム + Deckカード 画像、ファイル、ボイスメッセージ … 共有アイテムがありません 位置 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 98f0ca868f7..ca4fce1a2c6 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -251,6 +251,7 @@ %1$s 초대 %1$s/index.php/call/%2$s 대화에 참여 \n패스워드: %1$s + Deck 카드 위치 공유된 위치 정렬 diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 469d07caadf..927acdc030c 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -233,6 +233,7 @@ %1$s invitasjon Delta i samtalen via %1$s/index.php/call/%2$s \nPassord: %1$s + Deck kort Sted Sorter etter Start tidspunkt diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 8d3275e14d7..defaaba70e2 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -303,6 +303,7 @@ Kies er eentje van een provider. Neem deel aan het gesprek %1$s/index.php/call/%2$s \nWachtwoord: %1$s Deel deze locatie + Deck kaart Locatie Gedeelde locatie Sorteren op diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index fd7e608e573..07ee5a4b299 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -311,6 +311,7 @@ \nHasło: %1$s Udostępnij tę lokalizację Udostępnione elementy + Karta Deck Obrazy, pliki, wiadomości głosowe… Brak udostępnionych elementów Lokalizacja diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index f79a61b1a90..9121f0a70b8 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -311,6 +311,7 @@ \nSenha: %1$s Compartilhe este local Itens compartilhados + Cartão de deck Imagens, arquivos, mensagens de voz … Nenhum item compartilhado Localização diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7ac41f65147..d42aed4ba46 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -308,6 +308,7 @@ \nПароль: %1$s Поделиться этим местом Общие элементы + Карточка Изображения, файлы, голосовые сообщения … Нет общих элементов Местоположение diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index d5990d79b92..c90252a4609 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -283,6 +283,7 @@ Intra in sa tzarrada in %1$s/index.php/call/%2$s \nCrae: %1$s Cumpartzi custa positzione + Positzione Positzione cumpartzida Assenta segundu Ora de cumintzu diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index 515a4a30bdf..32d83346048 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -308,8 +308,10 @@ \nHeslo: %1$s Zdieľať túto polohu Zdieľané položky + Palubná karta Obrázky, súbory, hlasové správy … Žiadne zdieľané položky + Umiestnenie Zdieľaná poloha Zoradiť podľa Čas začiatku diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 5e0d85a91b5..c5e847e6f40 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -306,6 +306,7 @@ Pridružite se pogovoru na %1$s/index.php/call/%2$s \nGeslo: %1$s Objavi trenutno mesto + Naloga Deck Slike, datoteke, glasovna sporočila ... Trenutno mesto Objavljeno trenutno mesto diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index b89c4927fd3..25326902533 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -222,6 +222,7 @@ Придружи се разговору на%1$s/index.php/call/%2$s \nЛозинка: %1$s Подели ову локацију + Картица Шпила Локација Разврстај Време почетка diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 4e12e12b3bb..ed17e85a604 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -238,6 +238,7 @@ Gå med i konversationen på %1$s/index.php/call/%2$s \nLösenord: %1$s Dela den här platsen + Kortlek-kort Plats Sortera efter Starttid diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c027720f8ad..a27e110ada7 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -313,6 +313,7 @@ Paylaşılmış ögeler Görseller, dosyalar, ses iletileri… Paylaşılmış bir öge yok + Konum Paylaşılan konum Sıralama Başlangıç zamanı diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index a31037b6226..61138daa261 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -197,6 +197,7 @@ %1$s lời mời Tham gia cuộc Đàm thoại tại %1$s/index.php/call/%2$s \nMật khẩu: %1$s + Thẻ Deck Vị trí Sắp xếp theo Đang tải lên diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5b057619a4e..56460475a3a 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -293,6 +293,7 @@ 加入在 %1$s/index.php/call/%2$s 中的会话 \n密码: %1$s 分享这个位置 + Deck 卡片 位置 共享的位置 排序依据 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 50764442719..17a8f9a696b 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -311,6 +311,7 @@ \n密碼:%1$s 分享此位置 分享項目 + 看板卡片 圖片、檔案、語音訊息 … 沒有已分享的項目 位置 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 449740c2e5d..38b5cfec713 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -221,6 +221,7 @@ 只有特定帳號可以被重新授權 分享連結 分享地點 + 看板卡片 路徑 共享的位置 排序 From d8b4b62fded2419cf425460d297fa04ed91a5860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Thu, 11 Aug 2022 07:33:21 +0200 Subject: [PATCH 105/398] Bump version to 15.0.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim Krüger --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e54b909b324..ad3915a469a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,8 +45,8 @@ android { // mayor.minor.hotfix.increment (for increment: 01-50=Alpha / 51-89=RC / 90-99=stable) // xx .xxx .xx .xx - versionCode 140020006 - versionName "14.2.0 Alpha 06" + versionCode 150000001 + versionName "15.0.0 Alpha 01" flavorDimensions "default" renderscriptTargetApi 19 From ad0bd58a9ea6e2934cfefc8832bfa3827206a321 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Sat, 21 May 2022 00:04:29 +0200 Subject: [PATCH 106/398] Change style to Material 3 Resolves #2076 Signed-off-by: Andy Scherzinger --- app/src/main/res/values/styles.xml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 01118188008..28b5fc4e3cd 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -23,7 +23,7 @@ - - - - - - - - - - - - @@ -263,7 +263,7 @@ 0dp - From d27f0e22225a3f6e5a6ce0567477cdac59260d7b Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Mon, 1 Aug 2022 22:04:40 +0200 Subject: [PATCH 127/398] preoperly theme quoted messages for Material 3 including alignment Signed-off-by: Andy Scherzinger --- .../messages/MagicIncomingTextMessageViewHolder.kt | 14 +++++++++----- .../MagicOutcomingTextMessageViewHolder.kt | 12 +++--------- .../com/nextcloud/talk/ui/theme/ViewThemeUtils.kt | 6 ++++++ app/src/main/res/layout/item_message_quote.xml | 10 ++++++---- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt index e12d67b3f3c..49eae862e75 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt @@ -48,6 +48,8 @@ import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedA import com.nextcloud.talk.databinding.ItemCustomIncomingTextMessageBinding import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback +import com.nextcloud.talk.ui.theme.ServerTheme +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.TextMatchers @@ -64,6 +66,9 @@ class MagicIncomingTextMessageViewHolder(itemView: View, payload: Any) : Message @Inject lateinit var context: Context + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + @Inject lateinit var appPreferences: AppPreferences @@ -181,13 +186,12 @@ class MagicIncomingTextMessageViewHolder(itemView: View, payload: Any) : Message context!!.getText(R.string.nc_nick_guest) else parentChatMessage.actorDisplayName binding.messageQuote.quotedMessage.text = parentChatMessage.text - binding.messageQuote.quotedMessageAuthor - .setTextColor(ContextCompat.getColor(context!!, R.color.textColorMaxContrast)) - if (parentChatMessage.actorId?.equals(message.activeUser!!.userId) == true) { - binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.colorPrimary) + viewThemeUtils.colorPrimaryView(binding.messageQuote.quoteColoredView) } else { - binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.textColorMaxContrast) + binding.messageQuote.quoteColoredView.setBackgroundColor( + ContextCompat.getColor(binding.messageQuote.quoteColoredView.context, R.color.high_emphasis_text) + ) } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt index 738fe1a7e9a..1db56195fbc 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt @@ -30,8 +30,8 @@ import android.text.Spannable import android.text.SpannableString import android.util.TypedValue import android.view.View +import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat -import androidx.core.graphics.ColorUtils import autodagger.AutoInjector import coil.load import com.google.android.flexbox.FlexboxLayout @@ -150,16 +150,10 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName ?: context!!.getText(R.string.nc_nick_guest) binding.messageQuote.quotedMessage.text = parentChatMessage.text - binding.messageQuote.quotedMessage.setTextColor(serverTheme.colorText) - binding.messageQuote.quotedMessageAuthor.setTextColor( - ColorUtils.setAlphaComponent( - serverTheme.colorText, - ALPHA_80_INT - ) + binding.messageQuote.quoteColoredView.setBackgroundColor( + ContextCompat.getColor(binding.messageQuote.quoteColoredView.context, R.color.high_emphasis_text) ) - - binding.messageQuote.quoteColoredView.setBackgroundColor(serverTheme.colorText) } private fun setBubbleOnChatMessage(message: ChatMessage) { diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index eb535048656..432cc4f4c6a 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -195,6 +195,12 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private } } + fun colorPrimaryView(view: View) { + withScheme(view) { scheme -> + view.setBackgroundColor(scheme.primary) + } + } + /** * Colors the background as element color and the foreground as text color. */ diff --git a/app/src/main/res/layout/item_message_quote.xml b/app/src/main/res/layout/item_message_quote.xml index 2144d2a664a..8e28e1cd34d 100644 --- a/app/src/main/res/layout/item_message_quote.xml +++ b/app/src/main/res/layout/item_message_quote.xml @@ -1,4 +1,5 @@ - + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_avatar_document.xml b/app/src/main/res/drawable/ic_avatar_document.xml new file mode 100644 index 00000000000..5488941ab1f --- /dev/null +++ b/app/src/main/res/drawable/ic_avatar_document.xml @@ -0,0 +1,31 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_avatar_group.xml b/app/src/main/res/drawable/ic_avatar_group.xml new file mode 100644 index 00000000000..3dcdb9e9bba --- /dev/null +++ b/app/src/main/res/drawable/ic_avatar_group.xml @@ -0,0 +1,31 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_avatar_link.xml b/app/src/main/res/drawable/ic_avatar_link.xml new file mode 100644 index 00000000000..c4890f82a08 --- /dev/null +++ b/app/src/main/res/drawable/ic_avatar_link.xml @@ -0,0 +1,31 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_avatar_mail.xml b/app/src/main/res/drawable/ic_avatar_mail.xml new file mode 100644 index 00000000000..cbbfce6bf16 --- /dev/null +++ b/app/src/main/res/drawable/ic_avatar_mail.xml @@ -0,0 +1,31 @@ + + + + + From 37d88b7ea5e260fdf4179546edcf3279e6f9721d Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 2 Aug 2022 13:08:11 +0200 Subject: [PATCH 134/398] theme Mentions filter Signed-off-by: Andy Scherzinger --- .../items/MentionAutocompleteItem.java | 103 ++++++++---------- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 2 +- 2 files changed, 45 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.java index f5c8a4c55f4..777908b4926 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.java @@ -32,7 +32,6 @@ import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.interfaces.DraweeController; import com.nextcloud.talk.R; -import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.models.json.mention.Mention; import com.nextcloud.talk.models.json.status.StatusType; @@ -42,7 +41,6 @@ import com.nextcloud.talk.utils.DisplayUtils; import java.util.List; -import java.util.Objects; import java.util.regex.Pattern; import androidx.constraintlayout.widget.ConstraintLayout; @@ -137,35 +135,28 @@ public void bindViewHolder(FlexibleAdapter adapter, FlexibleUtils.highlightText(holder.binding.nameText, displayName, String.valueOf(adapter.getFilter(String.class)), - Objects.requireNonNull(NextcloudTalkApplication - .Companion - .getSharedApplication()) - .getResources().getColor(R.color.colorPrimary)); - if (holder.binding.secondaryText != null) { - FlexibleUtils.highlightText(holder.binding.secondaryText, - "@" + objectId, - String.valueOf(adapter.getFilter(String.class)), - NextcloudTalkApplication.Companion.getSharedApplication() - .getResources().getColor(R.color.colorPrimary)); - } + viewThemeUtils + .getScheme(holder.binding.secondaryText.getContext()) + .getPrimary()); + FlexibleUtils.highlightText(holder.binding.secondaryText, + "@" + objectId, + String.valueOf(adapter.getFilter(String.class)), + viewThemeUtils + .getScheme(holder.binding.secondaryText.getContext()) + .getPrimary()); } else { holder.binding.nameText.setText(displayName); - if (holder.binding.secondaryText != null) { - holder.binding.secondaryText.setText("@" + objectId); - } + holder.binding.secondaryText.setText("@" + objectId); } if (SOURCE_CALLS.equals(source)) { - if (holder.binding.avatarDraweeView != null) { - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - holder.binding.avatarDraweeView.getHierarchy().setPlaceholderImage( - DisplayUtils.getRoundedDrawable( - viewThemeUtils.themePlaceholderAvatar(holder.binding.avatarDraweeView, - R.drawable.ic_avatar_group))); - } else { - holder.binding.avatarDraweeView.setImageResource(R.drawable.ic_circular_group); - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + holder.binding.avatarDraweeView.getHierarchy().setPlaceholderImage( + DisplayUtils.getRoundedDrawable( + viewThemeUtils.themePlaceholderAvatar(holder.binding.avatarDraweeView, + R.drawable.ic_avatar_group))); + } else { + holder.binding.avatarDraweeView.setImageResource(R.drawable.ic_circular_group); } } else { String avatarId = objectId; @@ -180,9 +171,7 @@ public void bindViewHolder(FlexibleAdapter adapter, false); } - if (holder.binding.avatarDraweeView != null) { - holder.binding.avatarDraweeView.setController(null); - } + holder.binding.avatarDraweeView.setController(null); DraweeController draweeController = Fresco.newDraweeControllerBuilder() .setOldController(holder.binding.avatarDraweeView.getController()) @@ -196,39 +185,35 @@ public void bindViewHolder(FlexibleAdapter adapter, } private void drawStatus(ParticipantItem.ParticipantItemViewHolder holder) { - if (holder.binding.conversationInfoStatusMessage != null && - holder.binding.participantStatusEmoji != null && - holder.binding.userStatusImage != null) { - float size = DisplayUtils.convertDpToPixel(STATUS_SIZE_IN_DP, context); - holder.binding.userStatusImage.setImageDrawable(new StatusDrawable( - status, - NO_ICON, - size, - context.getResources().getColor(R.color.bg_default), - context)); + float size = DisplayUtils.convertDpToPixel(STATUS_SIZE_IN_DP, context); + holder.binding.userStatusImage.setImageDrawable(new StatusDrawable( + status, + NO_ICON, + size, + context.getResources().getColor(R.color.bg_default), + context)); + + if (statusMessage != null) { + holder.binding.conversationInfoStatusMessage.setText(statusMessage); + alignUsernameVertical(holder, 0); + } else { + holder.binding.conversationInfoStatusMessage.setText(""); + alignUsernameVertical(holder, 10); + } - if (statusMessage != null) { - holder.binding.conversationInfoStatusMessage.setText(statusMessage); - alignUsernameVertical(holder, 0); - } else { - holder.binding.conversationInfoStatusMessage.setText(""); - alignUsernameVertical(holder, 10); - } + if (statusIcon != null && !statusIcon.isEmpty()) { + holder.binding.participantStatusEmoji.setText(statusIcon); + } else { + holder.binding.participantStatusEmoji.setVisibility(View.GONE); + } - if (statusIcon != null && !statusIcon.isEmpty()) { - holder.binding.participantStatusEmoji.setText(statusIcon); - } else { - holder.binding.participantStatusEmoji.setVisibility(View.GONE); + if (status != null && status.equals(StatusType.DND.getString())) { + if (statusMessage == null || statusMessage.isEmpty()) { + holder.binding.conversationInfoStatusMessage.setText(R.string.dnd); } - - if (status != null && status.equals(StatusType.DND.getString())) { - if (statusMessage == null || statusMessage.isEmpty()) { - holder.binding.conversationInfoStatusMessage.setText(R.string.dnd); - } - } else if (status != null && status.equals(StatusType.AWAY.getString())) { - if (statusMessage == null || statusMessage.isEmpty()) { - holder.binding.conversationInfoStatusMessage.setText(R.string.away); - } + } else if (status != null && status.equals(StatusType.AWAY.getString())) { + if (statusMessage == null || statusMessage.isEmpty()) { + holder.binding.conversationInfoStatusMessage.setText(R.string.away); } } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index ef11077d215..f5240b9b4cc 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -78,7 +78,7 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private /** * Scheme for painting elements */ - private fun getScheme(context: Context): Scheme = when { + fun getScheme(context: Context): Scheme = when { isDarkMode(context) -> theme.darkScheme else -> theme.lightScheme } From 9a2d7ee1ffe27004c500cf4b89de0cb29ba68489 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 2 Aug 2022 13:28:28 +0200 Subject: [PATCH 135/398] extend tab layout theming for text / states and ripple effect Signed-off-by: Andy Scherzinger --- .../talk/ui/dialog/ShowReactionsDialog.kt | 12 +++++++++++- .../com/nextcloud/talk/ui/theme/ViewThemeUtils.kt | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt index 554fc27b714..af89f5ea637 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt @@ -52,12 +52,14 @@ import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.reactions.ReactionsOverall import com.nextcloud.talk.ui.theme.ServerTheme +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers import java.util.Collections +import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) class ShowReactionsDialog( @@ -70,12 +72,19 @@ class ShowReactionsDialog( private val serverTheme: ServerTheme ) : BottomSheetDialog(activity), ReactionItemClickListener { + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private lateinit var binding: DialogMessageReactionsBinding private var adapter: ReactionsAdapter? = null private val tagAll: String? = null + init { + NextcloudTalkApplication.sharedApplication?.componentApplication?.inject(this) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DialogMessageReactionsBinding.inflate(layoutInflater) @@ -98,7 +107,6 @@ class ShowReactionsDialog( adapter?.list?.clear() if (chatMessage.reactions != null && chatMessage.reactions!!.isNotEmpty()) { var reactionsTotal = 0 - binding.emojiReactionsTabs.setSelectedTabIndicatorColor(serverTheme.primaryColor) for ((emoji, amount) in chatMessage.reactions!!) { reactionsTotal = reactionsTotal.plus(amount as Int) val tab: TabLayout.Tab = binding.emojiReactionsTabs.newTab() // Create a new Tab names "First Tab" @@ -139,6 +147,8 @@ class ShowReactionsDialog( } }) + viewThemeUtils.colorTabLayout(binding.emojiReactionsTabs) + updateParticipantsForEmoji(chatMessage, tagAll) } adapter?.notifyDataSetChanged() diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index f5240b9b4cc..6f8ed11b219 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -581,6 +581,21 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private fun colorTabLayout(tabLayout: TabLayout) { withScheme(tabLayout) { scheme -> tabLayout.setSelectedTabIndicatorColor(scheme.primary) + tabLayout.tabTextColors = ColorStateList( + arrayOf( + intArrayOf(android.R.attr.state_selected), + intArrayOf(-android.R.attr.state_selected) + ), + intArrayOf(scheme.primary, ContextCompat.getColor(tabLayout.context, R.color.high_emphasis_text)) + ) + tabLayout.tabRippleColor = ColorStateList( + arrayOf( + intArrayOf(android.R.attr.state_pressed) + ), + intArrayOf( + calculateDisabledColor(scheme.primary, SURFACE_OPACITY_BUTTON_DISABLED) + ) + ) } } From 9eb3cbc2807bbe92e169b29e7dfb74b413619eab Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 2 Aug 2022 16:08:34 +0200 Subject: [PATCH 136/398] proper chip theming for you-mentions Signed-off-by: Andy Scherzinger --- .../MagicIncomingTextMessageViewHolder.kt | 6 ++++-- .../MagicOutcomingTextMessageViewHolder.kt | 3 ++- .../MentionAutocompleteCallback.java | 14 ++++++++++--- .../talk/controllers/ChatController.kt | 3 ++- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 12 +++++++++++ .../nextcloud/talk/utils/DisplayUtils.java | 21 ++++++++++++++++--- 6 files changed, 49 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt index 7fba7d0866d..4df5a1bef73 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt @@ -246,7 +246,8 @@ class MagicIncomingTextMessageViewHolder(itemView: View, payload: Any) : Message individualHashMap["name"]!!, individualHashMap["type"]!!, message.activeUser!!, - R.xml.chip_you + R.xml.chip_you, + viewThemeUtils ) } else { messageStringInternal = DisplayUtils.searchAndReplaceWithMentionSpan( @@ -256,7 +257,8 @@ class MagicIncomingTextMessageViewHolder(itemView: View, payload: Any) : Message individualHashMap["name"]!!, individualHashMap["type"]!!, message.activeUser!!, - R.xml.chip_others + R.xml.chip_others, + viewThemeUtils ) } } else if (individualHashMap["type"] == "file") { diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt index 1db56195fbc..35c444670d6 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt @@ -180,7 +180,8 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage individualHashMap["name"]!!, individualHashMap["type"]!!, message.activeUser, - R.xml.chip_others + R.xml.chip_others, + viewThemeUtils ) } else if (individualHashMap["type"] == "file") { realView.setOnClickListener { v: View? -> diff --git a/app/src/main/java/com/nextcloud/talk/callbacks/MentionAutocompleteCallback.java b/app/src/main/java/com/nextcloud/talk/callbacks/MentionAutocompleteCallback.java index 6c4985c48ae..c121946b194 100644 --- a/app/src/main/java/com/nextcloud/talk/callbacks/MentionAutocompleteCallback.java +++ b/app/src/main/java/com/nextcloud/talk/callbacks/MentionAutocompleteCallback.java @@ -31,6 +31,7 @@ import com.nextcloud.talk.R; import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.models.json.mention.Mention; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.MagicCharPolicy; import com.nextcloud.talk.utils.text.Spans; @@ -39,15 +40,19 @@ import com.vanniktech.emoji.Emojis; public class MentionAutocompleteCallback implements AutocompleteCallback { + private final ViewThemeUtils viewThemeUtils; private Context context; private User conversationUser; private EditText editText; - public MentionAutocompleteCallback(Context context, User conversationUser, - EditText editText) { + public MentionAutocompleteCallback(Context context, + User conversationUser, + EditText editText, + ViewThemeUtils viewThemeUtils) { this.context = context; this.conversationUser = conversationUser; this.editText = editText; + this.viewThemeUtils = viewThemeUtils; } @Override @@ -73,11 +78,14 @@ public boolean onPopupItemClicked(Editable editable, Mention item) { conversationUser, item.getSource(), R.xml.chip_you, - editText), + editText, + viewThemeUtils), BetterImageSpan.ALIGN_CENTER, item.getId(), item.getLabel()); editable.setSpan(mentionChipSpan, start, start + replacementStringBuilder.toString().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); + + return true; } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 1002790ad42..a587c5f0fcb 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -1679,7 +1679,8 @@ class ChatController(args: Bundle) : val callback = MentionAutocompleteCallback( activity, conversationUser!!, - binding.messageInputView.inputEditText + binding.messageInputView.inputEditText, + viewThemeUtils ) if (mentionAutocomplete == null && binding.messageInputView.inputEditText != null) { diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 6f8ed11b219..8c0d3e1e35e 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -56,6 +56,7 @@ import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.chip.Chip +import com.google.android.material.chip.ChipDrawable import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.progressindicator.LinearProgressIndicator import com.google.android.material.tabs.TabLayout @@ -101,6 +102,10 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private block(getScheme(view.context)) } + private fun withScheme(context: Context, block: (Scheme) -> Unit) { + block(getScheme(context)) + } + private fun withSchemeDark(block: (Scheme) -> Unit) { block(getSchemeDark()) } @@ -664,6 +669,13 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private ) } + fun themePrimaryMentionChip(context: Context, chip: ChipDrawable) { + withScheme(context) { scheme -> + chip.chipBackgroundColor = ColorStateList.valueOf(scheme.primary) + chip.setTextColor(scheme.onPrimary) + } + } + companion object { private val THEMEABLE_PLACEHOLDER_IDS = listOf( R.drawable.ic_mimetype_package_x_generic, diff --git a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java index 134d00a8139..a04da2da229 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java @@ -81,6 +81,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.events.UserMentionClickEvent; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.utils.text.Spans; import org.greenrobot.eventbus.EventBus; @@ -297,11 +298,16 @@ public static Drawable getDrawableForMentionChipSpan(Context context, User conversationUser, String type, @XmlRes int chipResource, - @Nullable EditText emojiEditText) { + @Nullable EditText emojiEditText, + ViewThemeUtils viewThemeUtils) { ChipDrawable chip = ChipDrawable.createFromResource(context, chipResource); chip.setText(EmojiCompat.get().process(label)); chip.setEllipsize(TextUtils.TruncateAt.MIDDLE); + if (chipResource == R.xml.chip_you) { + viewThemeUtils.themePrimaryMentionChip(context, chip); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Configuration config = context.getResources().getConfiguration(); chip.setLayoutDirection(config.getLayoutDirection()); @@ -367,7 +373,8 @@ protected void onFailureImpl(DataSource> data public static Spannable searchAndReplaceWithMentionSpan(Context context, Spannable text, String id, String label, String type, User conversationUser, - @XmlRes int chipXmlRes) { + @XmlRes int chipXmlRes, + ViewThemeUtils viewThemeUtils) { Spannable spannableString = new SpannableString(text); String stringText = text.toString(); @@ -395,10 +402,18 @@ public void onClick(@NonNull View widget) { conversationUser, type, chipXmlRes, - null), + null, + viewThemeUtils), BetterImageSpan.ALIGN_CENTER, id, label); spannableString.setSpan(mentionChipSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + if (chipXmlRes == R.xml.chip_you) { + spannableString.setSpan( + new ForegroundColorSpan(viewThemeUtils.getScheme(context).getOnPrimary()), + start, + end, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } if ("user".equals(type) && !conversationUser.getUserId().equals(id)) { spannableString.setSpan(clickableSpan, start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); } From 02e18046cf2024479dc06c9c1c869d80f84eceb2 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 2 Aug 2022 16:21:36 +0200 Subject: [PATCH 137/398] improve outgoing message theming Signed-off-by: Andy Scherzinger --- .../adapters/messages/MagicOutcomingTextMessageViewHolder.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt index 35c444670d6..61d38760290 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt @@ -25,6 +25,7 @@ package com.nextcloud.talk.adapters.messages import android.content.Context import android.content.Intent +import android.graphics.PorterDuff import android.net.Uri import android.text.Spannable import android.text.SpannableString @@ -76,6 +77,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams layoutParams.isWrapBefore = false var textSize = context!!.resources.getDimension(R.dimen.chat_text_size) + binding.messageTime.setTextColor(viewThemeUtils.getScheme(binding.messageText.context).onSurfaceVariant) if (messageParameters != null && messageParameters.size > 0) { messageString = processMessageParameters(messageParameters, message, messageString) } else if (TextMatchers.isMessageWithSingleEmoticonOnly(message.text)) { @@ -91,6 +93,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) binding.messageTime.layoutParams = layoutParams + binding.messageText.setTextColor(viewThemeUtils.getScheme(binding.messageText.context).onSurfaceVariant) binding.messageText.text = messageString // parent message handling @@ -116,6 +119,8 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage readStatusDrawableInt?.let { drawableInt -> ResourcesCompat.getDrawable(context!!.resources, drawableInt, null)?.let { binding.checkMark.setImageDrawable(it) + binding.checkMark.setColorFilter(viewThemeUtils.getScheme(binding.messageText.context) + .onSurfaceVariant, PorterDuff.Mode.SRC_ATOP) } } From b2e21aef7c72f9ed49923b9baa9eafe54357e3d0 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 2 Aug 2022 16:26:57 +0200 Subject: [PATCH 138/398] correct themeing for reactions bottom sheet Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt index af89f5ea637..4cd190b552c 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt @@ -90,6 +90,7 @@ class ShowReactionsDialog( binding = DialogMessageReactionsBinding.inflate(layoutInflater) setContentView(binding.root) window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + viewThemeUtils.themeDialog(binding.root) adapter = ReactionsAdapter(this, user) binding.reactionsList.adapter = adapter binding.reactionsList.layoutManager = LinearLayoutManager(context) @@ -148,6 +149,8 @@ class ShowReactionsDialog( }) viewThemeUtils.colorTabLayout(binding.emojiReactionsTabs) + binding.emojiReactionsTabs.setBackgroundColor( + viewThemeUtils.getScheme(binding.emojiReactionsTabs .context).surface) updateParticipantsForEmoji(chatMessage, tagAll) } From fd49b13b1423be1e1ccaefba9f8edeca6a1606bc Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 2 Aug 2022 16:37:31 +0200 Subject: [PATCH 139/398] theme checked reactions Signed-off-by: Andy Scherzinger --- .../talk/ui/dialog/MessageActionsDialog.kt | 3 +-- .../com/nextcloud/talk/ui/theme/ViewThemeUtils.kt | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt index ebc38c366e6..a968d7c3e9a 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt @@ -31,7 +31,6 @@ import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import androidx.annotation.NonNull -import androidx.appcompat.content.res.AppCompatResources import autodagger.AutoInjector import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog @@ -228,7 +227,7 @@ class MessageActionsDialog( private fun checkAndSetEmojiSelfReaction(emoji: EmojiTextView) { if (emoji.text?.toString() != null && message.reactionsSelf?.contains(emoji.text?.toString()) == true) { - emoji.background = AppCompatResources.getDrawable(context, R.drawable.reaction_self_bottom_sheet_background) + viewThemeUtils.setCheckedBackground(emoji) } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 8c0d3e1e35e..5c5cb6bff32 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -49,6 +49,7 @@ import androidx.appcompat.widget.SearchView.SearchAutoComplete import androidx.appcompat.widget.SwitchCompat import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.ViewCompat import androidx.core.view.children import androidx.swiperefreshlayout.widget.SwipeRefreshLayout @@ -67,6 +68,7 @@ import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.DrawableUtils import com.nextcloud.talk.utils.ui.ColorUtil import com.nextcloud.talk.utils.ui.PlatformThemeUtil.isDarkMode +import com.vanniktech.emoji.EmojiTextView import com.yarolegovich.mp.MaterialPreferenceCategory import com.yarolegovich.mp.MaterialSwitchPreference import scheme.Scheme @@ -676,6 +678,18 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private } } + fun setCheckedBackground(emoji: EmojiTextView) { + withScheme(emoji) { scheme -> + val drawable = AppCompatResources + .getDrawable(emoji.context, R.drawable.reaction_self_bottom_sheet_background)!! + .mutate() + DrawableCompat.setTintList( + drawable, + ColorStateList.valueOf(scheme.primary)) + emoji.background = drawable + } + } + companion object { private val THEMEABLE_PLACEHOLDER_IDS = listOf( R.drawable.ic_mimetype_package_x_generic, From 4c9f5bec2ecc40de55130226f4f0cceda8938d75 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 3 Aug 2022 21:38:10 +0200 Subject: [PATCH 140/398] proper material 3 reactions theming Signed-off-by: Andy Scherzinger --- .../IncomingLocationMessageViewHolder.kt | 8 ++- .../messages/IncomingPollMessageViewHolder.kt | 8 ++- .../IncomingVoiceMessageViewHolder.kt | 8 ++- .../MagicIncomingTextMessageViewHolder.kt | 8 ++- .../MagicOutcomingTextMessageViewHolder.kt | 2 +- .../MagicPreviewMessageViewHolder.java | 10 +++- .../OutcomingLocationMessageViewHolder.kt | 8 ++- .../OutcomingPollMessageViewHolder.kt | 8 ++- .../OutcomingVoiceMessageViewHolder.kt | 8 ++- .../talk/adapters/messages/Reaction.kt | 50 ++++++++++++------- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 13 +++++ .../res/drawable/reaction_self_background.xml | 4 +- 12 files changed, 106 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt index 78047193c00..1febe1bed25 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt @@ -102,7 +102,13 @@ class IncomingLocationMessageViewHolder(incomingView: View, payload: Any) : Mess // geo-location setLocationDataOnMessageItem(message) - Reaction().showReactions(message, binding.reactions, binding.messageText.context, false) + Reaction().showReactions( + message, + binding.reactions, + binding.messageText.context, + false, + viewThemeUtils + ) binding.reactions.reactionsEmojiWrapper.setOnClickListener { reactionsInterface.onClickReactions(message) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt index b50575a9373..66d296b3ebd 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt @@ -88,7 +88,13 @@ class IncomingPollMessageViewHolder(incomingView: View, payload: Any) : MessageH setPollPreview(message) - Reaction().showReactions(message, binding.reactions, binding.messageTime.context, false) + Reaction().showReactions( + message, + binding.reactions, + binding.messageTime.context, + false, + viewThemeUtils + ) binding.reactions.reactionsEmojiWrapper.setOnClickListener { reactionsInterface.onClickReactions(message) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt index 1955859e73d..3088d4b39bb 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt @@ -145,7 +145,13 @@ class IncomingVoiceMessageViewHolder(incomingView: View, payload: Any) : Message } }) - Reaction().showReactions(message, binding.reactions, binding.messageTime.context, false) + Reaction().showReactions( + message, + binding.reactions, + binding.messageTime.context, + false, + viewThemeUtils + ) binding.reactions.reactionsEmojiWrapper.setOnClickListener { reactionsInterface.onClickReactions(message) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt index 4df5a1bef73..c94127b2d2f 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt @@ -122,7 +122,13 @@ class MagicIncomingTextMessageViewHolder(itemView: View, payload: Any) : Message itemView.setTag(MessageSwipeCallback.REPLYABLE_VIEW_TAG, message.replyable) - Reaction().showReactions(message, binding.reactions, binding.messageText.context, false) + Reaction().showReactions( + message, + binding.reactions, + binding.messageText.context, + false, + viewThemeUtils + ) binding.reactions.reactionsEmojiWrapper.setOnClickListener { reactionsInterface.onClickReactions(message) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt index 61d38760290..fc9611b3392 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt @@ -128,7 +128,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage itemView.setTag(MessageSwipeCallback.REPLYABLE_VIEW_TAG, message.replyable) - Reaction().showReactions(message, binding.reactions, context!!, true) + Reaction().showReactions(message, binding.reactions, context, true, viewThemeUtils) binding.reactions.reactionsEmojiWrapper.setOnClickListener { reactionsInterface.onClickReactions(message) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java index e6c5a7d2337..d10532a650a 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java @@ -51,6 +51,7 @@ import com.nextcloud.talk.databinding.ReactionsInsideMessageBinding; import com.nextcloud.talk.models.json.chat.ChatMessage; import com.nextcloud.talk.ui.theme.ServerTheme; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.DrawableUtils; import com.nextcloud.talk.utils.FileViewerUtils; @@ -96,6 +97,9 @@ public abstract class MagicPreviewMessageViewHolder extends MessageHolders.Incom @Inject ServerTheme serverTheme; + @Inject + ViewThemeUtils viewThemeUtils; + @Inject OkHttpClient okHttpClient; @@ -239,7 +243,11 @@ public void onBind(ChatMessage message) { itemView.setTag(REPLYABLE_VIEW_TAG, message.getReplyable()); reactionsBinding = getReactionsBinding(); - new Reaction().showReactions(message, reactionsBinding, getMessageText().getContext(), true); + new Reaction().showReactions(message, + reactionsBinding, + getMessageText().getContext(), + true, + viewThemeUtils); reactionsBinding.reactionsEmojiWrapper.setOnClickListener(l -> { reactionsInterface.onClickReactions(message); }); diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt index 4d42e6df347..84118d37709 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt @@ -120,7 +120,13 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders // geo-location setLocationDataOnMessageItem(message) - Reaction().showReactions(message, binding.reactions, binding.messageText.context, true) + Reaction().showReactions( + message, + binding.reactions, + binding.messageText.context, + true, + viewThemeUtils + ) binding.reactions.reactionsEmojiWrapper.setOnClickListener { reactionsInterface.onClickReactions(message) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt index 883241bc207..936c73342e7 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt @@ -106,7 +106,13 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag setPollPreview(message) - Reaction().showReactions(message, binding.reactions, binding.messageTime.context, true) + Reaction().showReactions( + message, + binding.reactions, + binding.messageTime.context, + true, + viewThemeUtils + ) binding.reactions.reactionsEmojiWrapper.setOnClickListener { reactionsInterface.onClickReactions(message) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt index 1247135e948..c011efce401 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt @@ -137,7 +137,13 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders binding.checkMark.setContentDescription(readStatusContentDescriptionString) - Reaction().showReactions(message, binding.reactions, binding.messageTime.context, true) + Reaction().showReactions( + message, + binding.reactions, + binding.messageTime.context, + true, + viewThemeUtils + ) binding.reactions.reactionsEmojiWrapper.setOnClickListener { reactionsInterface.onClickReactions(message) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/Reaction.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/Reaction.kt index 08ae5d8684d..1eff0dae00c 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/Reaction.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/Reaction.kt @@ -27,11 +27,11 @@ import android.content.Context import android.view.ViewGroup import android.widget.LinearLayout import android.widget.TextView -import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.ContextCompat import com.nextcloud.talk.R import com.nextcloud.talk.databinding.ReactionsInsideMessageBinding import com.nextcloud.talk.models.json.chat.ChatMessage +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.DisplayUtils import com.vanniktech.emoji.EmojiTextView @@ -41,7 +41,8 @@ class Reaction { message: ChatMessage, binding: ReactionsInsideMessageBinding, context: Context, - isOutgoingMessage: Boolean + isOutgoingMessage: Boolean, + viewThemeUtils: ViewThemeUtils ) { binding.reactionsEmojiWrapper.removeAllViews() if (message.reactions != null && message.reactions!!.isNotEmpty()) { @@ -49,7 +50,6 @@ class Reaction { var remainingEmojisToDisplay = MAX_EMOJIS_TO_DISPLAY val showInfoAboutMoreEmojis = message.reactions!!.size > MAX_EMOJIS_TO_DISPLAY - val textColor = getTextColor(context, isOutgoingMessage, binding) val amountParams = getAmountLayoutParams(context) val wrapperParams = getWrapperLayoutParams(context) @@ -58,9 +58,12 @@ class Reaction { val paddingBottom = DisplayUtils.convertDpToPixel(WRAPPER_PADDING_BOTTOM, context).toInt() for ((emoji, amount) in message.reactions!!) { + val isSelfReaction = message.reactionsSelf != null && + message.reactionsSelf!!.isNotEmpty() && + message.reactionsSelf!!.contains(emoji) + val textColor = getTextColor(isOutgoingMessage, isSelfReaction, binding, viewThemeUtils) val emojiWithAmountWrapper = getEmojiWithAmountWrapperLayout( - context, - message, + binding.reactionsEmojiWrapper.context, emoji, amount, EmojiWithAmountWrapperLayoutInfo( @@ -69,7 +72,10 @@ class Reaction { wrapperParams, paddingSide, paddingTop, - paddingBottom + paddingBottom, + viewThemeUtils, + isOutgoingMessage, + isSelfReaction ), ) @@ -86,7 +92,6 @@ class Reaction { private fun getEmojiWithAmountWrapperLayout( context: Context, - message: ChatMessage, emoji: String, amount: Int, layoutInfo: EmojiWithAmountWrapperLayoutInfo @@ -98,12 +103,17 @@ class Reaction { emojiWithAmountWrapper.addView(getReactionCount(context, layoutInfo.textColor, amount, layoutInfo.amountParams)) emojiWithAmountWrapper.layoutParams = layoutInfo.wrapperParams - if (message.reactionsSelf != null && - message.reactionsSelf!!.isNotEmpty() && - message.reactionsSelf!!.contains(emoji) - ) { - emojiWithAmountWrapper.background = - AppCompatResources.getDrawable(context, R.drawable.reaction_self_background) + if (layoutInfo.isSelfReaction) { + val color = if (layoutInfo.isOutgoingMessage) { + ContextCompat.getColor( + emojiWithAmountWrapper.context, + R.color.bg_message_list_incoming_bubble + ) + } else { + layoutInfo.viewThemeUtils.getScheme(emojiWithAmountWrapper.context).primaryContainer + } + layoutInfo.viewThemeUtils.setCheckedBackground(emojiWithAmountWrapper, color) + emojiWithAmountWrapper.setPaddingRelative( layoutInfo.paddingSide, layoutInfo.paddingTop, @@ -166,12 +176,13 @@ class Reaction { } private fun getTextColor( - context: Context, isOutgoingMessage: Boolean, - binding: ReactionsInsideMessageBinding + isSelfReaction: Boolean, + binding: ReactionsInsideMessageBinding, + viewThemeUtils: ViewThemeUtils ): Int { - var textColor = ContextCompat.getColor(context, R.color.white) - if (!isOutgoingMessage) { + var textColor = viewThemeUtils.getScheme(binding.root.context).onSurfaceVariant + if (!isOutgoingMessage || isSelfReaction) { textColor = ContextCompat.getColor(binding.root.context, R.color.high_emphasis_text) } return textColor @@ -183,7 +194,10 @@ class Reaction { val wrapperParams: LinearLayout.LayoutParams, val paddingSide: Int, val paddingTop: Int, - val paddingBottom: Int + val paddingBottom: Int, + val viewThemeUtils: ViewThemeUtils, + val isOutgoingMessage: Boolean, + val isSelfReaction: Boolean ) companion object { diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 5c5cb6bff32..59b25f18ef0 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -690,6 +690,19 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private } } + fun setCheckedBackground(linearLayout: LinearLayout, @ColorInt backgroundColor: Int) { + withScheme(linearLayout) { scheme -> + val drawable = AppCompatResources + .getDrawable(linearLayout.context, R.drawable.reaction_self_background)!! + .mutate() + DrawableCompat.setTintList( + drawable, + ColorStateList.valueOf(backgroundColor) + ) + linearLayout.background = drawable + } + } + companion object { private val THEMEABLE_PLACEHOLDER_IDS = listOf( R.drawable.ic_mimetype_package_x_generic, diff --git a/app/src/main/res/drawable/reaction_self_background.xml b/app/src/main/res/drawable/reaction_self_background.xml index 3310cf25af9..deaea7a6fcf 100644 --- a/app/src/main/res/drawable/reaction_self_background.xml +++ b/app/src/main/res/drawable/reaction_self_background.xml @@ -21,10 +21,10 @@ + android:color="@color/high_emphasis_text" /> + android:color="#FFFFFF" /> Date: Wed, 3 Aug 2022 21:39:20 +0200 Subject: [PATCH 141/398] unread chip style now material3 (while not typical chip coloring) Signed-off-by: Andy Scherzinger --- app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 59b25f18ef0..383ce9ae420 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -621,7 +621,7 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private fun colorChipBackground(chip: Chip) { withScheme(chip) { scheme -> chip.chipBackgroundColor = ColorStateList.valueOf(scheme.primary) - chip.setTextColor(theme.colorText) + chip.setTextColor(scheme.onPrimary) } } From cb44a707a9ea7c4b1a007888bba9e332b9581d32 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 3 Aug 2022 21:47:40 +0200 Subject: [PATCH 142/398] fix status icon background tint to match dialog background color (surface) Signed-off-by: Andy Scherzinger --- .../nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java index fff6d61b658..1317b0bfbc3 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java @@ -312,7 +312,7 @@ private void drawStatus() { status.getStatus(), status.getIcon(), size, - getContext().getResources().getColor(R.color.dialog_background), + viewThemeUtils.getScheme(binding.currentAccount.ticker.getContext()).getSurface(), getContext())); binding.currentAccount.ticker.setVisibility(View.VISIBLE); From 1d776ed6bd384e039a8ea2ff212a11ec5f73af44 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 3 Aug 2022 22:11:28 +0200 Subject: [PATCH 143/398] tint dialog menu items based onSurface Signed-off-by: Andy Scherzinger --- .../talk/ui/dialog/ChooseAccountDialogFragment.java | 4 +++- .../com/nextcloud/talk/ui/theme/ViewThemeUtils.kt | 7 +++++++ app/src/main/res/layout/dialog_choose_account.xml | 12 ++++++------ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java index 1317b0bfbc3..24bea279cbb 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java @@ -39,7 +39,6 @@ import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.interfaces.DraweeController; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.nextcloud.talk.R; import com.nextcloud.talk.activities.MainActivity; import com.nextcloud.talk.adapters.items.AdvancedUserItem; import com.nextcloud.talk.api.NcApi; @@ -118,8 +117,11 @@ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { viewThemeUtils.themeDialogDivider(binding.divider); viewThemeUtils.colorMaterialTextButton(binding.setStatus); + viewThemeUtils.colorDialogMenuText(binding.setStatus); viewThemeUtils.colorMaterialTextButton(binding.addAccount); + viewThemeUtils.colorDialogMenuText(binding.addAccount); viewThemeUtils.colorMaterialTextButton(binding.manageSettings); + viewThemeUtils.colorDialogMenuText(binding.manageSettings); // Defining user picture binding.currentAccount.userIcon.setTag(""); diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 383ce9ae420..ddab140be36 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -703,6 +703,13 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private } } + fun colorDialogMenuText(button: MaterialButton) { + withScheme(button) { scheme -> + button.setTextColor(scheme.onSurface) + button.iconTint = ColorStateList.valueOf(scheme.onSurface) + } + } + companion object { private val THEMEABLE_PLACEHOLDER_IDS = listOf( R.drawable.ic_mimetype_package_x_generic, diff --git a/app/src/main/res/layout/dialog_choose_account.xml b/app/src/main/res/layout/dialog_choose_account.xml index 02b4adb4eaf..6869e533d16 100644 --- a/app/src/main/res/layout/dialog_choose_account.xml +++ b/app/src/main/res/layout/dialog_choose_account.xml @@ -56,12 +56,12 @@ android:text="@string/set_status" android:textAlignment="textStart" android:textAllCaps="false" - android:textColor="@color/fontAppbar" + android:textColor="@color/high_emphasis_text" android:enabled="false" app:icon="@drawable/ic_edit" app:iconGravity="start" app:iconPadding="22dp" - app:iconTint="@color/fontAppbar" /> + app:iconTint="@color/high_emphasis_text" /> @@ -121,11 +121,11 @@ android:text="@string/nc_settings" android:textAlignment="textStart" android:textAllCaps="false" - android:textColor="@color/fontAppbar" + android:textColor="@color/high_emphasis_text" app:icon="@drawable/ic_settings" app:iconGravity="start" app:iconPadding="22dp" - app:iconTint="@color/fontAppbar" + app:iconTint="@color/high_emphasis_text" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> From 365a7502b442d35e62ed326786adfbccb44538c0 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 3 Aug 2022 22:56:28 +0200 Subject: [PATCH 144/398] unify tab layout theming on surface Signed-off-by: Andy Scherzinger --- .../activities/RemoteFileBrowserActivity.kt | 17 +++++--- .../activities/SharedItemsActivity.kt | 2 + .../talk/ui/dialog/ShowReactionsDialog.kt | 4 +- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 39 +++++++++++-------- 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt index da0d78049b3..6dabd356754 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt @@ -24,6 +24,7 @@ package com.nextcloud.talk.remotefilebrowser.activities import android.app.Activity import android.content.Intent +import android.content.res.ColorStateList import android.os.Bundle import android.util.Log import android.view.Menu @@ -74,14 +75,18 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe binding = ActivityRemoteFileBrowserBinding.inflate(layoutInflater) setSupportActionBar(binding.remoteFileBrowserItemsToolbar) + viewThemeUtils.themeToolbar(binding.remoteFileBrowserItemsToolbar) + val scheme = viewThemeUtils.getScheme(binding.sortListButtonGroup.context) + binding.sortListButtonGroup.setBackgroundColor(scheme.surface) + binding.sortButton.iconTint = ColorStateList.valueOf(scheme.onSurface) + binding.sortButton.setTextColor(scheme.onSurface) + viewThemeUtils.colorMaterialTextButton(binding.sortButton) + binding.pathNavigationBackButton.iconTint = ColorStateList.valueOf(scheme.onSurface) + binding.pathNavigationBackButton.setTextColor(scheme.onSurface) + viewThemeUtils.colorMaterialTextButton(binding.pathNavigationBackButton) + viewThemeUtils.themeStatusBar(this, binding.remoteFileBrowserItemsToolbar) setContentView(binding.root) - DisplayUtils.applyColorToStatusBar( - this, - ResourcesCompat.getColor( - resources, R.color.appbar, null - ) - ) DisplayUtils.applyColorToNavigationBar( this.window, ResourcesCompat.getColor(resources, R.color.bg_default, null) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt index 29b722a9b1c..05133ab2f95 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/shareditems/activities/SharedItemsActivity.kt @@ -74,6 +74,8 @@ class SharedItemsActivity : AppCompatActivity() { setContentView(binding.root) viewThemeUtils.themeStatusBar(this, binding.sharedItemsToolbar) + viewThemeUtils.themeToolbar(binding.sharedItemsToolbar) + viewThemeUtils.themeTabLayoutOnSurface(binding.sharedItemsTabs) DisplayUtils.applyColorToNavigationBar( this.window, diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt index 4cd190b552c..4fc04097adb 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ShowReactionsDialog.kt @@ -148,9 +148,7 @@ class ShowReactionsDialog( } }) - viewThemeUtils.colorTabLayout(binding.emojiReactionsTabs) - binding.emojiReactionsTabs.setBackgroundColor( - viewThemeUtils.getScheme(binding.emojiReactionsTabs .context).surface) + viewThemeUtils.themeTabLayoutOnSurface(binding.emojiReactionsTabs) updateParticipantsForEmoji(chatMessage, tagAll) } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index ddab140be36..6139777fd8e 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -585,27 +585,32 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private } } - fun colorTabLayout(tabLayout: TabLayout) { + fun themeTabLayoutOnSurface(tabLayout: TabLayout) { withScheme(tabLayout) { scheme -> - tabLayout.setSelectedTabIndicatorColor(scheme.primary) - tabLayout.tabTextColors = ColorStateList( - arrayOf( - intArrayOf(android.R.attr.state_selected), - intArrayOf(-android.R.attr.state_selected) - ), - intArrayOf(scheme.primary, ContextCompat.getColor(tabLayout.context, R.color.high_emphasis_text)) - ) - tabLayout.tabRippleColor = ColorStateList( - arrayOf( - intArrayOf(android.R.attr.state_pressed) - ), - intArrayOf( - calculateDisabledColor(scheme.primary, SURFACE_OPACITY_BUTTON_DISABLED) - ) - ) + tabLayout.setBackgroundColor(scheme.surface) + colorTabLayout(tabLayout, scheme) } } + fun colorTabLayout(tabLayout: TabLayout, scheme: Scheme) { + tabLayout.setSelectedTabIndicatorColor(scheme.primary) + tabLayout.tabTextColors = ColorStateList( + arrayOf( + intArrayOf(android.R.attr.state_selected), + intArrayOf(-android.R.attr.state_selected) + ), + intArrayOf(scheme.primary, ContextCompat.getColor(tabLayout.context, R.color.high_emphasis_text)) + ) + tabLayout.tabRippleColor = ColorStateList( + arrayOf( + intArrayOf(android.R.attr.state_pressed) + ), + intArrayOf( + calculateDisabledColor(scheme.primary, SURFACE_OPACITY_BUTTON_DISABLED) + ) + ) + } + fun getPlaceholderImage(context: Context, mimetype: String?): Drawable? { val drawableResourceId = DrawableUtils.getDrawableResourceIdForMimeType(mimetype) val drawable = AppCompatResources.getDrawable( From fa82641f31e048a29b6e01bc4cc876f26dfcd55b Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 3 Aug 2022 23:44:59 +0200 Subject: [PATCH 145/398] theme toolbar icons including overflow icon and search field Signed-off-by: Andy Scherzinger --- .../nextcloud/talk/controllers/ChatController.kt | 10 ++++++++++ .../talk/controllers/ContactsController.kt | 9 +++++++++ .../talk/controllers/base/NewBaseController.kt | 1 + .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 16 +++++++++++++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index a587c5f0fcb..852369bf725 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -2486,6 +2486,16 @@ class ChatController(args: Bundle) : super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.menu_conversation, menu) + viewThemeUtils.colorToolbarMenuIcon( + binding.messageInputView.context, + menu.findItem(R.id.conversation_voice_call) + ) + + viewThemeUtils.colorToolbarMenuIcon( + binding.messageInputView.context, + menu.findItem(R.id.conversation_video_call) + ) + if (conversationUser?.userId == "?") { menu.removeItem(R.id.conversation_info) } else { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt index 70392625363..2bafd34863c 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt @@ -334,6 +334,7 @@ class ContactsController(args: Bundle) : val searchManager: SearchManager? = activity?.getSystemService(Context.SEARCH_SERVICE) as SearchManager? if (searchItem != null) { searchView = MenuItemCompat.getActionView(searchItem) as SearchView + viewThemeUtils.themeSearchView(searchView!!) searchView!!.maxWidth = Int.MAX_VALUE searchView!!.inputType = InputType.TYPE_TEXT_VARIATION_FILTER var imeOptions: Int = EditorInfo.IME_ACTION_DONE or EditorInfo.IME_FLAG_NO_FULLSCREEN @@ -377,6 +378,14 @@ class ContactsController(args: Bundle) : override fun onPrepareOptionsMenu(menu: Menu) { super.onPrepareOptionsMenu(menu) + + if (searchItem != null) { + viewThemeUtils.colorToolbarMenuIcon( + binding.titleTextView.context, + searchItem!! + ) + } + checkAndHandleDoneMenuItem() if (adapter?.hasFilter() == true) { searchItem!!.expandActionView() diff --git a/app/src/main/java/com/nextcloud/talk/controllers/base/NewBaseController.kt b/app/src/main/java/com/nextcloud/talk/controllers/base/NewBaseController.kt index 2bfd5f869ed..065c3b078fe 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/base/NewBaseController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/base/NewBaseController.kt @@ -188,6 +188,7 @@ abstract class NewBaseController(@LayoutRes var layoutRes: Int, args: Bundle? = val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams binding.searchToolbar.visibility = View.GONE binding.toolbar.visibility = View.VISIBLE + viewThemeUtils.colorToolbarOverflowIcon(binding.toolbar) layoutParams.scrollFlags = 0 binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator( binding.appBar.context, diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 6139777fd8e..29a5065eb7d 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -30,6 +30,7 @@ import android.graphics.PorterDuff import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import android.os.Build +import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.CheckBox @@ -120,6 +121,18 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private } } + fun colorToolbarMenuIcon(context: Context, item: MenuItem) { + withScheme(context) { scheme -> + item.icon.setColorFilter(scheme.onSurface, PorterDuff.Mode.SRC_ATOP) + } + } + + fun colorToolbarOverflowIcon(toolbar: MaterialToolbar) { + withScheme(toolbar) { scheme -> + toolbar.overflowIcon?.setColorFilter(scheme.onSurface, PorterDuff.Mode.SRC_ATOP) + } + } + fun themeSearchView(searchView: SearchView) { withScheme(searchView) { scheme -> // hacky as no default way is provided @@ -690,7 +703,8 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private .mutate() DrawableCompat.setTintList( drawable, - ColorStateList.valueOf(scheme.primary)) + ColorStateList.valueOf(scheme.primary) + ) emoji.background = drawable } } From 8c266fe229829ae2ea57a7dcc2d273f7e6fce017 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Wed, 3 Aug 2022 23:45:13 +0200 Subject: [PATCH 146/398] reformat kotlin code Signed-off-by: Andy Scherzinger --- .../adapters/messages/MagicOutcomingTextMessageViewHolder.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt index fc9611b3392..4ba094c25ca 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt @@ -119,8 +119,9 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage readStatusDrawableInt?.let { drawableInt -> ResourcesCompat.getDrawable(context!!.resources, drawableInt, null)?.let { binding.checkMark.setImageDrawable(it) - binding.checkMark.setColorFilter(viewThemeUtils.getScheme(binding.messageText.context) - .onSurfaceVariant, PorterDuff.Mode.SRC_ATOP) + binding.checkMark.setColorFilter( + viewThemeUtils.getScheme(binding.messageText.context).onSurfaceVariant, PorterDuff.Mode.SRC_ATOP + ) } } From 34d6da68a1d25943bf2215f976fb5f27d4917c6d Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 4 Aug 2022 14:22:42 +0200 Subject: [PATCH 147/398] properly theme adapter filter highlighting Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/activities/BaseActivity.kt | 6 +++++- .../talk/adapters/items/AdvancedUserItem.java | 12 ++++++++---- .../nextcloud/talk/adapters/items/ContactItem.java | 10 +++------- .../talk/adapters/items/ParticipantItem.java | 8 +++----- .../talk/controllers/SwitchAccountController.kt | 4 ++-- .../talk/messagesearch/MessageSearchActivity.kt | 3 --- .../talk/ui/dialog/ChooseAccountDialogFragment.java | 2 +- 7 files changed, 22 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt index 7a36c608afd..9bf4fce5e0f 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt @@ -32,6 +32,7 @@ import autodagger.AutoInjector import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.events.CertificateEvent +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.SecurityUtils import com.nextcloud.talk.utils.preferences.AppPreferences import com.nextcloud.talk.utils.ssl.MagicTrustManager @@ -53,6 +54,9 @@ open class BaseActivity : AppCompatActivity() { @Inject lateinit var appPreferences: AppPreferences + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + @Inject lateinit var context: Context @@ -113,7 +117,7 @@ open class BaseActivity : AppCompatActivity() { LovelyStandardDialog(this) .setTopColorRes(R.color.nc_darkRed) .setNegativeButtonColorRes(R.color.nc_darkRed) - .setPositiveButtonColorRes(R.color.colorPrimary) + .setPositiveButtonColor(viewThemeUtils.getScheme(this).primary) .setIcon(R.drawable.ic_security_white_24dp) .setTitle(R.string.nc_certificate_dialog_title) .setMessage(dialogText) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java index a7b49be04fe..cf6e084becb 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java @@ -34,6 +34,7 @@ import com.nextcloud.talk.data.user.model.User; import com.nextcloud.talk.databinding.AccountItemBinding; import com.nextcloud.talk.models.json.participants.Participant; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.DisplayUtils; @@ -54,11 +55,16 @@ public class AdvancedUserItem extends AbstractFlexibleItem Date: Thu, 4 Aug 2022 14:35:37 +0200 Subject: [PATCH 148/398] Theme info messages primary color Signed-off-by: Andy Scherzinger --- .../nextcloud/talk/controllers/SettingsController.kt | 12 +++++++++--- .../com/nextcloud/talk/jobs/NotificationWorker.java | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt index f031b283eb2..c5d0f1a9933 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.kt @@ -562,7 +562,9 @@ class SettingsController : NewBaseController(R.layout.controller_settings) { if (ApplicationWideMessageHolder.getInstance().messageType != null) { when (ApplicationWideMessageHolder.getInstance().messageType) { ApplicationWideMessageHolder.MessageType.ACCOUNT_UPDATED_NOT_ADDED -> { - binding.messageText.setTextColor(resources!!.getColor(R.color.colorPrimary)) + binding.messageText.setTextColor( + viewThemeUtils.getScheme(binding.messageText.context).primary + ) binding.messageText.text = resources!!.getString(R.string.nc_settings_account_updated) binding.messageView.visibility = View.VISIBLE } @@ -571,13 +573,17 @@ class SettingsController : NewBaseController(R.layout.controller_settings) { binding.messageText.setTextColor(resources!!.getColor(R.color.nc_darkRed)) binding.messageText.text = resources!!.getString(R.string.nc_settings_wrong_account) binding.messageView.visibility = View.VISIBLE - binding.messageText.setTextColor(resources!!.getColor(R.color.colorPrimary)) + binding.messageText.setTextColor( + viewThemeUtils.getScheme(binding.messageText.context).primary + ) binding.messageText.text = resources!!.getString(R.string.nc_Server_account_imported) binding.messageView.visibility = View.VISIBLE } ApplicationWideMessageHolder.MessageType.ACCOUNT_WAS_IMPORTED -> { - binding.messageText.setTextColor(resources!!.getColor(R.color.colorPrimary)) + binding.messageText.setTextColor( + viewThemeUtils.getScheme(binding.messageText.context).primary + ) binding.messageText.text = resources!!.getString(R.string.nc_Server_account_imported) binding.messageView.visibility = View.VISIBLE } diff --git a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java index 24c1a5b31fb..7bcaef1e60d 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.java @@ -346,6 +346,7 @@ private void showNotification(Intent intent) { if (Build.VERSION.SDK_INT >= 23) { // This method should exist since API 21, but some phones don't have it // So as a safeguard, we don't use it until 23 + notificationBuilder.setColor(context.getResources().getColor(R.color.colorPrimary)); } From 006c893318f083d35f65f690faa9ab321ac7388e Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 4 Aug 2022 14:36:03 +0200 Subject: [PATCH 149/398] Theme call spotlight based on server theme / material 3 Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/activities/CallActivity.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index e1ae1a25e47..eca9367dbf9 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -880,12 +880,13 @@ public void onMicrophoneClick() { if (EffortlessPermissions.hasPermissions(this, PERMISSIONS_MICROPHONE)) { if (!appPreferences.getPushToTalkIntroShown()) { + int primary = viewThemeUtils.getScheme(binding.audioOutputButton.getContext()).getPrimary(); spotlightView = new SpotlightView.Builder(this) .introAnimationDuration(300) .enableRevealAnimation(true) .performClick(false) .fadeinTextDuration(400) - .headingTvColor(getResources().getColor(R.color.colorPrimary)) + .headingTvColor(primary) .headingTvSize(20) .headingTvText(getResources().getString(R.string.nc_push_to_talk)) .subHeadingTvColor(getResources().getColor(R.color.bg_default)) @@ -894,7 +895,7 @@ public void onMicrophoneClick() { .maskColor(Color.parseColor("#dc000000")) .target(binding.microphoneButton) .lineAnimDuration(400) - .lineAndArcColor(getResources().getColor(R.color.colorPrimary)) + .lineAndArcColor(primary) .enableDismissAfterShown(true) .dismissOnBackPress(true) .usageId("pushToTalk") From 2e8ea52e89dd0b67972a2a02d356b8d3012e3be4 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 4 Aug 2022 18:14:30 +0200 Subject: [PATCH 150/398] further optimize material coloring for messages, especially time, quotes and read status Signed-off-by: Andy Scherzinger --- .../IncomingLocationMessageViewHolder.kt | 3 +- .../messages/IncomingPollMessageViewHolder.kt | 3 +- .../IncomingPreviewMessageViewHolder.java | 13 +++++++++ .../IncomingVoiceMessageViewHolder.kt | 3 +- .../MagicIncomingTextMessageViewHolder.kt | 29 +------------------ .../MagicOutcomingTextMessageViewHolder.kt | 18 +++++------- .../MagicPreviewMessageViewHolder.java | 3 +- .../OutcomingLocationMessageViewHolder.kt | 6 ++++ .../OutcomingPollMessageViewHolder.kt | 6 ++++ .../OutcomingPreviewMessageViewHolder.java | 14 +++++++++ .../OutcomingVoiceMessageViewHolder.kt | 6 ++++ app/src/main/res/layout/controller_chat.xml | 1 + .../item_custom_incoming_location_message.xml | 3 +- .../item_custom_incoming_poll_message.xml | 3 +- .../item_custom_incoming_preview_message.xml | 8 +++-- .../item_custom_incoming_text_message.xml | 6 ++-- .../item_custom_incoming_voice_message.xml | 3 +- ...item_custom_outcoming_location_message.xml | 3 +- .../item_custom_outcoming_poll_message.xml | 3 +- .../item_custom_outcoming_preview_message.xml | 8 +++-- .../item_custom_outcoming_text_message.xml | 2 +- .../item_custom_outcoming_voice_message.xml | 3 +- .../main/res/layout/item_message_quote.xml | 3 +- app/src/main/res/values-night/colors.xml | 1 + app/src/main/res/values/colors.xml | 1 + 25 files changed, 90 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt index 1febe1bed25..78e59fd35ae 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt @@ -90,7 +90,6 @@ class IncomingLocationMessageViewHolder(incomingView: View, payload: Any) : Mess colorizeMessageBubble(message) itemView.isSelected = false - binding.messageTime.setTextColor(context?.resources!!.getColor(R.color.warm_grey_four)) val textSize = context?.resources!!.getDimension(R.dimen.chat_text_size) binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) @@ -188,7 +187,7 @@ class IncomingLocationMessageViewHolder(incomingView: View, payload: Any) : Mess .setTextColor(context!!.resources.getColor(R.color.textColorMaxContrast)) if (parentChatMessage.actorId?.equals(message.activeUser!!.userId) == true) { - binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.colorPrimary) + viewThemeUtils.colorPrimaryView(binding.messageQuote.quoteColoredView) } else { binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.textColorMaxContrast) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt index 66d296b3ebd..b92a5d21f9b 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt @@ -81,7 +81,6 @@ class IncomingPollMessageViewHolder(incomingView: View, payload: Any) : MessageH colorizeMessageBubble(message) itemView.isSelected = false - binding.messageTime.setTextColor(ResourcesCompat.getColor(context?.resources!!, R.color.warm_grey_four, null)) // parent message handling setParentMessageDataOnMessageItem(message) @@ -218,7 +217,7 @@ class IncomingPollMessageViewHolder(incomingView: View, payload: Any) : MessageH .setTextColor(ContextCompat.getColor(context, R.color.textColorMaxContrast)) if (parentChatMessage.actorId?.equals(message.activeUser!!.userId) == true) { - binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.colorPrimary) + viewThemeUtils.colorPrimaryView(binding.messageQuote.quoteColoredView) } else { binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.textColorMaxContrast) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPreviewMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPreviewMessageViewHolder.java index 48fc8a04199..1c9b59091c2 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPreviewMessageViewHolder.java @@ -26,9 +26,12 @@ import android.widget.ProgressBar; import com.facebook.drawee.view.SimpleDraweeView; +import com.nextcloud.talk.R; import com.nextcloud.talk.databinding.ItemCustomIncomingPreviewMessageBinding; import com.nextcloud.talk.databinding.ReactionsInsideMessageBinding; +import com.nextcloud.talk.models.json.chat.ChatMessage; +import androidx.core.content.ContextCompat; import androidx.emoji.widget.EmojiTextView; public class IncomingPreviewMessageViewHolder extends MagicPreviewMessageViewHolder { @@ -39,6 +42,16 @@ public IncomingPreviewMessageViewHolder(View itemView, Object payload) { binding = ItemCustomIncomingPreviewMessageBinding.bind(itemView); } + @Override + public void onBind(ChatMessage message) { + super.onBind(message); + + binding.messageText.setTextColor(ContextCompat.getColor(binding.messageText.getContext(), + R.color.no_emphasis_text)); + binding.messageTime.setTextColor(ContextCompat.getColor(binding.messageText.getContext(), + R.color.no_emphasis_text)); + } + @Override public EmojiTextView getMessageText() { return binding.messageText; diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt index 3088d4b39bb..553f0c9c1c9 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingVoiceMessageViewHolder.kt @@ -89,7 +89,6 @@ class IncomingVoiceMessageViewHolder(incomingView: View, payload: Any) : Message colorizeMessageBubble(message) itemView.isSelected = false - binding.messageTime.setTextColor(ResourcesCompat.getColor(context?.resources!!, R.color.warm_grey_four, null)) // parent message handling setParentMessageDataOnMessageItem(message) @@ -292,7 +291,7 @@ class IncomingVoiceMessageViewHolder(incomingView: View, payload: Any) : Message .setTextColor(ContextCompat.getColor(context!!, R.color.textColorMaxContrast)) if (parentChatMessage.actorId?.equals(message.activeUser!!.userId) == true) { - binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.colorPrimary) + viewThemeUtils.colorPrimaryView(binding.messageQuote.quoteColoredView) } else { binding.messageQuote.quoteColoredView.setBackgroundResource(R.color.textColorMaxContrast) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt index c94127b2d2f..b5d720b8b96 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt @@ -89,12 +89,9 @@ class MagicIncomingTextMessageViewHolder(itemView: View, payload: Any) : Message binding.messageAuthor.visibility = View.GONE } - val resources = itemView.resources - - setBubbleOnChatMessage(message, resources) + viewThemeUtils.themeIncomingMessageBubble(bubble, message.isGrouped, message.isDeleted) itemView.isSelected = false - binding.messageTime.setTextColor(ResourcesCompat.getColor(resources, R.color.warm_grey_four, null)) var messageString: Spannable = SpannableString(message.text) @@ -149,30 +146,6 @@ class MagicIncomingTextMessageViewHolder(itemView: View, payload: Any) : Message } } - private fun setBubbleOnChatMessage( - message: ChatMessage, - resources: Resources - ) { - val bgBubbleColor = if (message.isDeleted) { - ResourcesCompat.getColor(resources, R.color.bg_message_list_incoming_bubble_deleted, null) - } else { - ResourcesCompat.getColor(resources, R.color.bg_message_list_incoming_bubble, null) - } - - var bubbleResource = R.drawable.shape_incoming_message - - if (message.isGrouped) { - bubbleResource = R.drawable.shape_grouped_incoming_message - } - - val bubbleDrawable = DisplayUtils.getMessageSelector( - bgBubbleColor, - ResourcesCompat.getColor(resources, R.color.transparent, null), - bgBubbleColor, bubbleResource - ) - ViewCompat.setBackground(bubble, bubbleDrawable) - } - private fun processParentMessage(message: ChatMessage) { val parentChatMessage = message.parentMessage parentChatMessage!!.activeUser = message.activeUser diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt index 4ba094c25ca..e9efa209dda 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt @@ -77,15 +77,13 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams layoutParams.isWrapBefore = false var textSize = context!!.resources.getDimension(R.dimen.chat_text_size) - binding.messageTime.setTextColor(viewThemeUtils.getScheme(binding.messageText.context).onSurfaceVariant) + val textColor = viewThemeUtils.getScheme(binding.messageText.context).onSurfaceVariant + binding.messageTime.setTextColor(textColor) if (messageParameters != null && messageParameters.size > 0) { messageString = processMessageParameters(messageParameters, message, messageString) } else if (TextMatchers.isMessageWithSingleEmoticonOnly(message.text)) { textSize = (textSize * TEXT_SIZE_MULTIPLIER).toFloat() layoutParams.isWrapBefore = true - binding.messageTime.setTextColor( - ResourcesCompat.getColor(context!!.resources, R.color.warm_grey_four, null) - ) realView.isSelected = true } @@ -93,7 +91,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) binding.messageTime.layoutParams = layoutParams - binding.messageText.setTextColor(viewThemeUtils.getScheme(binding.messageText.context).onSurfaceVariant) + binding.messageText.setTextColor(textColor) binding.messageText.text = messageString // parent message handling @@ -141,6 +139,7 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage private fun processParentMessage(message: ChatMessage) { val parentChatMessage = message.parentMessage + val textColor = viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant parentChatMessage!!.activeUser = message.activeUser parentChatMessage.imageUrl?.let { binding.messageQuote.quotedMessageImage.visibility = View.VISIBLE @@ -157,9 +156,9 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage ?: context!!.getText(R.string.nc_nick_guest) binding.messageQuote.quotedMessage.text = parentChatMessage.text - binding.messageQuote.quoteColoredView.setBackgroundColor( - ContextCompat.getColor(binding.messageQuote.quoteColoredView.context, R.color.high_emphasis_text) - ) + binding.messageQuote.quotedMessageAuthor.setTextColor(textColor) + binding.messageQuote.quotedMessage.setTextColor(textColor) + binding.messageQuote.quoteColoredView.setBackgroundColor(textColor) } private fun setBubbleOnChatMessage(message: ChatMessage) { @@ -206,8 +205,5 @@ class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessage companion object { const val TEXT_SIZE_MULTIPLIER = 2.5 - private const val HALF_ALPHA_INT: Int = 255 / 2 - private val ALPHA_60_INT: Int = (255 * 0.6).roundToInt() - private val ALPHA_80_INT: Int = (255 * 0.8).roundToInt() } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java index d10532a650a..db69b5a61aa 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java @@ -188,7 +188,8 @@ public void onBind(ChatMessage message) { if (drawable != null && (drawableResourceId == R.drawable.ic_mimetype_folder || drawableResourceId == R.drawable.ic_mimetype_package_x_generic)) { - drawable.setColorFilter(serverTheme.getPrimaryColor(), PorterDuff.Mode.SRC_ATOP); + drawable.setColorFilter(viewThemeUtils.getScheme(image.getContext()).getPrimary(), + PorterDuff.Mode.SRC_ATOP); } image.getHierarchy().setPlaceholderImage(drawable); diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt index 84118d37709..81fabefaeef 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt @@ -25,6 +25,7 @@ package com.nextcloud.talk.adapters.messages import android.annotation.SuppressLint import android.content.Context import android.content.Intent +import android.graphics.PorterDuff import android.net.Uri import android.util.Log import android.util.TypedValue @@ -81,6 +82,8 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders override fun onBind(message: ChatMessage) { super.onBind(message) sharedApplication!!.componentApplication.inject(this) + val textColor = viewThemeUtils.getScheme(binding.messageTime.context).onSurfaceVariant + binding.messageTime.setTextColor(textColor) realView.isSelected = false val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams @@ -112,6 +115,9 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : MessageHolders readStatusDrawableInt?.let { drawableInt -> AppCompatResources.getDrawable(context!!, drawableInt)?.let { binding.checkMark.setImageDrawable(it) + binding.checkMark.setColorFilter( + viewThemeUtils.getScheme(binding.checkMark.context).onSurfaceVariant, PorterDuff.Mode.SRC_ATOP + ) } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt index 936c73342e7..cdfe226874a 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt @@ -23,6 +23,7 @@ package com.nextcloud.talk.adapters.messages import android.annotation.SuppressLint import android.content.Context +import android.graphics.PorterDuff import android.view.View import androidx.appcompat.content.res.AppCompatResources import androidx.core.graphics.ColorUtils @@ -76,6 +77,8 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag super.onBind(message) this.message = message sharedApplication!!.componentApplication.inject(this) + val textColor = viewThemeUtils.getScheme(binding.messageTime.context).onSurfaceVariant + binding.messageTime.setTextColor(textColor) colorizeMessageBubble(message) @@ -99,6 +102,9 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag readStatusDrawableInt?.let { drawableInt -> AppCompatResources.getDrawable(context, drawableInt)?.let { binding.checkMark.setImageDrawable(it) + binding.checkMark.setColorFilter( + viewThemeUtils.getScheme(binding.checkMark.context).onSurfaceVariant, PorterDuff.Mode.SRC_ATOP + ) } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPreviewMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPreviewMessageViewHolder.java index 3456b02a7de..1662e1189d2 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPreviewMessageViewHolder.java @@ -26,12 +26,16 @@ import android.widget.ProgressBar; import com.facebook.drawee.view.SimpleDraweeView; +import com.nextcloud.talk.R; import com.nextcloud.talk.databinding.ItemCustomOutcomingPreviewMessageBinding; import com.nextcloud.talk.databinding.ReactionsInsideMessageBinding; +import com.nextcloud.talk.models.json.chat.ChatMessage; +import androidx.core.content.ContextCompat; import androidx.emoji.widget.EmojiTextView; public class OutcomingPreviewMessageViewHolder extends MagicPreviewMessageViewHolder { + private final ItemCustomOutcomingPreviewMessageBinding binding; public OutcomingPreviewMessageViewHolder(View itemView) { @@ -39,6 +43,16 @@ public OutcomingPreviewMessageViewHolder(View itemView) { binding = ItemCustomOutcomingPreviewMessageBinding.bind(itemView); } + @Override + public void onBind(ChatMessage message) { + super.onBind(message); + + binding.messageText.setTextColor(ContextCompat.getColor(binding.messageText.getContext(), + R.color.no_emphasis_text)); + binding.messageTime.setTextColor(ContextCompat.getColor(binding.messageText.getContext(), + R.color.no_emphasis_text)); + } + @Override public EmojiTextView getMessageText() { return binding.messageText; diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt index c011efce401..1148f1e7030 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt @@ -24,6 +24,7 @@ package com.nextcloud.talk.adapters.messages import android.annotation.SuppressLint import android.content.Context +import android.graphics.PorterDuff import android.os.Handler import android.util.Log import android.view.View @@ -83,6 +84,8 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders super.onBind(message) this.message = message sharedApplication!!.componentApplication.inject(this) + val textColor = viewThemeUtils.getScheme(binding.messageTime.context).onSurfaceVariant + binding.messageTime.setTextColor(textColor) colorizeMessageBubble(message) @@ -132,6 +135,9 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : MessageHolders readStatusDrawableInt?.let { drawableInt -> AppCompatResources.getDrawable(context!!, drawableInt)?.let { binding.checkMark.setImageDrawable(it) + binding.checkMark.setColorFilter( + viewThemeUtils.getScheme(binding.checkMark.context).onSurfaceVariant, PorterDuff.Mode.SRC_ATOP + ) } } diff --git a/app/src/main/res/layout/controller_chat.xml b/app/src/main/res/layout/controller_chat.xml index e88e40c7951..1e42b065783 100644 --- a/app/src/main/res/layout/controller_chat.xml +++ b/app/src/main/res/layout/controller_chat.xml @@ -74,6 +74,7 @@ app:incomingImageTimeTextSize="12sp" app:incomingTextColor="@color/nc_incoming_text_default" app:incomingTextLinkColor="@color/nc_incoming_text_default" + app:incomingTimeTextColor="@color/no_emphasis_text" app:incomingTextSize="@dimen/chat_text_size" app:incomingTimeTextSize="12sp" app:outcomingBubblePaddingBottom="@dimen/message_bubble_corners_padding" diff --git a/app/src/main/res/layout/item_custom_incoming_location_message.xml b/app/src/main/res/layout/item_custom_incoming_location_message.xml index 67a7ba33126..5916d1b53a9 100644 --- a/app/src/main/res/layout/item_custom_incoming_location_message.xml +++ b/app/src/main/res/layout/item_custom_incoming_location_message.xml @@ -87,7 +87,8 @@ android:layout_height="wrap_content" android:layout_below="@id/messageText" android:layout_marginStart="8dp" - android:textColor="@color/medium_emphasis_text" + android:alpha="0.6" + android:textColor="@color/no_emphasis_text" app:layout_alignSelf="center" /> diff --git a/app/src/main/res/layout/item_custom_incoming_preview_message.xml b/app/src/main/res/layout/item_custom_incoming_preview_message.xml index aa640544fcc..9b2751a6db4 100644 --- a/app/src/main/res/layout/item_custom_incoming_preview_message.xml +++ b/app/src/main/res/layout/item_custom_incoming_preview_message.xml @@ -152,10 +152,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="2dp" + android:alpha="0.6" android:autoLink="none" android:textAlignment="viewStart" - android:textColor="@color/warm_grey_four" - android:textColorLink="@color/warm_grey_four" + android:textColor="@color/no_emphasis_text" + android:textColorLink="@color/no_emphasis_text" android:textIsSelectable="true" android:textSize="12sp" app:layout_alignSelf="flex_start" @@ -170,7 +171,8 @@ android:layout_alignParentEnd="true" android:layout_marginStart="8dp" android:layout_marginEnd="2dp" - android:textColor="@color/warm_grey_four" + android:alpha="0.6" + android:textColor="@color/no_emphasis_text" app:layout_alignSelf="center" tools:text="12:38" /> diff --git a/app/src/main/res/layout/item_custom_incoming_text_message.xml b/app/src/main/res/layout/item_custom_incoming_text_message.xml index efebfface52..defaf021cca 100644 --- a/app/src/main/res/layout/item_custom_incoming_text_message.xml +++ b/app/src/main/res/layout/item_custom_incoming_text_message.xml @@ -59,8 +59,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" + android:alpha="0.6" android:textAlignment="viewStart" - android:textColor="@color/textColorMaxContrast" + android:textColor="@color/no_emphasis_text" android:textIsSelectable="false" android:textSize="12sp" tools:text="Jane Doe" /> @@ -83,7 +84,8 @@ android:layout_height="wrap_content" android:layout_below="@id/messageText" android:layout_marginStart="8dp" - android:textColor="@color/medium_emphasis_text" + android:alpha="0.6" + android:textColor="@color/no_emphasis_text" android:textIsSelectable="false" app:layout_alignSelf="center" /> diff --git a/app/src/main/res/layout/item_custom_incoming_voice_message.xml b/app/src/main/res/layout/item_custom_incoming_voice_message.xml index f3639989908..5a9330beda4 100644 --- a/app/src/main/res/layout/item_custom_incoming_voice_message.xml +++ b/app/src/main/res/layout/item_custom_incoming_voice_message.xml @@ -105,7 +105,8 @@ android:layout_height="wrap_content" android:layout_below="@id/messageText" android:layout_marginStart="8dp" - android:textColor="@color/medium_emphasis_text" + android:alpha="0.6" + android:textColor="@color/no_emphasis_text" app:layout_alignSelf="center" tools:text="12:38" /> diff --git a/app/src/main/res/layout/item_custom_outcoming_location_message.xml b/app/src/main/res/layout/item_custom_outcoming_location_message.xml index 56e26e5f4dd..bd5a0aa622b 100644 --- a/app/src/main/res/layout/item_custom_outcoming_location_message.xml +++ b/app/src/main/res/layout/item_custom_outcoming_location_message.xml @@ -69,7 +69,8 @@ android:layout_height="wrap_content" android:layout_below="@id/messageText" android:layout_marginStart="8dp" - android:textColor="@color/medium_emphasis_text" + android:alpha="0.6" + android:textColor="@color/no_emphasis_text" app:layout_alignSelf="center" tools:text="10:35" /> diff --git a/app/src/main/res/layout/item_custom_outcoming_poll_message.xml b/app/src/main/res/layout/item_custom_outcoming_poll_message.xml index fc4ea236c04..6ae34a70af7 100644 --- a/app/src/main/res/layout/item_custom_outcoming_poll_message.xml +++ b/app/src/main/res/layout/item_custom_outcoming_poll_message.xml @@ -82,7 +82,8 @@ android:layout_height="wrap_content" android:layout_below="@id/messageText" android:layout_marginStart="8dp" - android:textColor="@color/medium_emphasis_text" + android:alpha="0.6" + android:textColor="@color/no_emphasis_text" app:layout_alignSelf="center" tools:text="10:35" /> diff --git a/app/src/main/res/layout/item_custom_outcoming_preview_message.xml b/app/src/main/res/layout/item_custom_outcoming_preview_message.xml index d266e4bc026..e30d53fcaab 100644 --- a/app/src/main/res/layout/item_custom_outcoming_preview_message.xml +++ b/app/src/main/res/layout/item_custom_outcoming_preview_message.xml @@ -142,9 +142,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="2dp" + android:alpha="0.6" android:autoLink="none" - android:textColor="@color/warm_grey_four" - android:textColorLink="@color/warm_grey_four" + android:textColor="@color/no_emphasis_text" + android:textColorLink="@color/no_emphasis_text" android:textIsSelectable="true" android:textSize="12sp" android:visibility="invisible" @@ -160,7 +161,8 @@ android:layout_alignParentEnd="true" android:layout_marginStart="8dp" android:layout_marginEnd="2dp" - android:textColor="@color/warm_grey_four" + android:alpha="0.6" + android:textColor="@color/no_emphasis_text" app:layout_alignSelf="center" tools:text="12:34" /> diff --git a/app/src/main/res/layout/item_custom_outcoming_text_message.xml b/app/src/main/res/layout/item_custom_outcoming_text_message.xml index 6e4383c0a88..fc10826d586 100644 --- a/app/src/main/res/layout/item_custom_outcoming_text_message.xml +++ b/app/src/main/res/layout/item_custom_outcoming_text_message.xml @@ -64,7 +64,7 @@ android:layout_below="@id/messageText" android:layout_marginStart="8dp" android:alpha="0.6" - android:textColor="@color/medium_emphasis_text" + android:textColor="@color/no_emphasis_text" android:textIsSelectable="false" app:layout_alignSelf="center" tools:text="10:35" /> diff --git a/app/src/main/res/layout/item_custom_outcoming_voice_message.xml b/app/src/main/res/layout/item_custom_outcoming_voice_message.xml index 38635c0f9cc..0a3223f300f 100644 --- a/app/src/main/res/layout/item_custom_outcoming_voice_message.xml +++ b/app/src/main/res/layout/item_custom_outcoming_voice_message.xml @@ -92,7 +92,8 @@ android:layout_height="wrap_content" android:layout_below="@id/messageText" android:layout_marginStart="8dp" - android:textColor="@color/medium_emphasis_text" + android:alpha="0.6" + android:textColor="@color/no_emphasis_text" app:layout_alignSelf="center" tools:text="10:35" /> diff --git a/app/src/main/res/layout/item_message_quote.xml b/app/src/main/res/layout/item_message_quote.xml index dc9e15c1f03..e4b7e4775ad 100644 --- a/app/src/main/res/layout/item_message_quote.xml +++ b/app/src/main/res/layout/item_message_quote.xml @@ -45,9 +45,10 @@ android:layout_alignParentTop="true" android:layout_marginEnd="8dp" android:layout_toEndOf="@id/quoteColoredView" + android:alpha="0.6" android:ellipsize="end" android:textAlignment="viewStart" - android:textColor="@color/medium_emphasis_text" + android:textColor="@color/no_emphasis_text" android:textIsSelectable="false" android:textSize="12sp" tools:text="Jane Doe" /> diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 7d28def391d..5dcc92fb6a1 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -35,6 +35,7 @@ #222222 + #ffffff #deffffff #99ffffff #61ffffff diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index cd3ebe443ac..1de3f5fb0a1 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -36,6 +36,7 @@ #ffffff + #000000 #de000000 #99000000 #61000000 From e76669439f013d3f21fd39e71993b4e4c5c0e432 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 4 Aug 2022 23:47:02 +0200 Subject: [PATCH 151/398] Migrate to a new, updated popup bubble based on MaterialButton Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/controllers/ChatController.kt | 3 +-- .../talk/controllers/ConversationsListController.java | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 852369bf725..22b27ab9004 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -651,8 +651,7 @@ class ChatController(args: Bundle) : } } - binding.popupBubbleView.setTextColor(Color.WHITE) - binding.popupBubbleView.setIconTint(ColorStateList.valueOf(Color.WHITE)) + viewThemeUtils.colorMaterialButtonPrimaryFilled(binding.popupBubbleView) binding.messageInputView.setPadding(0, 0, 0, 0) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index e24a36b3641..9870f8f27a6 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -806,9 +806,7 @@ public void bubbleClicked(Context context) { recyclerView.smoothScrollToPosition(nextUnreadConversationScrollPosition); } }); - - newMentionPopupBubble.setTextColor(Color.WHITE); - newMentionPopupBubble.setIconTint(ColorStateList.valueOf(Color.WHITE)); + viewThemeUtils.colorMaterialButtonPrimaryFilled(newMentionPopupBubble); } private void checkToShowUnreadBubble() { From 53b5db4f190fe9f339781db28e5528362e5ba88f Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 4 Aug 2022 23:48:55 +0200 Subject: [PATCH 152/398] remove unused imports Signed-off-by: Andy Scherzinger --- .../adapters/messages/MagicIncomingTextMessageViewHolder.kt | 2 -- .../adapters/messages/MagicOutcomingTextMessageViewHolder.kt | 2 -- .../com/nextcloud/talk/messagesearch/MessageSearchActivity.kt | 1 - 3 files changed, 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt index b5d720b8b96..f5be6eea3bd 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicIncomingTextMessageViewHolder.kt @@ -26,7 +26,6 @@ package com.nextcloud.talk.adapters.messages import android.content.Context import android.content.Intent -import android.content.res.Resources import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import android.net.Uri @@ -38,7 +37,6 @@ import android.util.TypedValue import android.view.View import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat -import androidx.core.view.ViewCompat import autodagger.AutoInjector import coil.load import com.amulyakhare.textdrawable.TextDrawable diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt index e9efa209dda..ae0bf136dab 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.kt @@ -31,7 +31,6 @@ import android.text.Spannable import android.text.SpannableString import android.util.TypedValue import android.view.View -import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import autodagger.AutoInjector import coil.load @@ -50,7 +49,6 @@ import com.nextcloud.talk.utils.DisplayUtils.searchAndReplaceWithMentionSpan import com.nextcloud.talk.utils.TextMatchers import com.stfalcon.chatkit.messages.MessageHolders.OutcomingTextMessageViewHolder import javax.inject.Inject -import kotlin.math.roundToInt @AutoInjector(NextcloudTalkApplication::class) class MagicOutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewHolder(itemView) { diff --git a/app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt b/app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt index 942f3f55cd3..0f2a732a048 100644 --- a/app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt @@ -41,7 +41,6 @@ import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.controllers.ConversationsListController import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityMessageSearchBinding -import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew From cca35c32af96dcc36556e774e867df6c1f422fd5 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Sat, 6 Aug 2022 13:16:15 +0200 Subject: [PATCH 153/398] fixes and cleanup after rebase Signed-off-by: Andy Scherzinger --- .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 29a5065eb7d..97e5f07df1c 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -50,6 +50,7 @@ import androidx.appcompat.widget.SearchView.SearchAutoComplete import androidx.appcompat.widget.SwitchCompat import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.ColorUtils import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.ViewCompat import androidx.core.view.children @@ -538,14 +539,6 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private } } - private fun progressColor(context: Context, color: Int): Int { - val lightness = when (isDarkMode(context)) { - true -> PROGRESS_LIGHTNESS_DARK_THEME - false -> PROGRESS_LIGHTNESS_LIGHT_THEME - } - return colorUtil.setLightness(color, lightness) - } - fun colorEditText(editText: EditText) { withScheme(editText) { scheme -> // TODO check API-level compatibility @@ -667,19 +660,6 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private return drawable } - private fun progressColor(context: Context, color: Int): Int { - val hsl = FloatArray(HSL_SIZE) - ColorUtils.RGBToHSL(Color.red(color), Color.green(color), Color.blue(color), hsl) - - if (isDarkMode(context)) { - hsl[INDEX_LIGHTNESS] = LIGHTNESS_DARK_THEME - } else { - hsl[INDEX_LIGHTNESS] = LIGHTNESS_LIGHT_THEME - } - - return ColorUtils.HSLToColor(hsl) - } - private fun calculateDisabledColor(color: Int, opacity: Float): Int { return Color.argb( (Color.alpha(color) * opacity).roundToInt(), From ff2f58419e835451cfb7e3f683d9345073496eae Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 9 Aug 2022 15:27:01 +0200 Subject: [PATCH 154/398] Improve profile layouting Signed-off-by: Andy Scherzinger --- .../main/res/layout/controller_profile.xml | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/res/layout/controller_profile.xml b/app/src/main/res/layout/controller_profile.xml index a7c31c31263..2d0d668b361 100644 --- a/app/src/main/res/layout/controller_profile.xml +++ b/app/src/main/res/layout/controller_profile.xml @@ -30,7 +30,7 @@ android:id="@+id/avatarContainer" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingBottom="@dimen/standard_padding"> + android:layout_marginBottom="@dimen/standard_margin"> @@ -81,44 +80,45 @@ android:id="@+id/avatar_upload" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/standard_half_margin" - android:layout_marginRight="@dimen/standard_half_margin" + android:layout_marginLeft="@dimen/standard_quarter_margin" + android:layout_marginRight="@dimen/standard_quarter_margin" android:contentDescription="@string/upload_new_avatar_from_device" android:tint="@android:color/white" - app:fabCustomSize="@dimen/min_size_clickable_area" + app:fabSize="mini" app:srcCompat="@drawable/upload" /> From e57eb4442ff7be0634b478ca095f4368f0c4ce56 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 9 Aug 2022 18:21:56 +0200 Subject: [PATCH 155/398] Make upload confirmation dialog a material one Signed-off-by: Andy Scherzinger --- .../talk/controllers/ChatController.kt | 30 +++++++++------ .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 38 +++++++++++++++++++ app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/styles.xml | 1 + 4 files changed, 60 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 22b27ab9004..5b737ff1d16 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -35,11 +35,9 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.content.res.AssetFileDescriptor -import android.content.res.ColorStateList import android.content.res.Resources import android.database.Cursor import android.graphics.Bitmap -import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.media.MediaPlayer import android.media.MediaRecorder @@ -74,6 +72,7 @@ import android.widget.ImageView import android.widget.PopupMenu import android.widget.RelativeLayout import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.appcompat.view.ContextThemeWrapper import androidx.core.content.ContextCompat import androidx.core.content.FileProvider @@ -100,6 +99,7 @@ import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber import com.facebook.imagepipeline.image.CloseableImage import com.google.android.flexbox.FlexboxLayout +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.R import com.nextcloud.talk.activities.CallActivity @@ -189,7 +189,6 @@ import com.stfalcon.chatkit.messages.MessageHolders.ContentChecker import com.stfalcon.chatkit.messages.MessagesListAdapter import com.stfalcon.chatkit.utils.DateFormatter import com.vanniktech.emoji.EmojiPopup -import com.yarolegovich.lovelydialog.LovelyStandardDialog import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -1410,28 +1409,37 @@ class ChatController(args: Bundle) : val confirmationQuestion = when (filesToUpload.size) { 1 -> context?.resources?.getString(R.string.nc_upload_confirm_send_single)?.let { - String.format(it, title) + String.format(it, title.trim()) } else -> context?.resources?.getString(R.string.nc_upload_confirm_send_multiple)?.let { - String.format(it, title) + String.format(it, title.trim()) } } - LovelyStandardDialog(activity) - .setPositiveButtonColorRes(R.color.nc_darkGreen) + val materialAlertDialogBuilder = MaterialAlertDialogBuilder(binding.messageInputView.context) .setTitle(confirmationQuestion) .setMessage(filenamesWithLinebreaks.toString()) - .setPositiveButton(R.string.nc_yes) { v -> - if (UploadAndShareFilesWorker.isStoragePermissionGranted(context!!)) { + .setPositiveButton(R.string.nc_yes) { _, _ -> + if (UploadAndShareFilesWorker.isStoragePermissionGranted(context)) { uploadFiles(filesToUpload, false) } else { UploadAndShareFilesWorker.requestStoragePermission(this) } } - .setNegativeButton(R.string.nc_no) { + .setNegativeButton(R.string.nc_no) { _, _ -> // unused atm } - .show() + + viewThemeUtils.colorMaterialAlertDialogBackground( + binding.messageInputView.context, + materialAlertDialogBuilder + ) + + val dialog = materialAlertDialogBuilder.show() + + val primary = viewThemeUtils.getScheme(binding.messageInputView.context).primary + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(primary) + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(primary) } catch (e: IllegalStateException) { Toast.makeText(context, context?.resources?.getString(R.string.nc_upload_failed), Toast.LENGTH_LONG) .show() diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 97e5f07df1c..cf2be726974 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -33,6 +33,7 @@ import android.os.Build import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.widget.Button import android.widget.CheckBox import android.widget.EditText import android.widget.ImageButton @@ -60,8 +61,10 @@ import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipDrawable +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.progressindicator.LinearProgressIndicator +import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.tabs.TabLayout import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textview.MaterialTextView @@ -300,6 +303,20 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private } } + fun colorButtonText(button: Button) { + withScheme(button) { scheme -> + val disabledColor = ContextCompat.getColor(button.context, R.color.disabled_text) + val colorStateList = ColorStateList( + arrayOf( + intArrayOf(android.R.attr.state_enabled), + intArrayOf(-android.R.attr.state_enabled) + ), + intArrayOf(scheme.primary, disabledColor) + ) + button.setTextColor(colorStateList) + } + } + fun colorMaterialButtonPrimaryFilled(button: MaterialButton) { withScheme(button) { scheme -> button.backgroundTintList = @@ -709,6 +726,27 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private } } + fun colorMaterialAlertDialogBackground(context: Context, dialogBuilder: MaterialAlertDialogBuilder) { + withScheme(dialogBuilder.context) { scheme -> + val materialShapeDrawable = MaterialShapeDrawable( + context, + null, + com.google.android.material.R.attr.alertDialogStyle, + com.google.android.material.R.style.MaterialAlertDialog_MaterialComponents + ) + materialShapeDrawable.initializeElevationOverlay(context) + materialShapeDrawable.fillColor = ColorStateList.valueOf(scheme.surface) + + // dialogCornerRadius first appeared in Android Pie + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val radius = context.resources.getDimension(R.dimen.dialogBorderRadius) + materialShapeDrawable.setCornerSize(radius) + } + + dialogBuilder.background = materialShapeDrawable + } + } + companion object { private val THEMEABLE_PLACEHOLDER_IDS = listOf( R.drawable.ic_mimetype_package_x_generic, diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 7e63618e560..5d2115c9ed7 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -74,6 +74,8 @@ 2dp 12dp + 28dp + 18dp 50dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 8fc005a2680..0823b6b610c 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -42,6 +42,7 @@ @style/Nextcloud.Material.Incoming.SeekBar @style/ThemeOverlay.App.BottomSheetDialog @style/ChatSendButtonMenu + @dimen/dialogBorderRadius