From 60f0c4d4eb0623d68c5e27c6c65d85cebd4b07e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Rutkowski?= Date: Sat, 20 Oct 2018 14:13:32 +0200 Subject: [PATCH 001/149] Show users summary when long-clicking reaction --- .../chatroom/adapter/BaseViewHolder.kt | 4 +++ .../adapter/MessageReactionsAdapter.kt | 10 +++++-- .../presentation/ChatRoomPresenter.kt | 4 +++ .../chatroom/presentation/ChatRoomView.kt | 2 ++ .../android/chatroom/ui/ChatRoomFragment.kt | 28 +++++++++++++++++++ app/src/main/res/values-de/strings.xml | 3 ++ app/src/main/res/values-es/strings.xml | 3 ++ app/src/main/res/values-fr/strings.xml | 3 ++ app/src/main/res/values-ja/strings.xml | 3 ++ app/src/main/res/values-pt-rBR/strings.xml | 3 ++ app/src/main/res/values-ru-rRU/strings.xml | 3 ++ app/src/main/res/values-tr/strings.xml | 3 ++ app/src/main/res/values-uk/strings.xml | 3 ++ app/src/main/res/values/strings.xml | 3 ++ .../android/emoji/EmojiReactionListener.kt | 8 ++++++ 15 files changed, 81 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/BaseViewHolder.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/BaseViewHolder.kt index 6b1fd175e9..4ad0d5f8ec 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/BaseViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/BaseViewHolder.kt @@ -60,6 +60,10 @@ abstract class BaseViewHolder>( reactionListener?.onReactionAdded(messageId, emoji) } } + + override fun onReactionLongClicked(emojiShortname: String, usernames: List) { + reactionListener?.onReactionLongClicked(emojiShortname, usernames) + } } val context = itemView.context val manager = FlexboxLayoutManager(context, FlexDirection.ROW) diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageReactionsAdapter.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageReactionsAdapter.kt index 3d09975851..a59f34e494 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageReactionsAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageReactionsAdapter.kt @@ -4,7 +4,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView -import android.widget.TextView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import chat.rocket.android.R @@ -76,7 +75,7 @@ class MessageReactionsAdapter : RecyclerView.Adapter() class SingleReactionViewHolder( view: View, private val listener: EmojiReactionListener? - ) : RecyclerView.ViewHolder(view), View.OnClickListener { + ) : RecyclerView.ViewHolder(view), View.OnClickListener, View.OnLongClickListener { @Inject lateinit var localRepository: LocalRepository @@ -119,6 +118,8 @@ class MessageReactionsAdapter : RecyclerView.Adapter() view_flipper_reaction.setOnClickListener(this@SingleReactionViewHolder) text_count.setOnClickListener(this@SingleReactionViewHolder) + view_flipper_reaction.setOnLongClickListener(this@SingleReactionViewHolder) + text_count.setOnLongClickListener(this@SingleReactionViewHolder) } } @@ -130,6 +131,11 @@ class MessageReactionsAdapter : RecyclerView.Adapter() } } } + + override fun onLongClick(v: View?): Boolean { + listener?.onReactionLongClicked(reaction.shortname, reaction.usernames) + return true + } } class AddReactionViewHolder( diff --git a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt index e442cf940a..4948de490d 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt @@ -989,6 +989,10 @@ class ChatRoomPresenter @Inject constructor( view.showReactionsPopup(messageId) } + fun showReactionsSummary(emojiShortname: String, usernames: List) { + view.showReactionsSummary(emojiShortname, usernames, currentLoggedUsername) + } + fun loadCommands() { launchUI(strategy) { try { diff --git a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt index 7b226e62cb..b894687fe3 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt @@ -140,6 +140,8 @@ interface ChatRoomView : LoadingView, MessageView { fun showReactionsPopup(messageId: String) + fun showReactionsSummary(emojiShortname: String, usernames: List, currentLoggedUsername: String?) + /** * Show list of commands. * diff --git a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt index 03d310f585..c2d899a21c 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt @@ -22,6 +22,7 @@ import android.widget.EditText import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView +import android.widget.Toast import androidx.annotation.DrawableRes import androidx.core.text.bold import androidx.core.view.isVisible @@ -665,6 +666,33 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR presenter.react(messageId, emoji.shortname) } + override fun onReactionLongClicked(emojiShortname: String, usernames: List) { + presenter.showReactionsSummary(emojiShortname, usernames) + } + + override fun showReactionsSummary(emojiShortname: String, usernames: List, currentLoggedUsername: String?) { + var usernamesString = usernames.asSequence() + .take(15) + .joinToString { username -> + if (username == currentLoggedUsername) { + getString(R.string.msg_you).toLowerCase() + } else { + "@$username" + } + } + if (usernames.size > 15) { + usernamesString += " " + getString(R.string.And_more, usernames.size - 15).toLowerCase() + } else { + usernamesString = usernamesString.replace(""",([^,]+)$""".toRegex()) { + " ${getString(R.string.and)}${it.groupValues[1]}" + } + } + if (usernamesString[0] != '@') { + usernamesString = usernamesString.capitalize() + } + showToast("$usernamesString ${getString(R.string.Reacted_with).toLowerCase()} $emojiShortname", Toast.LENGTH_LONG) + } + override fun showReactionsPopup(messageId: String) { ui { val emojiPickerPopup = EmojiPickerPopup(it) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 9492b752bb..17fd3d1615 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -277,6 +277,9 @@ Keine letzten Emojis Standart Hautton + Und %1$d mehr + und + Reagierte mit Sortiere diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d1c4e727e3..ff42011392 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -275,6 +275,9 @@ Sin emojis recientes Tono de piel predeterminado + Y %1$d mas + y + Reacciono con Ordenar diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 367803daa1..55da2ba2df 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -280,6 +280,9 @@ Aucun emoji récent Tonalité de peau par défaut + et encore %1$d + et + a réagi avec Trier diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index ed838e29ba..b5307a22f4 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -282,6 +282,9 @@ 最近の絵文字はありません デフォルトスキントークン + さらに %1$d + + がリアクションしています ソート diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index b16f788c7e..aa3b11f62b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -278,6 +278,9 @@ Nenhum emoji recente Tom de pele padrão + E mais %1$d + e + Reagiu com Ordenar diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 914588dae8..b91ab64b48 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -275,6 +275,9 @@ Пусто Тон кожи по умолчанию + И еще %1$d + и + Реагирует с Сортировать diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f219bc0287..06ed421a74 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -279,6 +279,9 @@ Son kullanılan emoji bulunmamaktadır Varsayılan tasarım tonu + Ve %1$d kadar daha fazla + ve + ile reaksiyona sokulur Sırala diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 48947363f4..6c3d7a0a51 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -276,6 +276,9 @@ Пусто Тон шкіри за замовчуванням + І ще %1$d + і + реагує з Сортувати diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5ca860868f..b99621855b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -292,6 +292,9 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin No recent emojis Default skin tone + And %1$d more + and + Reacted with Sort diff --git a/emoji/src/main/java/chat/rocket/android/emoji/EmojiReactionListener.kt b/emoji/src/main/java/chat/rocket/android/emoji/EmojiReactionListener.kt index 6bbc7873fd..309a4d5c11 100644 --- a/emoji/src/main/java/chat/rocket/android/emoji/EmojiReactionListener.kt +++ b/emoji/src/main/java/chat/rocket/android/emoji/EmojiReactionListener.kt @@ -16,4 +16,12 @@ interface EmojiReactionListener { * @param emojiShortname The shortname of the emoji (:grin:, :smiley:, etc). */ fun onReactionTouched(messageId: String, emojiShortname: String) + + /** + * Callback when an added reaction is long-clicked. + * + * @param emojiShortname The shortname of the emoji (:grin:, :smiley:, etc). + * @param usernames The list of usernames of users who added the reaction. + */ + fun onReactionLongClicked(emojiShortname: String, usernames: List) } \ No newline at end of file From b95cad2f4fed37a3e497a8e77f60a2c7616702c7 Mon Sep 17 00:00:00 2001 From: Filipe de Lima Brito Date: Mon, 22 Oct 2018 18:12:04 -0700 Subject: [PATCH 002/149] Adds analytics for reset password event. --- .../rocket/android/analytics/Analytics.kt | 25 ++++++++++++------- .../android/analytics/AnalyticsManager.kt | 6 +++++ .../presentation/PasswordPresenter.kt | 6 ++++- .../android/analytics/AnswersAnalytics.kt | 7 ++++++ .../analytics/GoogleAnalyticsForFirebase.kt | 5 ++++ 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/analytics/Analytics.kt b/app/src/main/java/chat/rocket/android/analytics/Analytics.kt index d03ab2b738..9e21db338e 100644 --- a/app/src/main/java/chat/rocket/android/analytics/Analytics.kt +++ b/app/src/main/java/chat/rocket/android/analytics/Analytics.kt @@ -12,7 +12,7 @@ interface Analytics { * @param event The [AuthenticationEvent] used to log in. * @param loginSucceeded True if successful logged in, false otherwise. */ - fun logLogin(event: AuthenticationEvent, loginSucceeded: Boolean) {} + fun logLogin(event: AuthenticationEvent, loginSucceeded: Boolean) /** * Logs the sign up event. @@ -20,14 +20,14 @@ interface Analytics { * @param event The [AuthenticationEvent] used to sign up. * @param signUpSucceeded True if successful signed up, false otherwise. */ - fun logSignUp(event: AuthenticationEvent, signUpSucceeded: Boolean) {} + fun logSignUp(event: AuthenticationEvent, signUpSucceeded: Boolean) /** * Logs the screen view event. * * @param event The [ScreenViewEvent] to log. */ - fun logScreenView(event: ScreenViewEvent) {} + fun logScreenView(event: ScreenViewEvent) /** * Logs the message sent event. @@ -35,7 +35,7 @@ interface Analytics { * @param event The [SubscriptionTypeEvent] to log. * @param serverUrl The server URL to log. */ - fun logMessageSent(event: SubscriptionTypeEvent, serverUrl: String) {} + fun logMessageSent(event: SubscriptionTypeEvent, serverUrl: String) /** * Logs the media upload event. @@ -43,14 +43,14 @@ interface Analytics { * @param event The [SubscriptionTypeEvent] to log. * @param mimeType The mime type of the media uploaded to log. */ - fun logMediaUploaded(event: SubscriptionTypeEvent, mimeType: String) {} + fun logMediaUploaded(event: SubscriptionTypeEvent, mimeType: String) /** * Logs the reaction event. * * @param event The [SubscriptionTypeEvent] to log. */ - fun logReaction(event: SubscriptionTypeEvent) {} + fun logReaction(event: SubscriptionTypeEvent) /** * Logs the server switch event. @@ -58,10 +58,17 @@ interface Analytics { * @param serverUrl The server URL to log. * @param serverCount The number of server(s) the use own. */ - fun logServerSwitch(serverUrl: String, serverCount: Int) {} + fun logServerSwitch(serverUrl: String, serverCount: Int) /** - * Logs the admin opening. + * Logs the admin opening event. */ - fun logOpenAdmin() {} + fun logOpenAdmin() + + /** + * Logs the reset password event. + * + * @param resetPasswordSucceeded True if successful reset password, false otherwise. + */ + fun logResetPassword(resetPasswordSucceeded: Boolean) } diff --git a/app/src/main/java/chat/rocket/android/analytics/AnalyticsManager.kt b/app/src/main/java/chat/rocket/android/analytics/AnalyticsManager.kt index 92c21c449f..084561bbfe 100644 --- a/app/src/main/java/chat/rocket/android/analytics/AnalyticsManager.kt +++ b/app/src/main/java/chat/rocket/android/analytics/AnalyticsManager.kt @@ -70,4 +70,10 @@ class AnalyticsManager @Inject constructor( analytics.forEach { it.logOpenAdmin() } } } + + fun logResetPassword(resetPasswordSucceeded: Boolean) { + if (analyticsTrackingInteractor.get()) { + analytics.forEach { it.logResetPassword(resetPasswordSucceeded) } + } + } } diff --git a/app/src/main/java/chat/rocket/android/settings/password/presentation/PasswordPresenter.kt b/app/src/main/java/chat/rocket/android/settings/password/presentation/PasswordPresenter.kt index 81a09e51e1..edc501f060 100644 --- a/app/src/main/java/chat/rocket/android/settings/password/presentation/PasswordPresenter.kt +++ b/app/src/main/java/chat/rocket/android/settings/password/presentation/PasswordPresenter.kt @@ -1,5 +1,6 @@ package chat.rocket.android.settings.password.presentation +import chat.rocket.android.analytics.AnalyticsManager import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.infraestructure.RocketChatClientFactory @@ -14,6 +15,7 @@ import javax.inject.Inject class PasswordPresenter @Inject constructor( private val view: PasswordView, private val strategy: CancelStrategy, + private val analyticsManager: AnalyticsManager, serverInteractor: GetCurrentServerInteractor, factory: RocketChatClientFactory ) { @@ -30,10 +32,12 @@ class PasswordPresenter @Inject constructor( client.updateProfile(me.id, null, null, password, null) } + analyticsManager.logResetPassword(true) view.showPasswordSuccessfullyUpdatedMessage() - view.hideLoading() } catch (exception: RocketChatException) { + analyticsManager.logResetPassword(false) view.showPasswordFailsUpdateMessage(exception.message) + } finally { view.hideLoading() } } diff --git a/app/src/play/java/chat/rocket/android/analytics/AnswersAnalytics.kt b/app/src/play/java/chat/rocket/android/analytics/AnswersAnalytics.kt index cf23161ce6..8a9a30277e 100644 --- a/app/src/play/java/chat/rocket/android/analytics/AnswersAnalytics.kt +++ b/app/src/play/java/chat/rocket/android/analytics/AnswersAnalytics.kt @@ -67,4 +67,11 @@ class AnswersAnalytics : Analytics { ) override fun logOpenAdmin() = Answers.getInstance().logCustom(CustomEvent("open_admin")) + + override fun logResetPassword(resetPasswordSucceeded: Boolean) = + Answers.getInstance() + .logCustom( + CustomEvent("reset_password") + .putCustomAttribute("resetPasswordSucceeded", resetPasswordSucceeded.toString()) + ) } diff --git a/app/src/play/java/chat/rocket/android/analytics/GoogleAnalyticsForFirebase.kt b/app/src/play/java/chat/rocket/android/analytics/GoogleAnalyticsForFirebase.kt index f8b6556291..71a5170391 100644 --- a/app/src/play/java/chat/rocket/android/analytics/GoogleAnalyticsForFirebase.kt +++ b/app/src/play/java/chat/rocket/android/analytics/GoogleAnalyticsForFirebase.kt @@ -60,4 +60,9 @@ class GoogleAnalyticsForFirebase @Inject constructor(val context: Context) : } override fun logOpenAdmin() = firebaseAnalytics.logEvent("open_admin", null) + + override fun logResetPassword(resetPasswordSucceeded: Boolean) = + firebaseAnalytics.logEvent("reset_password", Bundle(1).apply { + putBoolean("resetPasswordSucceeded", resetPasswordSucceeded) + }) } From c03782fc23d93ee646f38c106e64565d283e3a90 Mon Sep 17 00:00:00 2001 From: Govind Dixit <32304546+GOVINDDIXIT@users.noreply.github.com> Date: Mon, 5 Nov 2018 22:20:20 +0530 Subject: [PATCH 003/149] feat: rate app on playstore --- .../android/settings/ui/SettingsFragment.kt | 18 ++++++++++++++++++ app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 20 insertions(+) diff --git a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt index ba98112af4..5c2b2fce00 100644 --- a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt +++ b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt @@ -1,6 +1,8 @@ package chat.rocket.android.settings.ui +import android.content.ActivityNotFoundException import android.content.Intent +import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -75,6 +77,22 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen AboutFragment.newInstance() } } + resources.getString(R.string.title_rate_us) -> + startAppPlayStore() + } + } + + fun getMarketAppLink(): String { + return "market://details?id=chat.rocket.android" + } + fun getMarketWebLink(): String { + return "https://play.google.com/store/apps/details?id=chat.rocket.android" + } + private fun startAppPlayStore() { + try { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getMarketAppLink()))) + } catch (error: ActivityNotFoundException) { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getMarketWebLink()))) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c4a98a25eb..e7b25a35da 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,6 +27,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Settings Preferences Change Password + Rate Us Admin panel Change Password Update profile @@ -70,6 +71,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Preferences Change Password About + Rate Us From fdc55abda310fef1fbc384598e99bf2732e0d6cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Rutkowski?= Date: Mon, 5 Nov 2018 18:01:53 +0100 Subject: [PATCH 004/149] Displays users who reacted in dialog --- .../presentation/ChatRoomPresenter.kt | 4 --- .../chatroom/presentation/ChatRoomView.kt | 2 -- .../android/chatroom/ui/ChatRoomFragment.kt | 29 ++++--------------- app/src/main/res/values-de/strings.xml | 3 -- app/src/main/res/values-es/strings.xml | 3 -- app/src/main/res/values-fr/strings.xml | 3 -- app/src/main/res/values-ja/strings.xml | 3 -- app/src/main/res/values-pt-rBR/strings.xml | 3 -- app/src/main/res/values-ru-rRU/strings.xml | 3 -- app/src/main/res/values-tr/strings.xml | 3 -- app/src/main/res/values-uk/strings.xml | 3 -- app/src/main/res/values/strings.xml | 4 +-- 12 files changed, 6 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt index 8108c52a9b..be1bea6af1 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt @@ -1084,10 +1084,6 @@ class ChatRoomPresenter @Inject constructor( view.showReactionsPopup(messageId) } - fun showReactionsSummary(emojiShortname: String, usernames: List) { - view.showReactionsSummary(emojiShortname, usernames, currentLoggedUsername) - } - fun loadCommands() { launchUI(strategy) { try { diff --git a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt index b894687fe3..7b226e62cb 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt @@ -140,8 +140,6 @@ interface ChatRoomView : LoadingView, MessageView { fun showReactionsPopup(messageId: String) - fun showReactionsSummary(emojiShortname: String, usernames: List, currentLoggedUsername: String?) - /** * Show list of commands. * diff --git a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt index 92c12651d8..2ecd604bd7 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt @@ -666,30 +666,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR } override fun onReactionLongClicked(emojiShortname: String, usernames: List) { - presenter.showReactionsSummary(emojiShortname, usernames) - } - - override fun showReactionsSummary(emojiShortname: String, usernames: List, currentLoggedUsername: String?) { - var usernamesString = usernames.asSequence() - .take(15) - .joinToString { username -> - if (username == currentLoggedUsername) { - getString(R.string.msg_you).toLowerCase() - } else { - "@$username" - } - } - if (usernames.size > 15) { - usernamesString += " " + getString(R.string.And_more, usernames.size - 15).toLowerCase() - } else { - usernamesString = usernamesString.replace(""",([^,]+)$""".toRegex()) { - " ${getString(R.string.and)}${it.groupValues[1]}" - } - } - if (usernamesString[0] != '@') { - usernamesString = usernamesString.capitalize() - } - showToast("$usernamesString ${getString(R.string.Reacted_with).toLowerCase()} $emojiShortname", Toast.LENGTH_LONG) + AlertDialog.Builder(requireContext()) + .setTitle(EmojiParser.parse(requireContext(), getString(R.string.alert_title_reactions_by, emojiShortname))) + .setItems(usernames.toTypedArray(), null) + .setPositiveButton(R.string.msg_ok, null) + .show() } override fun showReactionsPopup(messageId: String) { diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 729d2bae73..5ff7c7f495 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -282,9 +282,6 @@ Keine letzten Emojis Standart Hautton - Und %1$d mehr - und - Reagierte mit Sortiere diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3503f098a2..3269ccd08e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -278,9 +278,6 @@ Sin emojis recientes Tono de piel predeterminado - Y %1$d mas - y - Reacciono con Ordenar diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3758e725c2..26a74b7104 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -286,9 +286,6 @@ Aucun emoji récent Tonalité de peau par défaut - et encore %1$d - et - a réagi avec Trier diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 82121ba3d7..0b4f6eed2e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -288,9 +288,6 @@ 最近の絵文字はありません デフォルトスキントークン - さらに %1$d - - がリアクションしています ソート diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 0a0c1bce5f..8faee241e6 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -283,9 +283,6 @@ Nenhum emoji recente Tom de pele padrão - E mais %1$d - e - Reagiu com Ordenar diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index eae723c8f1..fb7541bc5d 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -279,9 +279,6 @@ Пусто Тон кожи по умолчанию - И еще %1$d - и - Реагирует с Сортировать diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index a7257cc9e9..cee409697a 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -285,9 +285,6 @@ Son kullanılan emoji bulunmamaktadır Varsayılan tasarım tonu - Ve %1$d kadar daha fazla - ve - ile reaksiyona sokulur Sırala diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index f584c76695..b3fd14faa2 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -282,9 +282,6 @@ Пусто Тон шкіри за замовчуванням - І ще %1$d - і - реагує з Сортувати diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c037d3160..9948e6bd6b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -295,9 +295,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin No recent emojis Default skin tone - And %1$d more - and - Reacted with + %1$s reactions by Sort From 39d016dcb813d81218ebf810857ef4617ebcef88 Mon Sep 17 00:00:00 2001 From: Govind Dixit <32304546+GOVINDDIXIT@users.noreply.github.com> Date: Mon, 5 Nov 2018 22:20:20 +0530 Subject: [PATCH 005/149] feat: add sharing feature --- .../rocket/android/settings/ui/SettingsFragment.kt | 12 ++++++++++++ app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 14 insertions(+) diff --git a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt index ba98112af4..0cf268e9d8 100644 --- a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt +++ b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt @@ -1,6 +1,8 @@ package chat.rocket.android.settings.ui +import android.content.ActivityNotFoundException import android.content.Intent +import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -75,6 +77,16 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen AboutFragment.newInstance() } } + resources.getString(R.string.title_share_the_app) ->{ + val shareIntent = Intent(Intent.ACTION_SEND) + shareIntent.type = "text/plain" + val shareBody = "Check This Out" + val shareSub = "https://play.google.com/store/apps/details?id=chat.rocket.android" + shareIntent.putExtra(Intent.EXTRA_SUBJECT, shareBody) + shareIntent.putExtra(Intent.EXTRA_TEXT, shareSub) + startActivity(Intent.createChooser(shareIntent, "Share Using")) + } + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c4a98a25eb..ee59369545 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,6 +31,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Change Password Update profile About + Share App Create Channel Are You Sure you want to logout? @@ -70,6 +71,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Preferences Change Password About + Share App From dc75f75eb25c6694f70cdb9b3b1fc2873c205728 Mon Sep 17 00:00:00 2001 From: Filipe de Lima Brito Date: Tue, 6 Nov 2018 15:30:44 -0800 Subject: [PATCH 006/149] Adds delete own account. --- .../rocket/android/main/ui/MainActivity.kt | 10 ++--- .../profile/presentation/ProfilePresenter.kt | 21 ++++++++++ .../android/profile/ui/ProfileFragment.kt | 41 ++++++++++++++++++- app/src/main/res/menu/action_mode_profile.xml | 9 ++++ app/src/main/res/menu/profile.xml | 9 ++-- app/src/main/res/values-de/strings.xml | 4 +- app/src/main/res/values-es/strings.xml | 5 ++- app/src/main/res/values-fr/strings.xml | 6 +-- app/src/main/res/values-hi-rIN/strings.xml | 5 +-- app/src/main/res/values-ja/strings.xml | 5 +-- app/src/main/res/values-pt-rBR/strings.xml | 15 ++++--- app/src/main/res/values-ru-rRU/strings.xml | 5 +-- app/src/main/res/values-tr/strings.xml | 5 +-- app/src/main/res/values-uk/strings.xml | 5 +-- app/src/main/res/values/strings.xml | 4 +- .../rocket/android/util/extension/Text.kt | 14 +++++++ 16 files changed, 120 insertions(+), 43 deletions(-) create mode 100644 app/src/main/res/menu/action_mode_profile.xml create mode 100644 util/src/main/java/chat/rocket/android/util/extension/Text.kt diff --git a/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt b/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt index 602a558e7e..5013b92d91 100644 --- a/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt +++ b/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt @@ -234,11 +234,11 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector, fun showLogoutDialog() { val builder = AlertDialog.Builder(this) - builder.setTitle(R.string.action_logout) - builder.setMessage(R.string.title_confirmation) - builder.setPositiveButton(R.string.action_logout) { _, _ -> presenter.logout()} - .setNegativeButton(R.string.action_stay) { dialog, _ -> dialog.cancel() } - builder.create().show() + builder.setTitle(R.string.title_are_you_sure) + .setPositiveButton(R.string.action_logout) { _, _ -> presenter.logout()} + .setNegativeButton(android.R.string.no) { dialog, _ -> dialog.cancel() } + .create() + .show() } fun setAvatar(avatarUrl: String) { diff --git a/app/src/main/java/chat/rocket/android/profile/presentation/ProfilePresenter.kt b/app/src/main/java/chat/rocket/android/profile/presentation/ProfilePresenter.kt index 4adc8db97a..7487097d63 100644 --- a/app/src/main/java/chat/rocket/android/profile/presentation/ProfilePresenter.kt +++ b/app/src/main/java/chat/rocket/android/profile/presentation/ProfilePresenter.kt @@ -9,15 +9,19 @@ import chat.rocket.android.helper.UserHelper import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.util.extension.compressImageAndGetByteArray +import chat.rocket.android.util.extension.gethash import chat.rocket.android.util.extension.launchUI +import chat.rocket.android.util.extension.toHex import chat.rocket.android.util.extensions.avatarUrl import chat.rocket.android.util.retryIO import chat.rocket.common.RocketChatException import chat.rocket.common.util.ifNull import chat.rocket.core.RocketChatClient +import chat.rocket.core.internal.rest.deleteOwnAccount import chat.rocket.core.internal.rest.resetAvatar import chat.rocket.core.internal.rest.setAvatar import chat.rocket.core.internal.rest.updateProfile +import java.lang.Exception import java.util.* import javax.inject.Inject @@ -147,4 +151,21 @@ class ProfilePresenter @Inject constructor( } } } + + fun deleteAccount(password: String) { + launchUI(strategy) { + view.showLoading() + try { + retryIO { client.deleteOwnAccount(password.gethash().toHex()) } + } catch (exception: Exception) { + exception.message?.let { + view.showMessage(it) + }.ifNull { + view.showGenericErrorMessage() + } + } finally { + view.hideLoading() + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt b/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt index 4d6585e2be..deef89b05b 100644 --- a/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt +++ b/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt @@ -2,6 +2,7 @@ package chat.rocket.android.profile.ui import DrawableHelper import android.app.Activity +import android.app.AlertDialog import android.content.Intent import android.graphics.Bitmap import android.os.Build @@ -11,6 +12,8 @@ import android.view.Menu import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.view.MenuInflater +import android.widget.EditText import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode import androidx.core.net.toUri @@ -61,6 +64,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { override fun onCreate(savedInstanceState: Bundle?) { AndroidSupportInjection.inject(this) super.onCreate(savedInstanceState) + setHasOptionsMenu(true) } override fun onCreateView( @@ -98,6 +102,25 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { } } + override fun onPrepareOptionsMenu(menu: Menu) { + if (actionMode != null) { + menu.clear() + } + super.onPrepareOptionsMenu(menu) + } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + super.onCreateOptionsMenu(menu, inflater) + inflater.inflate(R.menu.profile, menu) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.action_delete_account -> showDeleteAccountDialog() + } + return true + } + override fun showProfile(avatarUrl: String, name: String, username: String, email: String?) { ui { image_avatar.setImageURI(avatarUrl) @@ -148,7 +171,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error)) override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { - mode.menuInflater.inflate(R.menu.profile, menu) + mode.menuInflater.inflate(R.menu.action_mode_profile, menu) mode.title = getString(R.string.title_update_profile) return true } @@ -239,6 +262,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { text_username.toString() != currentUsername || text_email.toString() != currentEmail) }.subscribe { isValid -> + activity?.invalidateOptionsMenu() if (isValid) { startActionMode() } else { @@ -264,4 +288,19 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { text_email.isEnabled = value } } + + fun showDeleteAccountDialog() { + val passwordEditText = EditText(context) + passwordEditText.hint = getString(R.string.msg_password) + + val builder = AlertDialog.Builder(context) + builder.setTitle(R.string.title_are_you_sure) + .setView(passwordEditText) + .setPositiveButton(R.string.action_delete_account) { _, _ -> + presenter.deleteAccount(passwordEditText.text.toString()) + } + .setNegativeButton(android.R.string.no) { dialog, _ -> dialog.cancel() } + .create() + .show() + } } diff --git a/app/src/main/res/menu/action_mode_profile.xml b/app/src/main/res/menu/action_mode_profile.xml new file mode 100644 index 0000000000..fc6815b62e --- /dev/null +++ b/app/src/main/res/menu/action_mode_profile.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/profile.xml b/app/src/main/res/menu/profile.xml index fc6815b62e..07b62474d7 100644 --- a/app/src/main/res/menu/profile.xml +++ b/app/src/main/res/menu/profile.xml @@ -1,9 +1,10 @@ - + + android:id="@+id/action_delete_account" + android:title="@string/action_delete_account" + app:showAsAction="never" /> \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5ff7c7f495..a4cad31a16 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -20,7 +20,7 @@ Update Profil Über Erstelle Raum - Are You Sure you want to logout? + Are you sure? Verbinde @@ -33,7 +33,6 @@ Erstelle Raum Erstelle Abmelden - Stay Dateien Bestätige Passwort Änderung Trete Chat bei @@ -52,6 +51,7 @@ Create a new server Register Confirm + Delete account diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3269ccd08e..d9f870092b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -19,7 +19,8 @@ Actualización del perfil Acerca de Crear canal - Are You Sure you want to logout? + Are you sure? + Conectar Usa este nombre de usuario @@ -31,7 +32,6 @@ Crear canal Create Cerrar sesión - Stay Archivos Confirmar cambio de contraseña Unirse al chat @@ -50,6 +50,7 @@ Create a new server Register Confirm + Delete account diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 26a74b7104..29c9a3e487 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -20,9 +20,7 @@ Mettre à jour le profil À propos Créer salon - Are You Sure you want to logout? - - + Are you sure? Se connecter @@ -35,7 +33,6 @@ Créer salon Créer Se déconnecter - Stay Fichiers Confirmer le mot de passe Rejoignez le chat @@ -54,6 +51,7 @@ Create a new server Register Confirm + Delete account diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index a2145c7340..1317dc4441 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -20,8 +20,7 @@ प्रोफ़ाइल अपडेट करें परिचय चैनल बनाएं - Are You Sure you want to logout? - + Are you sure? जुडिये @@ -34,7 +33,6 @@ चैनल बनाएं बनाएं लोग आउट करें - Stay फ़ाइलें पासवर्ड परिवर्तन की पुष्टि करें चैट में शामिल हों @@ -53,6 +51,7 @@ नया सर्वर बनाएं रजिस्टर पुष्टि करें + Delete account diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 0b4f6eed2e..6d3ee7137d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -22,8 +22,7 @@ プロフィールの更新 About 新しいチャネルを作成します - Are You Sure you want to logout? - + Are you sure? 接続 @@ -36,7 +35,6 @@ チャンネル作成 作ります ログアウト - Stay ファイル 変更したパスワードの確認 チャットに参加 @@ -55,6 +53,7 @@ Create a new server Register Confirm + Delete account diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 8faee241e6..11869bf800 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -20,8 +20,7 @@ Editar perfil Sobre Criar chat - Are You Sure you want to logout? - + Você tem certeza? Conectar @@ -34,7 +33,6 @@ Criar chat Criar Sair - Stay Arquivos Confirme a nova senha Entrar no Chat @@ -48,11 +46,12 @@ Escolher foto da galeria Tirar foto Resetar avatar - Connect with a server - Join in the community - Create a new server - Register - Confirm + Conectar com um servidor + Junte-se à comunidade + Criar um novo servidor + Registrar + Confirmar + Deletar conta diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index fb7541bc5d..bd698704bc 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -20,8 +20,7 @@ Обновить профиль О программе Создать новый канал - Вы действительно хотите выйти? - + Are you sure? Подключиться @@ -34,7 +33,6 @@ Создать канал Создать Выйти - Остаться Файлы Подтверждение изменения пароля Присоединиться к чату @@ -53,6 +51,7 @@ Создать новый сервер Зарегистрировать Подтвердить + Delete account diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index cee409697a..c4c5019857 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -20,8 +20,7 @@ Profilinizi Düzenleyin Hakkında Yeni Kanal Oluştur - Are You Sure you want to logout? - + Are you sure? Bağlan @@ -34,7 +33,6 @@ Yeni Kanal Oluştur Oluştur Çıkış Yap - Stay Dosyalar Şifre Değişikliğini Onaylayın Sohbete Bağlan @@ -53,6 +51,7 @@ Create a new server Register Confirm + Delete account diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b3fd14faa2..9b1d4fabd4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -20,8 +20,7 @@ Оновити профіль "Про програму" Створити новий канал - Are You Sure you want to logout? - + Are you sure? Підключитися @@ -34,7 +33,6 @@ Створити канал Створити Вийти - Stay Файли Підтвердження зміни пароля Приєднатися до чату @@ -53,6 +51,7 @@ Create a new server Register Confirm + Delete account diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c4a98a25eb..45e98d3a93 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,7 +32,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Update profile About Create Channel - Are You Sure you want to logout? + Are you sure? Connect @@ -45,7 +45,6 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Create channel Create Logout - Stay Files Confirm Password Change Join Chat @@ -64,6 +63,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Create a new server Register Confirm + Delete account diff --git a/util/src/main/java/chat/rocket/android/util/extension/Text.kt b/util/src/main/java/chat/rocket/android/util/extension/Text.kt new file mode 100644 index 0000000000..8435a4472e --- /dev/null +++ b/util/src/main/java/chat/rocket/android/util/extension/Text.kt @@ -0,0 +1,14 @@ +package chat.rocket.android.util.extension + +import java.math.BigInteger +import java.security.MessageDigest +import java.security.NoSuchAlgorithmException + +@Throws(NoSuchAlgorithmException::class) +fun String.gethash(): ByteArray { + val digest = MessageDigest.getInstance("SHA-256") + digest.reset() + return digest.digest(this.toByteArray()) +} + +fun ByteArray.toHex(): String = String.format("%0" + this.size * 2 + "X", BigInteger(1, this)) From f634f66112b6d50ce200080251ad3b9286e88cd0 Mon Sep 17 00:00:00 2001 From: Govind Dixit <32304546+GOVINDDIXIT@users.noreply.github.com> Date: Wed, 7 Nov 2018 22:44:06 +0530 Subject: [PATCH 007/149] add sharing feature --- .../chat/rocket/android/settings/ui/SettingsFragment.kt | 6 +++--- app/src/main/res/values/strings.xml | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt index 0cf268e9d8..4c78ed45ce 100644 --- a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt +++ b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt @@ -80,11 +80,11 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen resources.getString(R.string.title_share_the_app) ->{ val shareIntent = Intent(Intent.ACTION_SEND) shareIntent.type = "text/plain" - val shareBody = "Check This Out" - val shareSub = "https://play.google.com/store/apps/details?id=chat.rocket.android" + val shareBody = getString(R.string.check_this_out) + val shareSub = getString(R.string.play_store_link) shareIntent.putExtra(Intent.EXTRA_SUBJECT, shareBody) shareIntent.putExtra(Intent.EXTRA_TEXT, shareSub) - startActivity(Intent.createChooser(shareIntent, "Share Using")) + startActivity(Intent.createChooser(shareIntent, getString(R.string.share_using))) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ee59369545..c6bc25c02a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -77,6 +77,8 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Sorry, an error has occurred, please try again No data to display + Check this out + Share using Profile update successfully username Username or email @@ -315,6 +317,9 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Live Chats Unknown + + "https://play.google.com/store/apps/details?id=chat.rocket.android" + Edit shared message REPLY From 93c59c6de463438d4a0ad27d75fb676e98485e0c Mon Sep 17 00:00:00 2001 From: Govind Dixit <32304546+GOVINDDIXIT@users.noreply.github.com> Date: Thu, 8 Nov 2018 00:03:04 +0530 Subject: [PATCH 008/149] update all string.xml files --- .../java/chat/rocket/android/settings/ui/SettingsFragment.kt | 4 ++-- app/src/main/res/values-de/strings.xml | 3 +++ app/src/main/res/values-es/strings.xml | 3 +++ app/src/main/res/values-fr/strings.xml | 4 ++++ app/src/main/res/values-hi-rIN/strings.xml | 3 +++ app/src/main/res/values-ja/strings.xml | 3 +++ app/src/main/res/values-pt-rBR/strings.xml | 3 +++ app/src/main/res/values-ru-rRU/strings.xml | 3 +++ app/src/main/res/values-tr/strings.xml | 4 ++++ app/src/main/res/values-uk/strings.xml | 3 +++ app/src/main/res/values/strings.xml | 4 ++-- 11 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt index 4c78ed45ce..4ae0e9f4d5 100644 --- a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt +++ b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt @@ -80,11 +80,11 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen resources.getString(R.string.title_share_the_app) ->{ val shareIntent = Intent(Intent.ACTION_SEND) shareIntent.type = "text/plain" - val shareBody = getString(R.string.check_this_out) + val shareBody = getString(R.string.msg_check_this_out) val shareSub = getString(R.string.play_store_link) shareIntent.putExtra(Intent.EXTRA_SUBJECT, shareBody) shareIntent.putExtra(Intent.EXTRA_TEXT, shareSub) - startActivity(Intent.createChooser(shareIntent, getString(R.string.share_using))) + startActivity(Intent.createChooser(shareIntent, getString(R.string.msg_share_using))) } } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5ff7c7f495..c92617e50a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -58,11 +58,14 @@ Preferences Ändere Passwort Über + App teilen Entschuldigung, ein Fehler ist aufgetreten, bitte versuchen Sie es noch einmal. Keine Anzeigedaten vorhanden + Schau dir das an + Teilen Sie mit Profil update erfolgreich Benutzername Benutzername oder E-Mail diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3269ccd08e..8f265ae277 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -56,11 +56,14 @@ Preferences Cambia la contraseña Acerca de + Compartir aplicación Lo sentimos, ha ocurrido un error, por favor intente de nuevo No hay información para mostrar + Mira esto + Compartir usando Actualización de perfil con éxito usuario Nombre de usuario o correo electrónico diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 26a74b7104..eb819640c1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -60,11 +60,15 @@ Préférences Changer le mot de passe À propos + Partager l'application + Désolé, une erreur s\'est produite. Veuillez réessayer Aucune donnée à afficher + regarde ça + Partager en utilisant Mise à jour du profil avec succès nom d\'utilisateur Nom d\'utilisateur ou email diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index a2145c7340..cc2fb5b99a 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -59,11 +59,14 @@ प्राथमिकताएँ पासवर्ड बदलें परिचय + ऐप शेयर करें क्षमा करें, एक त्रुटि हुई है, कृपया पुनः प्रयास करें डेटा प्रदर्शित करने के लिए उपलब्ध नहीं हैं + इसकी जांच करें + उपयोग कर साझा करें प्रोफ़ाइल सफलतापूर्वक अपडेट हो गया है यूजरनेम यूजरनेम या ईमेल diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 0b4f6eed2e..0d7430e994 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -61,11 +61,14 @@ Preferences Change Password About + アプリを共有する エラーが発生しました。もう一度お試しください。 表示するデータがありません + これをチェックする + 共有する プロフィールの更新に成功しました ユーザー名 メールアドレスまたはユーザー名 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 8faee241e6..5825daff8b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -59,11 +59,14 @@ Preferencias Alterar senha Sobre + Compartilhe o aplicativo Desculpe, ocorreu um erro, tente novamente Nenhum dado para exibir + Veja isso + compartilhar usando Perfil atualizado com sucesso nome de usuário Nome de usuário ou email diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index fb7541bc5d..a4c1559ed5 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -59,11 +59,14 @@ Персональные Изменить пароль О программе + добавить приложение Произошла ошибка, повторите попытку. Нет данных для отображения + Проверь это + Совместное использование Профиль успешно обновлен имя пользователя имя пользователя или e-mail diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index cee409697a..01fff9f729 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -59,11 +59,15 @@ Tercihler Şifre Değiştir Hakkında + uygulamayı Paylaş + Üzgünüz! bir hata oluştu. Lütfen daha sonra tekrar deneyiniz. Görüntülenecek veri bulunmamaktadır. + bunu kontrol et + kullanarak paylaş Profil bilgileri başarıyla güncellenmiştir. kullanıcı adı kullanıcı adı veya eposta diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b3fd14faa2..9b7b8a52ea 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -59,11 +59,14 @@ Preferences Change Password About + поділитися прикладом Сталася помилка, спробуйте ще раз. Немає даних для відображення + Перевір це + поділитися використанням "Профіль оновлено успішно " Ім\'я користувача Ім\'я користувача або e-mail diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c6bc25c02a..0741b7430d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -77,8 +77,8 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Sorry, an error has occurred, please try again No data to display - Check this out - Share using + Check this out + Share using Profile update successfully username Username or email From c89d9c0589bf697c6382ebb06b66bdc09d2810ad Mon Sep 17 00:00:00 2001 From: Govind Dixit <32304546+GOVINDDIXIT@users.noreply.github.com> Date: Thu, 8 Nov 2018 00:39:22 +0530 Subject: [PATCH 009/149] fix build failure --- app/src/main/res/values-fr/strings.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index eb819640c1..eb6efbd670 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -60,8 +60,7 @@ Préférences Changer le mot de passe À propos - Partager l'application - + Partager l\'application From b90269c177c892b92132c946c6cd33916a83a323 Mon Sep 17 00:00:00 2001 From: Govind Dixit <32304546+GOVINDDIXIT@users.noreply.github.com> Date: Thu, 8 Nov 2018 01:43:24 +0530 Subject: [PATCH 010/149] fix build failure --- app/src/main/res/values-de/strings.xml | 3 +++ app/src/main/res/values-es/strings.xml | 3 +++ app/src/main/res/values-fr/strings.xml | 3 +++ app/src/main/res/values-hi-rIN/strings.xml | 3 +++ app/src/main/res/values-ja/strings.xml | 3 +++ app/src/main/res/values-pt-rBR/strings.xml | 3 +++ app/src/main/res/values-ru-rRU/strings.xml | 3 +++ app/src/main/res/values-tr/strings.xml | 3 +++ app/src/main/res/values-uk/strings.xml | 3 +++ app/src/main/res/values/strings.xml | 1 - 10 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c92617e50a..fa9ccaef01 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -303,6 +303,9 @@ Live Chats Unbekannt + + "https://play.google.com/store/apps/details?id=chat.rocket.android" + Bearbeite geteilte Nachricht Antworten diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 8f265ae277..6b3327086b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -299,6 +299,9 @@ Chats en vivo Desconocido + + "https://play.google.com/store/apps/details?id=chat.rocket.android" + Edita mensaje compartido RESPUESTA diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index eb6efbd670..a7c85de883 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -307,6 +307,9 @@ Chats en direct Inconnu + + "https://play.google.com/store/apps/details?id=chat.rocket.android" + Modifier le message partagé RÉPONDRE diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index cc2fb5b99a..edc54458ee 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -305,6 +305,9 @@ लाइव चैट अज्ञात + + "https://play.google.com/store/apps/details?id=chat.rocket.android" + साझा संदेश संपादित करें जवाब diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 0d7430e994..94c6f89cbf 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -310,6 +310,9 @@ ライブチャット 不明 + + "https://play.google.com/store/apps/details?id=chat.rocket.android" + Edit shared message 返信 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 5825daff8b..db917ea48f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -304,6 +304,9 @@ Live Chats Desconhecido + + "https://play.google.com/store/apps/details?id=chat.rocket.android" + Editar mensagem compartilhada RESPONDER diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index a4c1559ed5..912cdb390b 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -300,6 +300,9 @@ Живые чаты Неизвестные + + "https://play.google.com/store/apps/details?id=chat.rocket.android" + Редактировать сообщение ОТВЕТИТЬ diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 01fff9f729..77bdfefe7f 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -307,6 +307,9 @@ Canlı Sohbetler Bilinmeyen + + "https://play.google.com/store/apps/details?id=chat.rocket.android" + Paylaşılan mesajı düzenle YANITLA diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 9b7b8a52ea..87e0c528b1 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -303,6 +303,9 @@ Живі чати Невідомі + + "https://play.google.com/store/apps/details?id=chat.rocket.android" + Редагувати повідомлення ВІДПОВІСТИ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0741b7430d..50d88f11b6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,7 +31,6 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Change Password Update profile About - Share App Create Channel Are You Sure you want to logout? From 2c973cc25cc39a9e40205f6737469eb26b0aee33 Mon Sep 17 00:00:00 2001 From: Govind Dixit <32304546+GOVINDDIXIT@users.noreply.github.com> Date: Thu, 8 Nov 2018 01:56:06 +0530 Subject: [PATCH 011/149] fix build failure --- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-hi-rIN/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-ru-rRU/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 4 ++-- app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 10 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index fa9ccaef01..3fff4b3a58 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -3,6 +3,7 @@ Anmelden am Server Anmelden + App teilen Registriere Benutzernamen Passwort zurücksetzen registrieren diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 6b3327086b..5759d8c990 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -2,6 +2,7 @@ Inicia sesión en tu servidor Iniciar sesión + Compartir aplicación Registrar nombre de usuario Restablecer la contraseña Regístrate diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a7c85de883..c5767d38b0 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -3,6 +3,7 @@ Connectez-vous sur votre serveur S\'identifier + Partager l\'application Enregistrer le nom d\'utilisateur Réinitialiser mot de passe S\'inscrire diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index edc54458ee..51a6f973f1 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -3,6 +3,7 @@ अपने सर्वर में साइन इन करें लॉग इन करें + ऐप शेयर करे रजिस्टर उपयोगकर्ता नाम पासवर्ड रीसेट करें साइन अप करें diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 94c6f89cbf..c0a04c38b8 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -5,6 +5,7 @@ サーバーに接続 ログイン + アプリを共有する ユーザー名を登録する パスワードリセット サインアップ diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index db917ea48f..fe01f89e9a 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -3,6 +3,7 @@ Faça login no seu servidor Entrar + Compartilhe o aplicativo Registre o nome de usuário Redefinir senha Inscreva-se diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 912cdb390b..cc576b8ca0 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -3,6 +3,7 @@ Ваш сервер Войти + добавить приложение Зарегистрировать имя Сброс пароля Зарегистрироваться diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 77bdfefe7f..99aff3cffb 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -3,6 +3,7 @@ Sunucunuza Bağlantı Kurun Giriş Yapın + uygulamayı Paylaş Kullanıcı Adıyla Kaydolun Şifre Sıfırlama Kayıt Olun @@ -59,8 +60,7 @@ Tercihler Şifre Değiştir Hakkında - uygulamayı Paylaş - + uygulamayı Paylaş diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 87e0c528b1..8105f29e58 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -3,6 +3,7 @@ Ваш сервер Увійти + поділитися прикладом Зареєструвати ім\'я Відновлення паролю Зареєструватися diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 50d88f11b6..49cc26d2f6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Sign in to your server Login + Share App Register username Reset password Sign up From bee2392e5886a826ec391ff21a7cb670866c8e7a Mon Sep 17 00:00:00 2001 From: Govind Dixit <32304546+GOVINDDIXIT@users.noreply.github.com> Date: Thu, 8 Nov 2018 08:31:34 +0530 Subject: [PATCH 012/149] add app link to default.xml --- app/src/main/res/values-de/strings.xml | 3 --- app/src/main/res/values-es/strings.xml | 3 --- app/src/main/res/values-fr/strings.xml | 3 --- app/src/main/res/values-hi-rIN/strings.xml | 3 --- app/src/main/res/values-ja/strings.xml | 3 --- app/src/main/res/values-pt-rBR/strings.xml | 3 --- app/src/main/res/values-ru-rRU/strings.xml | 3 --- app/src/main/res/values-tr/strings.xml | 3 --- app/src/main/res/values-uk/strings.xml | 3 --- app/src/main/res/values/defaults.xml | 1 + app/src/main/res/values/strings.xml | 3 --- 11 files changed, 1 insertion(+), 30 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3fff4b3a58..ea58275e2d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -304,9 +304,6 @@ Live Chats Unbekannt - - "https://play.google.com/store/apps/details?id=chat.rocket.android" - Bearbeite geteilte Nachricht Antworten diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5759d8c990..accbd13a4a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -300,9 +300,6 @@ Chats en vivo Desconocido - - "https://play.google.com/store/apps/details?id=chat.rocket.android" - Edita mensaje compartido RESPUESTA diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c5767d38b0..d17a441874 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -308,9 +308,6 @@ Chats en direct Inconnu - - "https://play.google.com/store/apps/details?id=chat.rocket.android" - Modifier le message partagé RÉPONDRE diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index 51a6f973f1..c6734206dd 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -306,9 +306,6 @@ लाइव चैट अज्ञात - - "https://play.google.com/store/apps/details?id=chat.rocket.android" - साझा संदेश संपादित करें जवाब diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index c0a04c38b8..6b232a90c6 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -311,9 +311,6 @@ ライブチャット 不明 - - "https://play.google.com/store/apps/details?id=chat.rocket.android" - Edit shared message 返信 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index fe01f89e9a..dbcc08ada9 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -305,9 +305,6 @@ Live Chats Desconhecido - - "https://play.google.com/store/apps/details?id=chat.rocket.android" - Editar mensagem compartilhada RESPONDER diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index cc576b8ca0..7fdca105fc 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -301,9 +301,6 @@ Живые чаты Неизвестные - - "https://play.google.com/store/apps/details?id=chat.rocket.android" - Редактировать сообщение ОТВЕТИТЬ diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 99aff3cffb..78afc7cd8f 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -307,9 +307,6 @@ Canlı Sohbetler Bilinmeyen - - "https://play.google.com/store/apps/details?id=chat.rocket.android" - Paylaşılan mesajı düzenle YANITLA diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8105f29e58..2613b224d7 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -304,9 +304,6 @@ Живі чати Невідомі - - "https://play.google.com/store/apps/details?id=chat.rocket.android" - Редагувати повідомлення ВІДПОВІСТИ diff --git a/app/src/main/res/values/defaults.xml b/app/src/main/res/values/defaults.xml index acc8c4d22a..4df7ef4e1a 100644 --- a/app/src/main/res/values/defaults.xml +++ b/app/src/main/res/values/defaults.xml @@ -4,4 +4,5 @@ your-company.rocket.chat open.rocket.chat cloud.rocket.chat/trial + https://play.google.com/store/apps/details?id=chat.rocket.android \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 49cc26d2f6..48415cdc16 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -317,9 +317,6 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Live Chats Unknown - - "https://play.google.com/store/apps/details?id=chat.rocket.android" - Edit shared message REPLY From 9353ef5342dd716a4c58d3a2931a7841852219ef Mon Sep 17 00:00:00 2001 From: Govind Dixit Date: Thu, 8 Nov 2018 10:01:09 +0530 Subject: [PATCH 013/149] Update SettingsFragment.kt --- .../java/chat/rocket/android/settings/ui/SettingsFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt index 4ae0e9f4d5..7712c58467 100644 --- a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt +++ b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt @@ -1,8 +1,6 @@ package chat.rocket.android.settings.ui -import android.content.ActivityNotFoundException import android.content.Intent -import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View From 8d569b843f2ce984d0de02ffcbbb5a4e85fd27a9 Mon Sep 17 00:00:00 2001 From: Rafael Kellermann Streit Date: Thu, 8 Nov 2018 14:00:41 -0200 Subject: [PATCH 014/149] Include Google Play and F-Droid links to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8e50209474..322d3a8c5b 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ This repository contains all the code related to the Android native application of [Rocket.Chat](https://github.com/RocketChat/Rocket.Chat/#about-rocketchat). To send new pull-requests, always use the branch `develop` as base and open an issue with the description of what you want/need to accomplish, if the issue wasn't created yet. +[![](https://user-images.githubusercontent.com/551004/48210434-74c07100-e35e-11e8-8eee-3ba84ffa74d7.png)](https://play.google.com/store/apps/details?id=chat.rocket.android) [![](https://user-images.githubusercontent.com/551004/48210349-50649480-e35e-11e8-97d9-74a4331faf3a.png)](https://f-droid.org/en/packages/chat.rocket.android/) ## How to build From 1db3663a57364e9fabade71964510a94158d0fef Mon Sep 17 00:00:00 2001 From: Rafael Kellermann Streit Date: Thu, 8 Nov 2018 14:01:18 -0200 Subject: [PATCH 015/149] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 322d3a8c5b..2c40056b5e 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,14 @@ [![CircleCI](https://circleci.com/gh/RocketChat/Rocket.Chat.Android/tree/develop.svg?style=shield)](https://circleci.com/gh/RocketChat/Rocket.Chat.Android/tree/develop) [![Build Status](https://travis-ci.org/RocketChat/Rocket.Chat.Android.svg?branch=develop)](https://travis-ci.org/RocketChat/Rocket.Chat.Android) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/a81156a8682e4649994270d3670c3c83)](https://www.codacy.com/app/matheusjardimb/Rocket.Chat.Android) +## Get it from the stores + +[![](https://user-images.githubusercontent.com/551004/48210434-74c07100-e35e-11e8-8eee-3ba84ffa74d7.png)](https://play.google.com/store/apps/details?id=chat.rocket.android) [![](https://user-images.githubusercontent.com/551004/48210349-50649480-e35e-11e8-97d9-74a4331faf3a.png)](https://f-droid.org/en/packages/chat.rocket.android/) + ## Description This repository contains all the code related to the Android native application of [Rocket.Chat](https://github.com/RocketChat/Rocket.Chat/#about-rocketchat). To send new pull-requests, always use the branch `develop` as base and open an issue with the description of what you want/need to accomplish, if the issue wasn't created yet. -[![](https://user-images.githubusercontent.com/551004/48210434-74c07100-e35e-11e8-8eee-3ba84ffa74d7.png)](https://play.google.com/store/apps/details?id=chat.rocket.android) [![](https://user-images.githubusercontent.com/551004/48210349-50649480-e35e-11e8-97d9-74a4331faf3a.png)](https://f-droid.org/en/packages/chat.rocket.android/) - ## How to build - You need to download the latest [Android Studio Preview](https://developer.android.com/studio/preview/) version since the stable IDE version does not support the [JetPack](https://developer.android.com/jetpack/) that is being used on this application. From 6eb4868036b418864c49fc3e4dee27f5e37b83d9 Mon Sep 17 00:00:00 2001 From: Filipe de Lima Brito Date: Thu, 8 Nov 2018 16:07:57 -0800 Subject: [PATCH 016/149] Finishes the delete own account feature. --- .../presentation/OnBoardingPresenter.kt | 13 +- .../server/presentation/ServerPresenter.kt | 12 +- .../main/presentation/MainPresenter.kt | 80 ++++--------- .../android/main/presentation/MainView.kt | 5 +- .../rocket/android/main/ui/MainActivity.kt | 3 +- .../profile/presentation/ProfilePresenter.kt | 33 ++++- .../profile/presentation/ProfileView.kt | 3 +- .../android/profile/ui/ProfileFragment.kt | 3 + .../presentation/CheckServerPresenter.kt | 113 ++++++++++++++++-- .../android/server/presentation/TokenView.kt | 6 + 10 files changed, 184 insertions(+), 87 deletions(-) create mode 100644 app/src/main/java/chat/rocket/android/server/presentation/TokenView.kt diff --git a/app/src/main/java/chat/rocket/android/authentication/onboarding/presentation/OnBoardingPresenter.kt b/app/src/main/java/chat/rocket/android/authentication/onboarding/presentation/OnBoardingPresenter.kt index 5057a3e3ab..23f9f7df02 100644 --- a/app/src/main/java/chat/rocket/android/authentication/onboarding/presentation/OnBoardingPresenter.kt +++ b/app/src/main/java/chat/rocket/android/authentication/onboarding/presentation/OnBoardingPresenter.kt @@ -23,10 +23,17 @@ class OnBoardingPresenter @Inject constructor( private val getAccountsInteractor: GetAccountsInteractor, val settingsInteractor: GetSettingsInteractor, val factory: RocketChatClientFactory -) : CheckServerPresenter(strategy, factory, settingsInteractor) { +) : CheckServerPresenter( + strategy = strategy, + factory = factory, + settingsInteractor = settingsInteractor, + refreshSettingsInteractor = refreshSettingsInteractor +) { fun toSignInToYourServer() = navigator.toSignInToYourServer() + fun toCreateANewServer(createServerUrl: String) = navigator.toWebPage(createServerUrl) + fun connectToCommunityServer(communityServerUrl: String) { connectToServer(communityServerUrl) { if (totalSocialAccountsEnabled == 0 && !isNewAccountCreationEnabled) { @@ -63,8 +70,6 @@ class OnBoardingPresenter @Inject constructor( } } - fun toCreateANewServer(createServerUrl: String) = navigator.toWebPage(createServerUrl) - private fun connectToServer(serverUrl: String, block: () -> Unit) { launchUI(strategy) { // Check if we already have an account for this server... @@ -77,9 +82,9 @@ class OnBoardingPresenter @Inject constructor( try { withContext(DefaultDispatcher) { setupConnectionInfo(serverUrl) - refreshSettingsInteractor.refresh(serverUrl) // preparing next fragment before showing it + refreshServerAccounts() checkEnabledAccounts(serverUrl) checkIfLoginFormIsEnabled() checkIfCreateNewAccountIsEnabled() diff --git a/app/src/main/java/chat/rocket/android/authentication/server/presentation/ServerPresenter.kt b/app/src/main/java/chat/rocket/android/authentication/server/presentation/ServerPresenter.kt index 1ca5909b6d..d294506ff4 100644 --- a/app/src/main/java/chat/rocket/android/authentication/server/presentation/ServerPresenter.kt +++ b/app/src/main/java/chat/rocket/android/authentication/server/presentation/ServerPresenter.kt @@ -25,7 +25,13 @@ class ServerPresenter @Inject constructor( private val getAccountsInteractor: GetAccountsInteractor, val settingsInteractor: GetSettingsInteractor, val factory: RocketChatClientFactory -) : CheckServerPresenter(strategy, factory, settingsInteractor, view) { +) : CheckServerPresenter( + strategy = strategy, + factory = factory, + settingsInteractor = settingsInteractor, + versionCheckView = view, + refreshSettingsInteractor = refreshSettingsInteractor +) { fun checkServer(server: String) { if (!server.isValidUrl()) { @@ -93,9 +99,8 @@ class ServerPresenter @Inject constructor( view.showLoading() try { withContext(DefaultDispatcher) { - refreshSettingsInteractor.refresh(serverUrl) - // preparing next fragment before showing it + refreshServerAccounts() checkEnabledAccounts(serverUrl) checkIfLoginFormIsEnabled() checkIfCreateNewAccountIsEnabled() @@ -112,5 +117,4 @@ class ServerPresenter @Inject constructor( } } } - } \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/main/presentation/MainPresenter.kt b/app/src/main/java/chat/rocket/android/main/presentation/MainPresenter.kt index bb8ad3e93b..e299409ed9 100644 --- a/app/src/main/java/chat/rocket/android/main/presentation/MainPresenter.kt +++ b/app/src/main/java/chat/rocket/android/main/presentation/MainPresenter.kt @@ -1,7 +1,6 @@ package chat.rocket.android.main.presentation import android.content.Context -import chat.rocket.android.R import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.db.DatabaseManagerFactory import chat.rocket.android.emoji.Emoji @@ -36,13 +35,9 @@ import chat.rocket.common.model.UserStatus import chat.rocket.common.util.ifNull import chat.rocket.core.RocketChatClient import chat.rocket.core.internal.rest.getCustomEmojis -import chat.rocket.core.internal.rest.logout import chat.rocket.core.internal.rest.me -import chat.rocket.core.internal.rest.unregisterPushToken import chat.rocket.core.model.Myself -import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.channels.Channel -import kotlinx.coroutines.experimental.withContext import timber.log.Timber import javax.inject.Inject @@ -51,23 +46,33 @@ class MainPresenter @Inject constructor( private val strategy: CancelStrategy, private val navigator: MainNavigator, private val tokenRepository: TokenRepository, - private val serverInteractor: GetCurrentServerInteractor, private val refreshSettingsInteractor: RefreshSettingsInteractor, private val refreshPermissionsInteractor: RefreshPermissionsInteractor, - private val localRepository: LocalRepository, private val navHeaderMapper: NavHeaderUiModelMapper, private val saveAccountInteractor: SaveAccountInteractor, private val getAccountsInteractor: GetAccountsInteractor, - private val removeAccountInteractor: RemoveAccountInteractor, - factory: RocketChatClientFactory, private val groupedPush: GroupedPush, + serverInteractor: GetCurrentServerInteractor, + localRepository: LocalRepository, + removeAccountInteractor: RemoveAccountInteractor, + factory: RocketChatClientFactory, dbManagerFactory: DatabaseManagerFactory, getSettingsInteractor: GetSettingsInteractor, managerFactory: ConnectionManagerFactory -) : CheckServerPresenter(strategy, factory, view = view) { +) : CheckServerPresenter( + strategy = strategy, + factory = factory, + serverInteractor = serverInteractor, + localRepository = localRepository, + removeAccountInteractor = removeAccountInteractor, + tokenRepository = tokenRepository, + managerFactory = managerFactory, + dbManagerFactory = dbManagerFactory, + tokenView = view, + navigator = navigator +) { private val currentServer = serverInteractor.get()!! private val manager = managerFactory.create(currentServer) - private val dbManager = dbManagerFactory.create(currentServer) private val client: RocketChatClient = factory.create(currentServer) private var settings: PublicSettings = getSettingsInteractor.get(serverInteractor.get()!!) private val userDataChannel = Channel() @@ -114,9 +119,7 @@ class MainPresenter @Inject constructor( view.setupUserAccountInfo(model) } catch (ex: Exception) { when (ex) { - is RocketChatAuthException -> { - logout() - } + is RocketChatAuthException -> logout() else -> { Timber.d(ex, "Error loading my information for navheader") ex.message?.let { @@ -163,36 +166,9 @@ class MainPresenter @Inject constructor( } } - /** - * Logout from current server. - */ fun logout() { - launchUI(strategy) { - view.showProgress() - try { - clearTokens() - retryIO("logout") { client.logout() } - } catch (exception: RocketChatException) { - Timber.d(exception, "Error calling logout") - exception.message?.let { - view.showMessage(it) - }.ifNull { - view.showGenericErrorMessage() - } - } - - try { - disconnect() - removeAccountInteractor.remove(currentServer) - tokenRepository.remove(currentServer) - - withContext(CommonPool) { dbManager.logout() } - navigator.switchOrAddNewServer() - } catch (ex: Exception) { - Timber.d(ex, "Error cleaning up the session...") - } - view.hideProgress() - } + setupConnectionInfo(currentServer) + super.logout(userDataChannel) } fun connect() { @@ -202,8 +178,8 @@ class MainPresenter @Inject constructor( } fun disconnect() { - manager.removeUserDataChannel(userDataChannel) - manager.disconnect() + setupConnectionInfo(currentServer) + super.disconnect(userDataChannel) } fun changeServer(serverUrl: String) { @@ -247,20 +223,6 @@ class MainPresenter @Inject constructor( saveAccountInteractor.save(account) } - private suspend fun clearTokens() { - serverInteractor.clear() - val pushToken = localRepository.get(LocalRepository.KEY_PUSH_TOKEN) - if (pushToken != null) { - try { - retryIO("unregisterPushToken") { client.unregisterPushToken(pushToken) } - view.invalidateToken(pushToken) - } catch (ex: Exception) { - Timber.d(ex, "Error unregistering push token") - } - } - localRepository.clearAllFromServer(currentServer) - } - private suspend fun subscribeMyselfUpdates() { manager.addUserDataChannel(userDataChannel) for (myself in userDataChannel) { diff --git a/app/src/main/java/chat/rocket/android/main/presentation/MainView.kt b/app/src/main/java/chat/rocket/android/main/presentation/MainView.kt index b4f2b981c7..2047f21bf8 100644 --- a/app/src/main/java/chat/rocket/android/main/presentation/MainView.kt +++ b/app/src/main/java/chat/rocket/android/main/presentation/MainView.kt @@ -4,9 +4,10 @@ import chat.rocket.android.authentication.server.presentation.VersionCheckView import chat.rocket.android.core.behaviours.MessageView import chat.rocket.android.main.uimodel.NavHeaderUiModel import chat.rocket.android.server.domain.model.Account +import chat.rocket.android.server.presentation.TokenView import chat.rocket.common.model.UserStatus -interface MainView : MessageView, VersionCheckView { +interface MainView : MessageView, VersionCheckView, TokenView { /** * Shows the current user status. @@ -31,8 +32,6 @@ interface MainView : MessageView, VersionCheckView { fun closeServerSelection() - fun invalidateToken(token: String) - fun showProgress() fun hideProgress() diff --git a/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt b/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt index 5013b92d91..935a918825 100644 --- a/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt +++ b/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt @@ -202,8 +202,7 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector, .show() } - override fun invalidateToken(token: String) = - invalidateFirebaseToken(token) + override fun invalidateToken(token: String) = invalidateFirebaseToken(token) override fun showMessage(resId: Int) = showToast(resId) diff --git a/app/src/main/java/chat/rocket/android/profile/presentation/ProfilePresenter.kt b/app/src/main/java/chat/rocket/android/profile/presentation/ProfilePresenter.kt index 7487097d63..0de68ab496 100644 --- a/app/src/main/java/chat/rocket/android/profile/presentation/ProfilePresenter.kt +++ b/app/src/main/java/chat/rocket/android/profile/presentation/ProfilePresenter.kt @@ -5,9 +5,15 @@ import android.net.Uri import chat.rocket.android.chatroom.domain.UriInteractor import chat.rocket.android.core.behaviours.showMessage import chat.rocket.android.core.lifecycle.CancelStrategy +import chat.rocket.android.db.DatabaseManagerFactory import chat.rocket.android.helper.UserHelper +import chat.rocket.android.main.presentation.MainNavigator import chat.rocket.android.server.domain.GetCurrentServerInteractor +import chat.rocket.android.server.domain.RemoveAccountInteractor +import chat.rocket.android.server.domain.TokenRepository +import chat.rocket.android.server.infraestructure.ConnectionManagerFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory +import chat.rocket.android.server.presentation.CheckServerPresenter import chat.rocket.android.util.extension.compressImageAndGetByteArray import chat.rocket.android.util.extension.gethash import chat.rocket.android.util.extension.launchUI @@ -21,6 +27,8 @@ import chat.rocket.core.internal.rest.deleteOwnAccount import chat.rocket.core.internal.rest.resetAvatar import chat.rocket.core.internal.rest.setAvatar import chat.rocket.core.internal.rest.updateProfile +import kotlinx.coroutines.experimental.DefaultDispatcher +import kotlinx.coroutines.experimental.withContext import java.lang.Exception import java.util.* import javax.inject.Inject @@ -30,8 +38,23 @@ class ProfilePresenter @Inject constructor( private val strategy: CancelStrategy, private val uriInteractor: UriInteractor, val userHelper: UserHelper, + navigator: MainNavigator, serverInteractor: GetCurrentServerInteractor, - factory: RocketChatClientFactory + factory: RocketChatClientFactory, + removeAccountInteractor: RemoveAccountInteractor, + tokenRepository: TokenRepository, + dbManagerFactory: DatabaseManagerFactory, + managerFactory: ConnectionManagerFactory +) : CheckServerPresenter( + strategy = strategy, + factory = factory, + serverInteractor = serverInteractor, + removeAccountInteractor = removeAccountInteractor, + tokenRepository = tokenRepository, + dbManagerFactory = dbManagerFactory, + managerFactory = managerFactory, + tokenView = view, + navigator = navigator ) { private val serverUrl = serverInteractor.get()!! private val client: RocketChatClient = factory.create(serverUrl) @@ -156,7 +179,13 @@ class ProfilePresenter @Inject constructor( launchUI(strategy) { view.showLoading() try { - retryIO { client.deleteOwnAccount(password.gethash().toHex()) } + withContext(DefaultDispatcher) { + // REMARK: Backend API is only working with a lowercase hash. + // https://github.com/RocketChat/Rocket.Chat/issues/12573 + retryIO { client.deleteOwnAccount(password.gethash().toHex().toLowerCase()) } + setupConnectionInfo(serverUrl) + logout(null) + } } catch (exception: Exception) { exception.message?.let { view.showMessage(it) diff --git a/app/src/main/java/chat/rocket/android/profile/presentation/ProfileView.kt b/app/src/main/java/chat/rocket/android/profile/presentation/ProfileView.kt index 9ebf141fff..86c8f97620 100644 --- a/app/src/main/java/chat/rocket/android/profile/presentation/ProfileView.kt +++ b/app/src/main/java/chat/rocket/android/profile/presentation/ProfileView.kt @@ -2,8 +2,9 @@ package chat.rocket.android.profile.presentation import chat.rocket.android.core.behaviours.LoadingView import chat.rocket.android.core.behaviours.MessageView +import chat.rocket.android.server.presentation.TokenView -interface ProfileView : LoadingView, MessageView { +interface ProfileView : TokenView, LoadingView, MessageView { /** * Shows the user profile. diff --git a/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt b/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt index deef89b05b..0e861025e2 100644 --- a/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt +++ b/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt @@ -32,6 +32,7 @@ import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.showToast import chat.rocket.android.util.extensions.textContent import chat.rocket.android.util.extensions.ui +import chat.rocket.android.util.invalidateFirebaseToken import com.facebook.drawee.backends.pipeline.Fresco import dagger.android.support.AndroidSupportInjection import io.reactivex.disposables.CompositeDisposable @@ -146,6 +147,8 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { showMessage(getString(R.string.msg_profile_update_successfully)) } + override fun invalidateToken(token: String) = invalidateFirebaseToken(token) + override fun showLoading() { enableUserInput(false) ui { view_loading.isVisible = true } diff --git a/app/src/main/java/chat/rocket/android/server/presentation/CheckServerPresenter.kt b/app/src/main/java/chat/rocket/android/server/presentation/CheckServerPresenter.kt index 879eb086b4..a1c01b78ee 100644 --- a/app/src/main/java/chat/rocket/android/server/presentation/CheckServerPresenter.kt +++ b/app/src/main/java/chat/rocket/android/server/presentation/CheckServerPresenter.kt @@ -3,7 +3,11 @@ package chat.rocket.android.server.presentation import chat.rocket.android.BuildConfig import chat.rocket.android.authentication.server.presentation.VersionCheckView import chat.rocket.android.core.lifecycle.CancelStrategy +import chat.rocket.android.db.DatabaseManager +import chat.rocket.android.db.DatabaseManagerFactory import chat.rocket.android.helper.OauthHelper +import chat.rocket.android.infrastructure.LocalRepository +import chat.rocket.android.main.presentation.MainNavigator import chat.rocket.android.server.domain.GetSettingsInteractor import chat.rocket.android.server.domain.PublicSettings import chat.rocket.android.server.domain.casLoginUrl @@ -18,6 +22,12 @@ import chat.rocket.android.server.domain.isLoginFormEnabled import chat.rocket.android.server.domain.isRegistrationEnabledForNewUsers import chat.rocket.android.server.domain.isWordpressAuthenticationEnabled import chat.rocket.android.server.domain.wordpressUrl +import chat.rocket.android.server.domain.GetCurrentServerInteractor +import chat.rocket.android.server.domain.RemoveAccountInteractor +import chat.rocket.android.server.domain.TokenRepository +import chat.rocket.android.server.domain.RefreshSettingsInteractor +import chat.rocket.android.server.infraestructure.ConnectionManager +import chat.rocket.android.server.infraestructure.ConnectionManagerFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.util.VersionInfo import chat.rocket.android.util.extension.launchUI @@ -30,9 +40,15 @@ import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatInvalidProtocolException import chat.rocket.common.model.ServerInfo import chat.rocket.core.RocketChatClient +import chat.rocket.core.internal.rest.logout import chat.rocket.core.internal.rest.serverInfo import chat.rocket.core.internal.rest.settingsOauth +import chat.rocket.core.internal.rest.unregisterPushToken +import chat.rocket.core.model.Myself +import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.Job +import kotlinx.coroutines.experimental.channels.Channel +import kotlinx.coroutines.experimental.withContext import timber.log.Timber private const val SERVICE_NAME_FACEBOOK = "facebook" @@ -42,16 +58,26 @@ private const val SERVICE_NAME_LINKEDIN = "linkedin" private const val SERVICE_NAME_GILAB = "gitlab" private const val SERVICE_NAME_WORDPRESS = "wordpress" - abstract class CheckServerPresenter constructor( private val strategy: CancelStrategy, private val factory: RocketChatClientFactory, private val settingsInteractor: GetSettingsInteractor? = null, - private val view: VersionCheckView? = null + private val serverInteractor: GetCurrentServerInteractor? = null, + private val localRepository: LocalRepository? = null, + private val removeAccountInteractor: RemoveAccountInteractor? = null, + private val tokenRepository: TokenRepository? = null, + private val managerFactory: ConnectionManagerFactory? = null, + private val dbManagerFactory: DatabaseManagerFactory? = null, + private val versionCheckView: VersionCheckView? = null, + private val tokenView: TokenView? = null, + private val navigator: MainNavigator? = null, + private val refreshSettingsInteractor: RefreshSettingsInteractor? = null ) { private lateinit var currentServer: String private lateinit var client: RocketChatClient private lateinit var settings: PublicSettings + private lateinit var manager: ConnectionManager + private lateinit var dbManager: DatabaseManager internal var state: String = "" internal var facebookOauthUrl: String? = null internal var githubOauthUrl: String? = null @@ -78,10 +104,22 @@ abstract class CheckServerPresenter constructor( internal var isNewAccountCreationEnabled = false internal fun setupConnectionInfo(serverUrl: String) { - settingsInteractor?.get(serverUrl)?.let { + currentServer = serverUrl + client = factory.create(serverUrl) + managerFactory?.create(serverUrl)?.let { + manager = it + } + dbManagerFactory?.create(serverUrl)?.let { + dbManager = it + } + } + + internal suspend fun refreshServerAccounts() { + refreshSettingsInteractor?.refresh(currentServer) + + settingsInteractor?.get(currentServer)?.let { settings = it } - client = factory.create(serverUrl) state = "" facebookOauthUrl = null @@ -117,28 +155,28 @@ abstract class CheckServerPresenter constructor( client.serverInfo() } if (serverInfo.redirected) { - view?.updateServerUrl(serverInfo.url) + versionCheckView?.updateServerUrl(serverInfo.url) } val version = checkServerVersion(serverInfo) when (version) { is Version.VersionOk -> { Timber.i("Your version is nice! (Requires: 0.62.0, Yours: ${version.version})") - view?.versionOk() + versionCheckView?.versionOk() } is Version.RecommendedVersionWarning -> { Timber.i("Your server ${version.version} is bellow recommended version ${BuildConfig.RECOMMENDED_SERVER_VERSION}") - view?.alertNotRecommendedVersion() + versionCheckView?.alertNotRecommendedVersion() } is Version.OutOfDateError -> { Timber.i("Oops. Looks like your server ${version.version} is out-of-date! Minimum server version required ${BuildConfig.REQUIRED_SERVER_VERSION}!") - view?.blockAndAlertNotRequiredVersion() + versionCheckView?.blockAndAlertNotRequiredVersion() } } } catch (ex: Exception) { Timber.d(ex, "Error getting server info") when (ex) { - is RocketChatInvalidProtocolException -> view?.errorInvalidProtocol() - else -> view?.errorCheckingServerVersion() + is RocketChatInvalidProtocolException -> versionCheckView?.errorInvalidProtocol() + else -> versionCheckView?.errorCheckingServerVersion() } } } @@ -162,8 +200,59 @@ abstract class CheckServerPresenter constructor( } } - private fun checkEnabledOauthAccounts(services: List>, serverUrl: String) { + /** + * Logout the user from the current server. + * + * @param userDataChannel the user data channel to stop listening to changes (if currently subscribed). + */ + internal fun logout(userDataChannel: Channel?) { + launchUI(strategy) { + try { + clearTokens() + retryIO("logout") { client.logout() } + } catch (exception: RocketChatException) { + Timber.e(exception, "Error calling logout") + } + try { + if (userDataChannel != null) { + disconnect(userDataChannel) + } + removeAccountInteractor?.remove(currentServer) + tokenRepository?.remove(currentServer) + withContext(CommonPool) { dbManager.logout() } + navigator?.switchOrAddNewServer() + } catch (ex: Exception) { + Timber.e(ex, "Error cleaning up the session...") + } + } + } + + /** + * Stops listening to user data changes and disconnects the user. + * + * @param userDataChannel the user data channel to stop listening to changes. + */ + fun disconnect(userDataChannel: Channel) { + manager.removeUserDataChannel(userDataChannel) + manager.disconnect() + } + + private suspend fun clearTokens() { + serverInteractor?.clear() + val pushToken = localRepository?.get(LocalRepository.KEY_PUSH_TOKEN) + if (pushToken != null) { + try { + retryIO("unregisterPushToken") { client.unregisterPushToken(pushToken) } + tokenView?.invalidateToken(pushToken) + } catch (ex: Exception) { + Timber.e(ex, "Error unregistering push token") + } + } + localRepository?.clearAllFromServer(currentServer) + } + + private fun checkEnabledOauthAccounts(services: List>, serverUrl: String) { if (settings.isFacebookAuthenticationEnabled()) { getServiceMap(services, SERVICE_NAME_FACEBOOK)?.let { serviceMap -> getOauthClientId(serviceMap)?.let { clientId -> @@ -552,4 +641,4 @@ abstract class CheckServerPresenter constructor( data class OutOfDateError(private val currentVersion: String) : Version(currentVersion) } -} \ No newline at end of file +} diff --git a/app/src/main/java/chat/rocket/android/server/presentation/TokenView.kt b/app/src/main/java/chat/rocket/android/server/presentation/TokenView.kt new file mode 100644 index 0000000000..72476cacbf --- /dev/null +++ b/app/src/main/java/chat/rocket/android/server/presentation/TokenView.kt @@ -0,0 +1,6 @@ +package chat.rocket.android.server.presentation + +interface TokenView { + + fun invalidateToken(token: String) +} \ No newline at end of file From b3c0fb7851001fe52a0584763cb99b8eb6ef521c Mon Sep 17 00:00:00 2001 From: Govind Dixit <32304546+GOVINDDIXIT@users.noreply.github.com> Date: Fri, 9 Nov 2018 23:50:00 +0530 Subject: [PATCH 017/149] feat: add rate us feature --- app/src/main/res/values-de/strings.xml | 4 +++- app/src/main/res/values-es/strings.xml | 4 +++- app/src/main/res/values-fr/strings.xml | 4 +++- app/src/main/res/values-hi-rIN/strings.xml | 4 +++- app/src/main/res/values-ja/strings.xml | 4 +++- app/src/main/res/values-pt-rBR/strings.xml | 4 +++- app/src/main/res/values-ru-rRU/strings.xml | 4 +++- app/src/main/res/values-tr/strings.xml | 4 +++- app/src/main/res/values-uk/strings.xml | 4 +++- 9 files changed, 27 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ea58275e2d..eba974630d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -16,6 +16,7 @@ Einstellungen Preferences Ändere Passwort + Bewerten Sie uns Admin panel Ändere Passwort Update Profil @@ -58,8 +59,9 @@ Preferences Ändere Passwort - Über App teilen + Bewerten Sie uns + Über diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index accbd13a4a..3123420ebc 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -15,6 +15,7 @@ Configuraciones Preferences Cambia la contraseña + Nos califica Admin panel Cambia la contraseña Actualización del perfil @@ -56,8 +57,9 @@ Preferences Cambia la contraseña - Acerca de Compartir aplicación + Nos califica + Acerca de diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d17a441874..a074d85652 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -16,6 +16,7 @@ Paramètres Préférences Changer le mot de passe + évaluez nous Administration Changer le mot de passe Mettre à jour le profil @@ -60,8 +61,9 @@ Préférences Changer le mot de passe - À propos Partager l\'application + évaluez nous + À propos diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index c6734206dd..717d3e175f 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -16,6 +16,7 @@ सेटिंग्स प्राथमिकताएँ पासवर्ड बदलें + हमें रेटिंग दें एडमिन पैनल पासवर्ड बदलें प्रोफ़ाइल अपडेट करें @@ -59,8 +60,9 @@ प्राथमिकताएँ पासवर्ड बदलें - परिचय ऐप शेयर करें + हमें रेटिंग दें + परिचय diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 6b232a90c6..cabf49b3ee 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -18,6 +18,7 @@ 設定 Preferences Change Password + 私たちを評価してください Admin panel パスワードの変更 プロフィールの更新 @@ -61,8 +62,9 @@ Preferences Change Password - About アプリを共有する + 私たちを評価してください + About diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index dbcc08ada9..4255f2840d 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -16,6 +16,7 @@ Configurações Preferencias Alterar senha + nos avalie Painel administrativo Alterar senha Editar perfil @@ -59,8 +60,9 @@ Preferencias Alterar senha - Sobre Compartilhe o aplicativo + nos avalie + Sobre diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 7fdca105fc..c1a2017931 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -16,6 +16,7 @@ Настройки Персональные Изменить пароль + оцените нас Панель админа Изменить пароль Обновить профиль @@ -59,8 +60,9 @@ Персональные Изменить пароль - О программе + оцените нас добавить приложение + О программе diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 78afc7cd8f..2a4cd34b2e 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -16,6 +16,7 @@ Ayarlar Tercihler Şifre Değişikliği + Bizi değerlendirin Yönetici Paneli Şifrenizi Değiştirin Profilinizi Düzenleyin @@ -59,8 +60,9 @@ Tercihler Şifre Değiştir - Hakkında uygulamayı Paylaş + Bizi değerlendirin + Hakkında diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 2613b224d7..8c998d7990 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -16,6 +16,7 @@ Налаштування Персональні Змінити пароль + Оцініть нас Панель адміністратора Змінити пароль Оновити профіль @@ -59,8 +60,9 @@ Preferences Change Password - About поділитися прикладом + Оцініть нас + About From cca9bd88a315c90d6ac7a2d859fc6c8bed52ffa5 Mon Sep 17 00:00:00 2001 From: Govind Dixit <32304546+GOVINDDIXIT@users.noreply.github.com> Date: Sat, 10 Nov 2018 09:50:32 +0530 Subject: [PATCH 018/149] minor changes --- .../chat/rocket/android/settings/ui/SettingsFragment.kt | 9 +++++---- app/src/main/res/values/defaults.xml | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt index 813ec3d214..5e20df4c7b 100644 --- a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt +++ b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt @@ -9,6 +9,7 @@ import android.view.View import android.view.ViewGroup import android.widget.AdapterView import androidx.appcompat.app.AppCompatActivity +import androidx.core.net.toUri import androidx.fragment.app.Fragment import chat.rocket.android.R import chat.rocket.android.about.ui.AboutFragment @@ -92,16 +93,16 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen } fun getMarketAppLink(): String { - return "market://details?id=chat.rocket.android" + return getString(R.string.market_link) } fun getMarketWebLink(): String { - return "https://play.google.com/store/apps/details?id=chat.rocket.android" + return getString(R.string.play_store_link) } private fun startAppPlayStore() { try { - startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getMarketAppLink()))) + startActivity(Intent(Intent.ACTION_VIEW, getMarketAppLink().toUri())) } catch (error: ActivityNotFoundException) { - startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getMarketWebLink()))) + startActivity(Intent(Intent.ACTION_VIEW, getMarketWebLink().toUri())) } } diff --git a/app/src/main/res/values/defaults.xml b/app/src/main/res/values/defaults.xml index 4df7ef4e1a..009315a330 100644 --- a/app/src/main/res/values/defaults.xml +++ b/app/src/main/res/values/defaults.xml @@ -5,4 +5,5 @@ open.rocket.chat cloud.rocket.chat/trial https://play.google.com/store/apps/details?id=chat.rocket.android + market://details?id=chat.rocket.android \ No newline at end of file From 6dd788702d7eea694d88267049a2c92392acc012 Mon Sep 17 00:00:00 2001 From: Yuu Date: Sat, 10 Nov 2018 14:28:12 +0900 Subject: [PATCH 019/149] update ja language' --- app/build-sdk.sh | 0 app/src/main/ic_launcher-web.png | Bin app/src/main/res/values-ja/strings.xml | 113 +++++++++++++------------ gradlew | 0 4 files changed, 57 insertions(+), 56 deletions(-) mode change 100755 => 100644 app/build-sdk.sh mode change 100755 => 100644 app/src/main/ic_launcher-web.png mode change 100755 => 100644 gradlew diff --git a/app/build-sdk.sh b/app/build-sdk.sh old mode 100755 new mode 100644 diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png old mode 100755 new mode 100644 diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 6b232a90c6..fbd489bbe1 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -16,14 +16,14 @@ メンバー メンバー (%d) 設定 - Preferences - Change Password - Admin panel + 環境設定 + パスワードの変更 + 管理パネル パスワードの変更 プロフィールの更新 About - 新しいチャネルを作成します - Are You Sure you want to logout? + 新しいチャネルを作成 + ログアウトしますか? @@ -37,7 +37,7 @@ チャンネル作成 作ります ログアウト - Stay + いいえ ファイル 変更したパスワードの確認 チャットに参加 @@ -48,20 +48,20 @@ 状態を隠す 絵を描く ギャラリーに保存 - Select photo from gallery - Take photo - Reset avatar - Connect with a server - Join in the community - Create a new server - Register - Confirm + ギャラリーの写真を選択 + 写真を撮る + アバターをリセット + サーバーに接続 + コミュニティに参加 + 新規サーバーを作成 + 登録 + 確認 - Preferences - Change Password - About + 環境設定 + パスワードの変更 + アプリ情報 アプリを共有する @@ -79,28 +79,28 @@ アバター URL またはソーシャルアカウントを使用する 新規ユーザー? %1$s - パスワードをお忘れですか? %1$s + パスワードをお忘れですか? リセット メールが送信されました! パスワードを変更するためには、受信ボックスを確認してください。 有効なメールアドレスを入力してください サインアップすることで、\n%1$s と %2$s に同意したとみなします。 - Today + 今日 昨日 メッセージ この部屋は読み取り専用です 無効な 2FA コード 無効なファイル 無効なサーバー URL - Login using Facebook - Login using Github - Login using Google - Login using Linkedin - Login using Meteor - Login using Twitter - Login using Gitlab - Login using WordPress - メッセージを送信 - Show more login options + Facebookでログイン + Githubでログイン + Googleでログイン + Linkedinでログイン + Meteorでログイン + Twitterでログイン + Gitlabでログイン + WordPressでログイン + メッセージを送信 + その他ログインオプション 添付ファイルオプションを表示する あなた 不明 @@ -142,22 +142,22 @@ ファイルの説明 送信 添付ファイルを送信しました - Welcome to Rocket.Chat - Team Communication - Login with e-mail - Create an account - Continue with Facebook - Continue with Github - Continue with Google - Continue with Linkedin - Continue with GitLab - Continue with WordPress - Two-factor Authentication - What’s your 2FA code? - - view more - - view less + Rocket.Chatへようこそ + チームコミュニケーション + e-mailでログイン + アカウントを作成 + Facebookでログイン + Githubでログイン + Googleでログイン + Linkedinでログイン + GitLabでログイン + WordPressでログイン + 二要素認証 + あなたの 2FA コードは何ですか? + + 更に表示 + + 隠す プライベート @@ -173,14 +173,14 @@ メッセージをコピー メッセージを削除 このメッセージを削除してもよろしいですか? - - Permalink copied + + パーマリンクのコピー - Analytics tracking - Send anonymous statics to help improving this app - Do not send anonymous statics to help improving this app - Not applicable since it is a FOSS version + トラッキングの分析 + アプリ改善のための匿名統計情報を送信する + アプリ改善のための匿名統計情報を送信しない + FOSSバージョンのため、適用できません ルーム名を %1$s から %2$s へ変更しました。 @@ -212,7 +212,7 @@ メッセージの編集 リアクションする - Copy permalink + パーマリンクのコピー 編集は許可されていません @@ -297,7 +297,7 @@ ソート ソート アルファベット順 - アクティビティで並べ替える + アクティビティ順 グループ別 お気に入りのグループ ヘッダ @@ -312,12 +312,13 @@ 不明 - Edit shared message + 共有メッセージの編集 返信 送信に失敗しました。もう一度お試しください。 メッセージは %1$s に送信されました! 読者 メッセージ情報 - - Room type changed to: %1$s by %2$s + + ルームタイプを %2$s から %1$s に変更しました + \ No newline at end of file diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 From 01f2a14d00699b591107ae9c867fb8f554e3f379 Mon Sep 17 00:00:00 2001 From: Leonardo Aramaki Date: Mon, 5 Nov 2018 21:12:44 -0200 Subject: [PATCH 020/149] Add support for (un)muted states --- .../presentation/ChatRoomPresenter.kt | 8 +- .../android/chatroom/ui/ChatRoomFragment.kt | 10 +- .../chatrooms/adapter/model/RoomUiModel.kt | 5 +- .../presentation/ChatRoomsPresenter.kt | 3 +- .../chatrooms/viewmodel/ChatRoomsViewModel.kt | 4 +- .../chat/rocket/android/db/DatabaseManager.kt | 97 ++++++++++--------- .../java/chat/rocket/android/db/RCDatabase.kt | 7 +- .../rocket/android/db/model/ChatRoomEntity.kt | 8 +- app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values-es/strings.xml | 2 + app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values-hi-rIN/strings.xml | 2 + app/src/main/res/values-ja/strings.xml | 2 + app/src/main/res/values-pt-rBR/strings.xml | 5 +- app/src/main/res/values-ru-rRU/strings.xml | 2 + app/src/main/res/values-tr/strings.xml | 2 + app/src/main/res/values-uk/strings.xml | 2 + app/src/main/res/values/strings.xml | 1 + 18 files changed, 104 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt index be1bea6af1..2e08f4fd0e 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt @@ -38,6 +38,7 @@ import chat.rocket.android.util.extension.compressImageAndGetByteArray import chat.rocket.android.util.extension.getByteArray import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extensions.avatarUrl +import chat.rocket.android.util.extensions.exhaustive import chat.rocket.android.util.retryIO import chat.rocket.common.RocketChatException import chat.rocket.common.model.RoomType @@ -137,9 +138,12 @@ class ChatRoomPresenter @Inject constructor( } finally { // User has at least an 'owner' or 'moderator' role. val userCanMod = isOwnerOrMod() + val chatRoom = dbManager.getRoom(roomId) + val muted = chatRoom?.chatRoom?.muted ?: emptyList() // Can post anyway if has the 'post-readonly' permission on server. - val userCanPost = userCanMod || permissions.canPostToReadOnlyChannels() - chatIsBroadcast = dbManager.getRoom(roomId)?.chatRoom?.run { + val userCanPost = userCanMod || permissions.canPostToReadOnlyChannels() || + !muted.contains(currentLoggedUsername) + chatIsBroadcast = chatRoom?.chatRoom?.run { broadcast } ?: false view.onRoomUpdated(userCanPost, chatIsBroadcast, userCanMod) diff --git a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt index 6e8b9db154..0f8e210233 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt @@ -763,9 +763,17 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR } private fun setupMessageComposer(canPost: Boolean) { - if (isReadOnly && !canPost) { + if (!canPost) { text_room_is_read_only.isVisible = true input_container.isVisible = false + text_room_is_read_only.setText( + if (isReadOnly) { + R.string.msg_this_room_is_read_only + } else { + // Not a read-only channel but user has been muted. + R.string.msg_muted_on_this_channel + } + ) } else if (!isSubscribed && roomTypeOf(chatRoomType) !is RoomType.DirectMessage) { input_container.isVisible = false button_join_chat.isVisible = true diff --git a/app/src/main/java/chat/rocket/android/chatrooms/adapter/model/RoomUiModel.kt b/app/src/main/java/chat/rocket/android/chatrooms/adapter/model/RoomUiModel.kt index 164c31d56c..56786461fe 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/adapter/model/RoomUiModel.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/adapter/model/RoomUiModel.kt @@ -14,5 +14,6 @@ data class RoomUiModel( val alert: Boolean = false, val lastMessage: CharSequence? = null, val status: UserStatus? = null, - val username: String? = null -) \ No newline at end of file + val username: String? = null, + val muted: List = emptyList() +) diff --git a/app/src/main/java/chat/rocket/android/chatrooms/presentation/ChatRoomsPresenter.kt b/app/src/main/java/chat/rocket/android/chatrooms/presentation/ChatRoomsPresenter.kt index 67d278a3fe..e119b94634 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/presentation/ChatRoomsPresenter.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/presentation/ChatRoomsPresenter.kt @@ -56,7 +56,8 @@ class ChatRoomsPresenter @Inject constructor( type = type.toString(), name = username ?: name.toString(), fullname = name.toString(), - open = open + open = open, + muted = muted ) loadChatRoom(entity, false) } diff --git a/app/src/main/java/chat/rocket/android/chatrooms/viewmodel/ChatRoomsViewModel.kt b/app/src/main/java/chat/rocket/android/chatrooms/viewmodel/ChatRoomsViewModel.kt index bbf7e2bf4d..90d097eaa0 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/viewmodel/ChatRoomsViewModel.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/viewmodel/ChatRoomsViewModel.kt @@ -27,7 +27,7 @@ import kotlinx.coroutines.experimental.launch import kotlinx.coroutines.experimental.newSingleThreadContext import kotlinx.coroutines.experimental.withContext import timber.log.Timber -import java.security.InvalidParameterException +import java.lang.IllegalArgumentException import kotlin.coroutines.experimental.coroutineContext @@ -171,6 +171,6 @@ fun Query.asSortingOrder(): ChatRoomsRepository.Order { ChatRoomsRepository.Order.ACTIVITY } } - else -> throw InvalidParameterException("Should be ByName or ByActivity") + else -> throw IllegalArgumentException("Should be ByName or ByActivity") } } diff --git a/app/src/main/java/chat/rocket/android/db/DatabaseManager.kt b/app/src/main/java/chat/rocket/android/db/DatabaseManager.kt index 215cb33aa5..eefa1e7cd3 100644 --- a/app/src/main/java/chat/rocket/android/db/DatabaseManager.kt +++ b/app/src/main/java/chat/rocket/android/db/DatabaseManager.kt @@ -41,13 +41,12 @@ import timber.log.Timber import java.util.HashSet import kotlin.system.measureTimeMillis -class DatabaseManager(val context: Application, - val serverUrl: String) { +class DatabaseManager(val context: Application, val serverUrl: String) { private val database: RCDatabase = androidx.room.Room.databaseBuilder(context, - RCDatabase::class.java, serverUrl.databaseName()) - .fallbackToDestructiveMigration() - .build() + RCDatabase::class.java, serverUrl.databaseName()) + .fallbackToDestructiveMigration() + .build() private val dbContext = newSingleThreadContext("$serverUrl-db-context") private val dbManagerContext = newSingleThreadContext("$serverUrl-db-manager-context") @@ -124,11 +123,11 @@ class DatabaseManager(val context: Application, val toInsert = ArrayList(batch.size / 2) val toUpdate = ArrayList(batch.size) batch.forEach { - when(it.type) { + when (it.type) { is Type.Removed -> toRemove.add(removeChatRoom(it.data)) is Type.Inserted -> insertChatRoom(it.data)?.let { toInsert.add(it) } is Type.Updated -> { - when(it.data) { + when (it.data) { is Subscription -> updateSubs[(it.data as Subscription).roomId] = it.data as Subscription is Room -> updateRooms[(it.data as Room).id] = it.data as Room } @@ -154,10 +153,10 @@ class DatabaseManager(val context: Application, launch(dbManagerContext) { val user = userDao().getUser(myself.id) val entity = user?.copy( - name = myself.name ?: user.name, - username = myself.username ?: user.username, - utcOffset = myself.utcOffset ?: user.utcOffset, - status = myself.status?.toString() ?: user.status + name = myself.name ?: user.name, + username = myself.username ?: user.username, + utcOffset = myself.utcOffset ?: user.utcOffset, + status = myself.status?.toString() ?: user.status ) ?: myself.asUser().toEntity() Timber.d("UPDATING SELF: $entity") @@ -187,7 +186,7 @@ class DatabaseManager(val context: Application, private suspend fun createMessageEntities(message: Message): Pair> { val messageEntity = message.toEntity() val list = mutableListOf() - createAttachments(message)?.let { list.addAll(it) } + createAttachments(message)?.let { list.addAll(it) } createFavoriteRelations(message)?.let { list.addAll(it) } createMentionRelations(message)?.let { list.addAll(it) } createChannelRelations(message)?.let { list.addAll(it) } @@ -225,7 +224,7 @@ class DatabaseManager(val context: Application, val list = mutableListOf() message.urls!!.forEach { url -> list.add(UrlEntity(message.id, url.url, url.parsedUrl?.host, url.meta?.title, - url.meta?.description, url.meta?.imageUrl)) + url.meta?.description, url.meta?.imageUrl)) } return list @@ -329,7 +328,7 @@ class DatabaseManager(val context: Application, } private fun removeChatRoom(data: BaseRoom): String { - return when(data) { + return when (data) { is Subscription -> data.roomId else -> data.id } @@ -344,14 +343,15 @@ class DatabaseManager(val context: Application, insertUserIfMissing(user) chatRoom.copy( - name = name ?: chatRoom.name, - fullname = fullName ?: chatRoom.fullname, - ownerId = user?.id ?: chatRoom.ownerId, - readonly = readonly, - updatedAt = updatedAt ?: chatRoom.updatedAt, - lastMessageText = mapLastMessageText(lastMessage), - lastMessageUserId = lastMessage?.sender?.id, - lastMessageTimestamp = lastMessage?.timestamp + name = name ?: chatRoom.name, + fullname = fullName ?: chatRoom.fullname, + ownerId = user?.id ?: chatRoom.ownerId, + readonly = readonly, + updatedAt = updatedAt ?: chatRoom.updatedAt, + lastMessageText = mapLastMessageText(lastMessage), + lastMessageUserId = lastMessage?.sender?.id, + lastMessageTimestamp = lastMessage?.timestamp, + muted = muted ) } } @@ -386,30 +386,32 @@ class DatabaseManager(val context: Application, val chatRoom = current.chatRoom chatRoom.copy( - id = roomId, - subscriptionId = id, - type = type.toString(), - name = name ?: throw NullPointerException(), // this should be filtered on the SDK - fullname = fullName ?: chatRoom.fullname, - userId = userId ?: chatRoom.userId, - readonly = readonly ?: chatRoom.readonly, - isDefault = isDefault, - favorite = isFavorite, - open = open, - alert = alert, - unread = unread, - userMentions = userMentions ?: chatRoom.userMentions, - groupMentions = groupMentions ?: chatRoom.groupMentions, - updatedAt = updatedAt ?: chatRoom.updatedAt, - timestamp = timestamp ?: chatRoom.timestamp, - lastSeen = lastSeen ?: chatRoom.lastSeen + id = roomId, + subscriptionId = id, + type = type.toString(), + name = name + ?: throw NullPointerException(), // this should be filtered on the SDK + fullname = fullName ?: chatRoom.fullname, + userId = userId ?: chatRoom.userId, + readonly = readonly ?: chatRoom.readonly, + isDefault = isDefault, + favorite = isFavorite, + open = open, + alert = alert, + unread = unread, + userMentions = userMentions ?: chatRoom.userMentions, + groupMentions = groupMentions ?: chatRoom.groupMentions, + updatedAt = updatedAt ?: chatRoom.updatedAt, + timestamp = timestamp ?: chatRoom.timestamp, + lastSeen = lastSeen ?: chatRoom.lastSeen, + muted = chatRoom.muted ) } } } private suspend fun insertChatRoom(data: BaseRoom): ChatRoomEntity? { - return when(data) { + return when (data) { is Room -> insertRoom(data) is Subscription -> insertSubscription(data) else -> null @@ -451,7 +453,8 @@ class DatabaseManager(val context: Application, id = room.id, subscriptionId = subscription.id, type = room.type.toString(), - name = room.name ?: subscription.name ?: throw NullPointerException(), // this should be filtered on the SDK + name = room.name ?: subscription.name + ?: throw NullPointerException(), // this should be filtered on the SDK fullname = subscription.fullName ?: room.fullName, userId = userId, ownerId = room.user?.id, @@ -506,7 +509,8 @@ class DatabaseManager(val context: Application, lastMessageText = mapLastMessageText(lastMessage), lastMessageUserId = lastMessage?.sender?.id, lastMessageTimestamp = lastMessage?.timestamp, - broadcast = broadcast + broadcast = broadcast, + muted = room.muted ) } } @@ -579,6 +583,7 @@ sealed class Operation { val toUpdate: List, val toRemove: List ) : Operation() + data class InsertRooms(val chatRooms: List) : Operation() data class CleanInsertRooms(val chatRooms: List) : Operation() @@ -607,10 +612,10 @@ private fun Myself.asUser(): User { private fun String.databaseName(): String { val tmp = this.removePrefix("https://") - .removePrefix("http://") - .removeTrailingSlash() - .replace("/","-") - .replace(".", "_") + .removePrefix("http://") + .removeTrailingSlash() + .replace("/", "-") + .replace(".", "_") return "$tmp.db" } \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/db/RCDatabase.kt b/app/src/main/java/chat/rocket/android/db/RCDatabase.kt index ba451780e3..55fa447c0e 100644 --- a/app/src/main/java/chat/rocket/android/db/RCDatabase.kt +++ b/app/src/main/java/chat/rocket/android/db/RCDatabase.kt @@ -2,6 +2,7 @@ package chat.rocket.android.db import androidx.room.Database import androidx.room.RoomDatabase +import androidx.room.TypeConverters import chat.rocket.android.db.model.AttachmentActionEntity import chat.rocket.android.db.model.AttachmentEntity import chat.rocket.android.db.model.AttachmentFieldEntity @@ -14,6 +15,7 @@ import chat.rocket.android.db.model.MessagesSync import chat.rocket.android.db.model.ReactionEntity import chat.rocket.android.db.model.UrlEntity import chat.rocket.android.db.model.UserEntity +import chat.rocket.android.emoji.internal.db.StringListConverter @Database( entities = [ @@ -23,11 +25,12 @@ import chat.rocket.android.db.model.UserEntity AttachmentFieldEntity::class, AttachmentActionEntity::class, UrlEntity::class, ReactionEntity::class, MessagesSync::class ], - version = 10, + version = 12, exportSchema = true ) +@TypeConverters(StringListConverter::class) abstract class RCDatabase : RoomDatabase() { abstract fun userDao(): UserDao abstract fun chatRoomDao(): ChatRoomDao abstract fun messageDao(): MessageDao -} \ No newline at end of file +} diff --git a/app/src/main/java/chat/rocket/android/db/model/ChatRoomEntity.kt b/app/src/main/java/chat/rocket/android/db/model/ChatRoomEntity.kt index 3f8ae3d5fd..92403de4f8 100644 --- a/app/src/main/java/chat/rocket/android/db/model/ChatRoomEntity.kt +++ b/app/src/main/java/chat/rocket/android/db/model/ChatRoomEntity.kt @@ -5,6 +5,8 @@ import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.Index import androidx.room.PrimaryKey +import androidx.room.TypeConverters +import chat.rocket.android.emoji.internal.db.StringListConverter @Entity(tableName = "chatrooms", indices = [ @@ -20,6 +22,7 @@ import androidx.room.PrimaryKey ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["lastMessageUserId"]) ] ) +@TypeConverters(StringListConverter::class) data class ChatRoomEntity( @PrimaryKey var id: String, var subscriptionId: String, @@ -42,7 +45,8 @@ data class ChatRoomEntity( var lastMessageText: String? = null, var lastMessageUserId: String? = null, var lastMessageTimestamp: Long? = null, - var broadcast: Boolean? = false + var broadcast: Boolean? = false, + var muted: List? = null ) data class ChatRoom( @@ -52,4 +56,4 @@ data class ChatRoom( var status: String?, var lastMessageUserName: String?, var lastMessageUserFullName: String? -) \ No newline at end of file +) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5ff7c7f495..46ad43abdf 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -144,6 +144,8 @@ Continue with WordPress Two-factor Authentication What’s your 2FA code? + + You are muted on this channel Privat diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3269ccd08e..bd8bed67ff 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -161,6 +161,8 @@ view less Permalink copied + + You are muted on this channel Analytics tracking diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 26a74b7104..b9ea24ecb9 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -156,6 +156,8 @@ view less Permalink copied + + You are muted on this channel Privé diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index a2145c7340..2ebf6a36e3 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -167,6 +167,8 @@ कम देखें Permalink copied + + You are muted on this channel एनालिटिक्स ट्रैकिंग diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 0b4f6eed2e..4eb1427f7d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -154,6 +154,8 @@ view more view less + + You are muted on this channel プライベート diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 8faee241e6..b8cf776cda 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -154,6 +154,7 @@ visualizar menos Permalink copiado + Você está silenciado neste canal Privado @@ -182,8 +183,8 @@ Bem-vindo, %s Mensagem removida Pinou uma mensagem: - Usuário %1$s entrou no modo mudo por %2$s - Usuário %1$s saiu do modo mudo por %2$s + Usuário %1$s foi silenciado por %2$s + Usuário %1$s saiu do modo silenciado por %2$s %1$s foi definido %2$s por %3$s %1$s não é mais %2$s por %3$s // TODO:Add proper translation. diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index fb7541bc5d..7c285d43be 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -151,6 +151,8 @@ больше меньше Ссылка скопирована + + You are muted on this channel Приватный diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index cee409697a..5c582dc744 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -168,6 +168,8 @@ Daha az göster Permalink copied + + You are muted on this channel İstatistik takibi diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b3fd14faa2..2bfed877c2 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -153,6 +153,8 @@ view less Permalink copied + + You are muted on this channel Приватний diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c4a98a25eb..101ddeb4d8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -179,6 +179,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Are you sure you want to delete this message view more view less + You are muted on this channel Analytics tracking From b0d383b17d9c9e1c7b5892164512fb55d9b56bfa Mon Sep 17 00:00:00 2001 From: Leonardo Aramaki Date: Mon, 12 Nov 2018 16:47:46 -0200 Subject: [PATCH 021/149] Observe channel changes through socket --- app/build-sdk.sh | 0 .../chatroom/di/ChatRoomFragmentModule.kt | 31 +++++++++++ .../presentation/ChatRoomPresenter.kt | 53 +++++++++++++++---- .../chatroom/presentation/ChatRoomView.kt | 13 ++--- .../android/chatroom/ui/ChatRoomFragment.kt | 21 ++++---- .../chatrooms/adapter/RoomUiModelMapper.kt | 3 +- .../chatrooms/adapter/model/RoomUiModel.kt | 7 ++- .../infraestructure/ConnectionManager.kt | 22 ++++++++ gradlew | 0 9 files changed, 114 insertions(+), 36 deletions(-) mode change 100644 => 100755 app/build-sdk.sh mode change 100644 => 100755 gradlew diff --git a/app/build-sdk.sh b/app/build-sdk.sh old mode 100644 new mode 100755 diff --git a/app/src/main/java/chat/rocket/android/chatroom/di/ChatRoomFragmentModule.kt b/app/src/main/java/chat/rocket/android/chatroom/di/ChatRoomFragmentModule.kt index caadc5e7ab..0bd6f38994 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/di/ChatRoomFragmentModule.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/di/ChatRoomFragmentModule.kt @@ -1,14 +1,20 @@ package chat.rocket.android.chatroom.di +import android.app.Application import androidx.lifecycle.LifecycleOwner import chat.rocket.android.chatroom.presentation.ChatRoomView import chat.rocket.android.chatroom.ui.ChatRoomFragment +import chat.rocket.android.chatrooms.adapter.RoomUiModelMapper import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.dagger.scope.PerFragment import chat.rocket.android.db.ChatRoomDao import chat.rocket.android.db.DatabaseManager import chat.rocket.android.db.DatabaseManagerFactory +import chat.rocket.android.db.UserDao import chat.rocket.android.server.domain.GetCurrentServerInteractor +import chat.rocket.android.server.domain.GetCurrentUserInteractor +import chat.rocket.android.server.domain.SettingsRepository +import chat.rocket.android.server.domain.TokenRepository import dagger.Module import dagger.Provides import kotlinx.coroutines.experimental.Job @@ -42,4 +48,29 @@ class ChatRoomFragmentModule { @Provides @PerFragment fun provideChatRoomDao(manager: DatabaseManager): ChatRoomDao = manager.chatRoomDao() + + @Provides + @PerFragment + fun provideUserDao(manager: DatabaseManager): UserDao = manager.userDao() + + @Provides + @PerFragment + fun provideGetCurrentUserInteractor( + tokenRepository: TokenRepository, + @Named("currentServer") serverUrl: String, + userDao: UserDao + ): GetCurrentUserInteractor { + return GetCurrentUserInteractor(tokenRepository, serverUrl, userDao) + } + + @Provides + @PerFragment + fun provideRoomMapper( + context: Application, + repository: SettingsRepository, + userInteractor: GetCurrentUserInteractor, + @Named("currentServer") serverUrl: String + ): RoomUiModelMapper { + return RoomUiModelMapper(context, repository.get(serverUrl), userInteractor, serverUrl) + } } diff --git a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt index a66560afb2..1b51be1eae 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt @@ -15,6 +15,7 @@ import chat.rocket.android.chatroom.uimodel.suggestion.ChatRoomSuggestionUiModel import chat.rocket.android.chatroom.uimodel.suggestion.CommandSuggestionUiModel import chat.rocket.android.chatroom.uimodel.suggestion.EmojiSuggestionUiModel import chat.rocket.android.chatroom.uimodel.suggestion.PeopleSuggestionUiModel +import chat.rocket.android.chatrooms.adapter.RoomUiModelMapper import chat.rocket.android.core.behaviours.showMessage import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.db.DatabaseManager @@ -34,7 +35,6 @@ import chat.rocket.android.server.domain.uploadMimeTypeFilter import chat.rocket.android.server.domain.useRealName import chat.rocket.android.server.infraestructure.ConnectionManagerFactory import chat.rocket.android.server.infraestructure.state -import chat.rocket.android.util.extension.compressImageAndGetByteArray import chat.rocket.android.util.extension.getByteArray import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extensions.avatarUrl @@ -73,6 +73,7 @@ import chat.rocket.core.model.ChatRoom import chat.rocket.core.model.ChatRoomRole import chat.rocket.core.model.Command import chat.rocket.core.model.Message +import chat.rocket.core.model.Room import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.DefaultDispatcher import kotlinx.coroutines.experimental.android.UI @@ -81,7 +82,6 @@ import kotlinx.coroutines.experimental.launch import kotlinx.coroutines.experimental.withContext import org.threeten.bp.Instant import timber.log.Timber -import java.io.InputStream import java.util.* import javax.inject.Inject @@ -97,6 +97,7 @@ class ChatRoomPresenter @Inject constructor( private val analyticsManager: AnalyticsManager, private val userHelper: UserHelper, private val mapper: UiModelMapper, + private val roomMapper: RoomUiModelMapper, private val jobSchedulerInteractor: JobSchedulerInteractor, private val messageHelper: MessageHelper, private val dbManager: DatabaseManager, @@ -119,6 +120,7 @@ class ChatRoomPresenter @Inject constructor( private var typingStatusSubscriptionId: String? = null private var lastState = manager.state private var typingStatusList = arrayListOf() + private val roomChangesChannel = Channel(Channel.CONFLATED) fun setupChatRoom( roomId: String, @@ -126,7 +128,7 @@ class ChatRoomPresenter @Inject constructor( roomType: String, chatRoomMessage: String? = null ) { - launchUI(strategy) { + launch(CommonPool + strategy.jobs) { try { chatRoles = if (roomTypeOf(roomType) !is RoomType.DirectMessage) { client.chatRoomRoles(roomType = roomTypeOf(roomType), roomName = roomName) @@ -136,13 +138,22 @@ class ChatRoomPresenter @Inject constructor( chatRoles = emptyList() } finally { // User has at least an 'owner' or 'moderator' role. - val userCanMod = isOwnerOrMod() + val canModerate = isOwnerOrMod() // Can post anyway if has the 'post-readonly' permission on server. - val userCanPost = userCanMod || permissions.canPostToReadOnlyChannels() - chatIsBroadcast = dbManager.getRoom(roomId)?.chatRoom?.run { - broadcast - } ?: false - view.onRoomUpdated(userCanPost, chatIsBroadcast, userCanMod) + val room = dbManager.getRoom(roomId) + val canPost = canModerate || permissions.canPostToReadOnlyChannels() + room?.let { + chatIsBroadcast = it.chatRoom.broadcast ?: false + val roomUiModel = roomMapper.map(it, true) + launchUI(strategy) { + view.onRoomUpdated(roomUiModel = roomUiModel.copy( + broadcast = chatIsBroadcast, + canModerate = canModerate, + canPost = canPost + )) + } + } + loadMessages(roomId, roomType, clearDataSet = true) chatRoomMessage?.let { messageHelper.messageIdFromPermalink(it) } ?.let { messageId -> @@ -154,10 +165,26 @@ class ChatRoomPresenter @Inject constructor( true ) } + subscribeRoomChanges() + } + } + } + + private suspend fun subscribeRoomChanges() { + chatRoomId?.let { + manager.addRoomChannel(it, roomChangesChannel) + for (room in roomChangesChannel) { + dbManager.getRoom(room.id)?.let { + view.onRoomUpdated(roomMapper.map(chatRoom = it, showLastMessage = true)) + } } } } + private fun unsubscribeRoomChanges() { + chatRoomId?.let { manager.removeRoomChannel(it) } + } + private fun isOwnerOrMod(): Boolean { return chatRoles.firstOrNull { it.user.username == currentLoggedUsername }?.roles?.any { it == "owner" || it == "moderator" @@ -980,7 +1007,12 @@ class ChatRoomPresenter @Inject constructor( try { retryIO("joinChat($chatRoomId)") { client.joinChat(chatRoomId) } val canPost = permissions.canPostToReadOnlyChannels() - view.onJoined(canPost) + dbManager.getRoom(chatRoomId)?.let { + val roomUiModel = roomMapper.map(it, true).copy( + canPost = canPost) + view.onJoined(roomUiModel = roomUiModel) + view.onRoomUpdated(roomUiModel = roomUiModel) + } } catch (ex: RocketChatException) { Timber.e(ex) } @@ -1150,6 +1182,7 @@ class ChatRoomPresenter @Inject constructor( } fun disconnect() { + unsubscribeRoomChanges() unsubscribeTypingStatus() if (chatRoomId != null) { unsubscribeMessages(chatRoomId.toString()) diff --git a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt index 7b226e62cb..15f241b2cb 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt @@ -5,6 +5,7 @@ import chat.rocket.android.chatroom.uimodel.suggestion.ChatRoomSuggestionUiModel import chat.rocket.android.chatroom.uimodel.suggestion.CommandSuggestionUiModel import chat.rocket.android.chatroom.uimodel.suggestion.EmojiSuggestionUiModel import chat.rocket.android.chatroom.uimodel.suggestion.PeopleSuggestionUiModel +import chat.rocket.android.chatrooms.adapter.model.RoomUiModel import chat.rocket.android.core.behaviours.LoadingView import chat.rocket.android.core.behaviours.MessageView import chat.rocket.core.internal.realtime.socket.model.State @@ -131,12 +132,7 @@ interface ChatRoomView : LoadingView, MessageView { fun populateEmojiSuggestions(emojis: List) - /** - * This user has joined the chat callback. - * - * @param userCanPost Whether the user can post a message or not. - */ - fun onJoined(userCanPost: Boolean) + fun onJoined(roomUiModel: RoomUiModel) fun showReactionsPopup(messageId: String) @@ -147,9 +143,6 @@ interface ChatRoomView : LoadingView, MessageView { */ fun populateCommandSuggestions(commands: List) - /** - * Communicate whether it's a broadcast channel and if current user can post to it. - */ - fun onRoomUpdated(userCanPost: Boolean, channelIsBroadcast: Boolean, userCanMod: Boolean) + fun onRoomUpdated(roomUiModel: RoomUiModel) } diff --git a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt index 606e627bb6..fa05081139 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt @@ -48,6 +48,7 @@ import chat.rocket.android.chatroom.uimodel.suggestion.ChatRoomSuggestionUiModel import chat.rocket.android.chatroom.uimodel.suggestion.CommandSuggestionUiModel import chat.rocket.android.chatroom.uimodel.suggestion.EmojiSuggestionUiModel import chat.rocket.android.chatroom.uimodel.suggestion.PeopleSuggestionUiModel +import chat.rocket.android.chatrooms.adapter.model.RoomUiModel import chat.rocket.android.draw.main.ui.DRAWING_BYTE_ARRAY_EXTRA_DATA import chat.rocket.android.draw.main.ui.DrawingActivity import chat.rocket.android.emoji.ComposerEditText @@ -380,17 +381,14 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR empty_chat_view.isVisible = adapter.itemCount == 0 } - override fun onRoomUpdated( - userCanPost: Boolean, - channelIsBroadcast: Boolean, - userCanMod: Boolean - ) { + override fun onRoomUpdated(roomUiModel: RoomUiModel) { // TODO: We should rely solely on the user being able to post, but we cannot guarantee // that the "(channels|groups).roles" endpoint is supported by the server in use. ui { - setupMessageComposer(userCanPost) - isBroadcastChannel = channelIsBroadcast - if (isBroadcastChannel && !userCanMod) { + setupToolbar(roomUiModel.name.toString()) + setupMessageComposer(roomUiModel) + isBroadcastChannel = roomUiModel.broadcast + if (isBroadcastChannel && !roomUiModel.canModerate) { disableMenu = true activity?.invalidateOptionsMenu() } @@ -731,12 +729,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR } } - override fun onJoined(userCanPost: Boolean) { + override fun onJoined(roomUiModel: RoomUiModel) { ui { input_container.isVisible = true button_join_chat.isVisible = false isSubscribed = true - setupMessageComposer(userCanPost) } } @@ -769,8 +766,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR } } - private fun setupMessageComposer(canPost: Boolean) { - if (isReadOnly && !canPost) { + private fun setupMessageComposer(roomUiModel: RoomUiModel) { + if (isReadOnly && !roomUiModel.canPost) { text_room_is_read_only.isVisible = true input_container.isVisible = false } else if (!isSubscribed && roomTypeOf(chatRoomType) !is RoomType.DirectMessage) { diff --git a/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomUiModelMapper.kt b/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomUiModelMapper.kt index a5e79b6c85..7abfcc4b5a 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomUiModelMapper.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomUiModelMapper.kt @@ -8,8 +8,6 @@ import androidx.core.text.color import chat.rocket.android.R import chat.rocket.android.chatrooms.adapter.model.RoomUiModel import chat.rocket.android.db.model.ChatRoom -import chat.rocket.android.infrastructure.LocalRepository -import chat.rocket.android.infrastructure.checkIfMyself import chat.rocket.android.server.domain.GetCurrentUserInteractor import chat.rocket.android.server.domain.PublicSettings import chat.rocket.android.server.domain.showLastMessage @@ -102,6 +100,7 @@ class RoomUiModelMapper( } } + @Synchronized fun map(chatRoom: ChatRoom, showLastMessage:Boolean = true): RoomUiModel { return with(chatRoom.chatRoom) { val isUnread = alert || unread > 0 diff --git a/app/src/main/java/chat/rocket/android/chatrooms/adapter/model/RoomUiModel.kt b/app/src/main/java/chat/rocket/android/chatrooms/adapter/model/RoomUiModel.kt index 164c31d56c..8b579e3575 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/adapter/model/RoomUiModel.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/adapter/model/RoomUiModel.kt @@ -14,5 +14,8 @@ data class RoomUiModel( val alert: Boolean = false, val lastMessage: CharSequence? = null, val status: UserStatus? = null, - val username: String? = null -) \ No newline at end of file + val username: String? = null, + val broadcast: Boolean = false, + val canModerate: Boolean = false, + val canPost: Boolean = true +) diff --git a/app/src/main/java/chat/rocket/android/server/infraestructure/ConnectionManager.kt b/app/src/main/java/chat/rocket/android/server/infraestructure/ConnectionManager.kt index 954ccfbe69..31fb21dd6b 100644 --- a/app/src/main/java/chat/rocket/android/server/infraestructure/ConnectionManager.kt +++ b/app/src/main/java/chat/rocket/android/server/infraestructure/ConnectionManager.kt @@ -22,6 +22,7 @@ import chat.rocket.core.internal.realtime.unsubscribe import chat.rocket.core.internal.rest.chatRooms import chat.rocket.core.model.Message import chat.rocket.core.model.Myself +import chat.rocket.core.model.Room import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.Job import kotlinx.coroutines.experimental.channels.Channel @@ -45,6 +46,7 @@ class ConnectionManager( private val roomMessagesChannels = LinkedHashMap>() private val userDataChannels = ArrayList>() + private val roomsChannels = LinkedHashMap>() private val subscriptionIdMap = HashMap() private var subscriptionId: String? = null @@ -127,6 +129,18 @@ class ConnectionManager( maxSize = 10) { batch -> Timber.d("processing Stream batch: ${batch.size} - $batch") dbManager.processChatRoomsBatch(batch) + + batch.forEach { + //TODO - Do we need to handle Type.Removed and Type.Inserted here? + if (it.type == Type.Updated) { + if (it.data is Room) { + val room = it.data as Room + roomsChannels[it.data.id]?.let { channel -> + channel.offer(room) + } + } + } + } } val messagesActor = createBatchActor(messagesContext, parent = connectJob, @@ -241,6 +255,14 @@ class ConnectionManager( fun removeUserDataChannel(channel: Channel) = userDataChannels.remove(channel) + fun addRoomChannel(roomId: String, channel: Channel) { + roomsChannels[roomId] = channel + } + + fun removeRoomChannel(roomId: String) { + roomsChannels.remove(roomId) + } + fun subscribeRoomMessages(roomId: String, channel: Channel) { val oldSub = roomMessagesChannels.put(roomId, channel) if (oldSub != null) { diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From 722b8caa34ed197fd5e68f74000fc1a41bb12bf0 Mon Sep 17 00:00:00 2001 From: Filipe de Lima Brito Date: Mon, 12 Nov 2018 12:54:02 -0800 Subject: [PATCH 022/149] Revert "Merge branch 'develop' of github.com:RocketChat/Rocket.Chat.Android into new/delete-my-account" This reverts commit d0663f55ad4a2b7ef91c56c3a7af0f2a9aadba95, reversing changes made to abacf9eec610a1d189ff2dad33195183832ad1ff. --- app/build-sdk.sh | 0 app/src/main/ic_launcher-web.png | Bin app/src/main/res/values-ja/strings.xml | 109 ++++++++++++------------- gradlew | 0 4 files changed, 54 insertions(+), 55 deletions(-) mode change 100644 => 100755 app/build-sdk.sh mode change 100644 => 100755 app/src/main/ic_launcher-web.png mode change 100644 => 100755 gradlew diff --git a/app/build-sdk.sh b/app/build-sdk.sh old mode 100644 new mode 100755 diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 7e10131617..77b52b22b4 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -16,13 +16,13 @@ メンバー メンバー (%d) 設定 - 環境設定 - パスワードの変更 - 管理パネル + Preferences + Change Password + Admin panel パスワードの変更 プロフィールの更新 About - 新しいチャネルを作成 + 新しいチャネルを作成します Are you sure? @@ -46,21 +46,21 @@ 状態を隠す 絵を描く ギャラリーに保存 - ギャラリーの写真を選択 - 写真を撮る - アバターをリセット - サーバーに接続 - コミュニティに参加 - 新規サーバーを作成 - 登録 - 確認 + Select photo from gallery + Take photo + Reset avatar + Connect with a server + Join in the community + Create a new server + Register + Confirm Delete account - 環境設定 - パスワードの変更 - アプリ情報 + Preferences + Change Password + About アプリを共有する @@ -78,28 +78,28 @@ アバター URL またはソーシャルアカウントを使用する 新規ユーザー? %1$s - パスワードをお忘れですか? + パスワードをお忘れですか? %1$s リセット メールが送信されました! パスワードを変更するためには、受信ボックスを確認してください。 有効なメールアドレスを入力してください サインアップすることで、\n%1$s と %2$s に同意したとみなします。 - 今日 + Today 昨日 メッセージ この部屋は読み取り専用です 無効な 2FA コード 無効なファイル 無効なサーバー URL - Facebookでログイン - Githubでログイン - Googleでログイン - Linkedinでログイン - Meteorでログイン - Twitterでログイン - Gitlabでログイン - WordPressでログイン - メッセージを送信 - その他ログインオプション + Login using Facebook + Login using Github + Login using Google + Login using Linkedin + Login using Meteor + Login using Twitter + Login using Gitlab + Login using WordPress + メッセージを送信 + Show more login options 添付ファイルオプションを表示する あなた 不明 @@ -141,22 +141,22 @@ ファイルの説明 送信 添付ファイルを送信しました - Rocket.Chatへようこそ - チームコミュニケーション - e-mailでログイン - アカウントを作成 - Facebookでログイン - Githubでログイン - Googleでログイン - Linkedinでログイン - GitLabでログイン - WordPressでログイン - 二要素認証 - あなたの 2FA コードは何ですか? - - 更に表示 - - 隠す + Welcome to Rocket.Chat + Team Communication + Login with e-mail + Create an account + Continue with Facebook + Continue with Github + Continue with Google + Continue with Linkedin + Continue with GitLab + Continue with WordPress + Two-factor Authentication + What’s your 2FA code? + + view more + + view less プライベート @@ -172,14 +172,14 @@ メッセージをコピー メッセージを削除 このメッセージを削除してもよろしいですか? - - パーマリンクのコピー + + Permalink copied - トラッキングの分析 - アプリ改善のための匿名統計情報を送信する - アプリ改善のための匿名統計情報を送信しない - FOSSバージョンのため、適用できません + Analytics tracking + Send anonymous statics to help improving this app + Do not send anonymous statics to help improving this app + Not applicable since it is a FOSS version ルーム名を %1$s から %2$s へ変更しました。 @@ -211,7 +211,7 @@ メッセージの編集 リアクションする - パーマリンクのコピー + Copy permalink 編集は許可されていません @@ -296,7 +296,7 @@ ソート ソート アルファベット順 - アクティビティ順 + アクティビティで並べ替える グループ別 お気に入りのグループ ヘッダ @@ -311,13 +311,12 @@ 不明 - 共有メッセージの編集 + Edit shared message 返信 送信に失敗しました。もう一度お試しください。 メッセージは %1$s に送信されました! 読者 メッセージ情報 - - ルームタイプを %2$s から %1$s に変更しました - + + Room type changed to: %1$s by %2$s \ No newline at end of file diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From b6496508dbd987cc321b9976419f8d38f40dab0d Mon Sep 17 00:00:00 2001 From: Govind Dixit <32304546+GOVINDDIXIT@users.noreply.github.com> Date: Tue, 13 Nov 2018 13:23:15 +0530 Subject: [PATCH 023/149] conflicts resolved, code improved --- .../android/settings/ui/SettingsFragment.kt | 11 +- app/src/main/res/values-ja/strings.xml | 113 +++++++++--------- 2 files changed, 60 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt index 5e20df4c7b..524bb60d4d 100644 --- a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt +++ b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt @@ -87,21 +87,16 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen shareIntent.putExtra(Intent.EXTRA_TEXT, shareSub) startActivity(Intent.createChooser(shareIntent, getString(R.string.msg_share_using))) } - resources.getString(R.string.title_rate_us) -> - startAppPlayStore() + resources.getString(R.string.title_rate_us) -> startAppPlayStore() } } - fun getMarketAppLink(): String { - return getString(R.string.market_link) - } - fun getMarketWebLink(): String { - return getString(R.string.play_store_link) - } private fun startAppPlayStore() { try { + fun getMarketAppLink()= getString(R.string.market_link) startActivity(Intent(Intent.ACTION_VIEW, getMarketAppLink().toUri())) } catch (error: ActivityNotFoundException) { + fun getMarketWebLink() = getString(R.string.play_store_link) startActivity(Intent(Intent.ACTION_VIEW, getMarketWebLink().toUri())) } } diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index cabf49b3ee..4a325b0e0e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -16,15 +16,15 @@ メンバー メンバー (%d) 設定 - Preferences - Change Password + 環境設定 + パスワードの変更 私たちを評価してください - Admin panel + 管理パネル パスワードの変更 プロフィールの更新 About - 新しいチャネルを作成します - Are You Sure you want to logout? + 新しいチャネルを作成 + ログアウトしますか? @@ -38,7 +38,7 @@ チャンネル作成 作ります ログアウト - Stay + いいえ ファイル 変更したパスワードの確認 チャットに参加 @@ -49,22 +49,22 @@ 状態を隠す 絵を描く ギャラリーに保存 - Select photo from gallery - Take photo - Reset avatar - Connect with a server - Join in the community - Create a new server - Register - Confirm + ギャラリーの写真を選択 + 写真を撮る + アバターをリセット + サーバーに接続 + コミュニティに参加 + 新規サーバーを作成 + 登録 + 確認 - Preferences - Change Password + 環境設定 + パスワードの変更 アプリを共有する 私たちを評価してください - About + アプリ情報 @@ -81,28 +81,28 @@ アバター URL またはソーシャルアカウントを使用する 新規ユーザー? %1$s - パスワードをお忘れですか? %1$s + パスワードをお忘れですか? リセット メールが送信されました! パスワードを変更するためには、受信ボックスを確認してください。 有効なメールアドレスを入力してください サインアップすることで、\n%1$s と %2$s に同意したとみなします。 - Today + 今日 昨日 メッセージ この部屋は読み取り専用です 無効な 2FA コード 無効なファイル 無効なサーバー URL - Login using Facebook - Login using Github - Login using Google - Login using Linkedin - Login using Meteor - Login using Twitter - Login using Gitlab - Login using WordPress - メッセージを送信 - Show more login options + Facebookでログイン + Githubでログイン + Googleでログイン + Linkedinでログイン + Meteorでログイン + Twitterでログイン + Gitlabでログイン + WordPressでログイン + メッセージを送信 + その他ログインオプション 添付ファイルオプションを表示する あなた 不明 @@ -144,22 +144,22 @@ ファイルの説明 送信 添付ファイルを送信しました - Welcome to Rocket.Chat - Team Communication - Login with e-mail - Create an account - Continue with Facebook - Continue with Github - Continue with Google - Continue with Linkedin - Continue with GitLab - Continue with WordPress - Two-factor Authentication - What’s your 2FA code? - - view more - - view less + Rocket.Chatへようこそ + チームコミュニケーション + e-mailでログイン + アカウントを作成 + Facebookでログイン + Githubでログイン + Googleでログイン + Linkedinでログイン + GitLabでログイン + WordPressでログイン + 二要素認証 + あなたの 2FA コードは何ですか? + + 更に表示 + + 隠す プライベート @@ -175,14 +175,14 @@ メッセージをコピー メッセージを削除 このメッセージを削除してもよろしいですか? - - Permalink copied + + パーマリンクのコピー - Analytics tracking - Send anonymous statics to help improving this app - Do not send anonymous statics to help improving this app - Not applicable since it is a FOSS version + トラッキングの分析 + アプリ改善のための匿名統計情報を送信する + アプリ改善のための匿名統計情報を送信しない + FOSSバージョンのため、適用できません ルーム名を %1$s から %2$s へ変更しました。 @@ -214,7 +214,7 @@ メッセージの編集 リアクションする - Copy permalink + パーマリンクのコピー 編集は許可されていません @@ -299,7 +299,7 @@ ソート ソート アルファベット順 - アクティビティで並べ替える + アクティビティ順 グループ別 お気に入りのグループ ヘッダ @@ -314,12 +314,13 @@ 不明 - Edit shared message + 共有メッセージの編集 返信 送信に失敗しました。もう一度お試しください。 メッセージは %1$s に送信されました! 読者 メッセージ情報 - - Room type changed to: %1$s by %2$s + + ルームタイプを %2$s から %1$s に変更しました + \ No newline at end of file From c3037e3e957682fbea5974e7650c10e808352ee3 Mon Sep 17 00:00:00 2001 From: Lucio Maciel Date: Tue, 13 Nov 2018 16:38:54 -0300 Subject: [PATCH 024/149] retryDB --- .../infrastructure/ChatRoomsRepository.kt | 10 ++- .../chat/rocket/android/db/DatabaseManager.kt | 76 ++++++++++--------- .../infraestructure/DatabaseMessageMapper.kt | 41 ++-------- .../DatabaseMessagesRepository.kt | 47 +++++++----- .../main/java/chat/rocket/android/util/IO.kt | 29 +++++++ 5 files changed, 114 insertions(+), 89 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatrooms/infrastructure/ChatRoomsRepository.kt b/app/src/main/java/chat/rocket/android/chatrooms/infrastructure/ChatRoomsRepository.kt index ae36116d91..41850a4cb1 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/infrastructure/ChatRoomsRepository.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/infrastructure/ChatRoomsRepository.kt @@ -3,9 +3,12 @@ package chat.rocket.android.chatrooms.infrastructure import androidx.lifecycle.LiveData import chat.rocket.android.db.ChatRoomDao import chat.rocket.android.db.model.ChatRoom +import chat.rocket.android.util.retryDB import javax.inject.Inject -class ChatRoomsRepository @Inject constructor(private val dao: ChatRoomDao){ +class ChatRoomsRepository @Inject constructor(private val dao: ChatRoomDao) { + + // TODO - check how to use retryDB here - suspend fun getChatRooms(order: Order): LiveData> { return when(order) { Order.ACTIVITY -> dao.getAll() @@ -15,9 +18,10 @@ class ChatRoomsRepository @Inject constructor(private val dao: ChatRoomDao){ } } - fun search(query: String) = dao.searchSync(query) + suspend fun search(query: String) = + retryDB("roomSearch($query)") { dao.searchSync(query) } - fun count() = dao.count() + suspend fun count() = retryDB("roomsCount") { dao.count() } enum class Order { ACTIVITY, diff --git a/app/src/main/java/chat/rocket/android/db/DatabaseManager.kt b/app/src/main/java/chat/rocket/android/db/DatabaseManager.kt index eefa1e7cd3..f72f45fc27 100644 --- a/app/src/main/java/chat/rocket/android/db/DatabaseManager.kt +++ b/app/src/main/java/chat/rocket/android/db/DatabaseManager.kt @@ -19,6 +19,7 @@ import chat.rocket.android.util.extensions.exhaustive import chat.rocket.android.util.extensions.removeTrailingSlash import chat.rocket.android.util.extensions.toEntity import chat.rocket.android.util.extensions.userId +import chat.rocket.android.util.retryDB import chat.rocket.common.model.BaseRoom import chat.rocket.common.model.RoomType import chat.rocket.common.model.SimpleUser @@ -96,7 +97,9 @@ class DatabaseManager(val context: Application, val serverUrl: String) { } suspend fun getRoom(id: String) = withContext(dbManagerContext) { - chatRoomDao().get(id) + retryDB("getRoom($id)") { + chatRoomDao().get(id) + } } fun processUsersBatch(users: List) { @@ -151,7 +154,7 @@ class DatabaseManager(val context: Application, val serverUrl: String) { fun updateSelfUser(myself: Myself) { launch(dbManagerContext) { - val user = userDao().getUser(myself.id) + val user = retryDB("getUser(${myself.id})") { userDao().getUser(myself.id) } val entity = user?.copy( name = myself.name ?: user.name, username = myself.username ?: user.username, @@ -335,7 +338,7 @@ class DatabaseManager(val context: Application, val serverUrl: String) { } private suspend fun updateRoom(data: Room): ChatRoomEntity? { - return chatRoomDao().get(data.id)?.let { current -> + return retryDB("getChatRoom(${data.id})") { chatRoomDao().get(data.id) }?.let { current -> with(data) { val chatRoom = current.chatRoom @@ -373,7 +376,7 @@ class DatabaseManager(val context: Application, val serverUrl: String) { context.getString(R.string.msg_sent_attachment) private suspend fun updateSubscription(data: Subscription): ChatRoomEntity? { - return chatRoomDao().get(data.roomId)?.let { current -> + return retryDB("getRoom(${data.roomId}") { chatRoomDao().get(data.roomId) }?.let { current -> with(data) { val userId = if (type is RoomType.DirectMessage) { @@ -539,39 +542,42 @@ class DatabaseManager(val context: Application, val serverUrl: String) { } } - private fun findUser(userId: String): String? = userDao().findUser(userId) + private suspend fun findUser(userId: String): String? = + retryDB("findUser($userId)") { userDao().findUser(userId) } - private fun doOperation(operation: Operation) { - when (operation) { - is Operation.ClearStatus -> userDao().clearStatus() - is Operation.UpdateRooms -> { - Timber.d("Running ChatRooms transaction: remove: ${operation.toRemove} - insert: ${operation.toInsert} - update: ${operation.toUpdate}") + private suspend fun doOperation(operation: Operation) { + retryDB(description = "doOperation($operation)") { + when (operation) { + is Operation.ClearStatus -> userDao().clearStatus() + is Operation.UpdateRooms -> { + Timber.d("Running ChatRooms transaction: remove: ${operation.toRemove} - insert: ${operation.toInsert} - update: ${operation.toUpdate}") - chatRoomDao().update(operation.toInsert, operation.toUpdate, operation.toRemove) - } - is Operation.InsertRooms -> { - chatRoomDao().insertOrReplace(operation.chatRooms) - } - is Operation.CleanInsertRooms -> { - chatRoomDao().cleanInsert(operation.chatRooms) - } - is Operation.InsertUsers -> { - val time = measureTimeMillis { userDao().upsert(operation.users) } - Timber.d("Upserted users batch(${operation.users.size}) in $time MS") - } - is Operation.InsertUser -> { - userDao().insert(operation.user) - } - is Operation.UpsertUser -> { - userDao().upsert(operation.user) - } - is Operation.InsertMessages -> { - messageDao().insert(operation.list) - } - is Operation.SaveLastSync -> { - messageDao().saveLastSync(operation.sync) - } - }.exhaustive + chatRoomDao().update(operation.toInsert, operation.toUpdate, operation.toRemove) + } + is Operation.InsertRooms -> { + chatRoomDao().insertOrReplace(operation.chatRooms) + } + is Operation.CleanInsertRooms -> { + chatRoomDao().cleanInsert(operation.chatRooms) + } + is Operation.InsertUsers -> { + val time = measureTimeMillis { userDao().upsert(operation.users) } + Timber.d("Upserted users batch(${operation.users.size}) in $time MS") + } + is Operation.InsertUser -> { + userDao().insert(operation.user) + } + is Operation.UpsertUser -> { + userDao().upsert(operation.user) + } + is Operation.InsertMessages -> { + messageDao().insert(operation.list) + } + is Operation.SaveLastSync -> { + messageDao().saveLastSync(operation.sync) + } + }.exhaustive + } } } diff --git a/app/src/main/java/chat/rocket/android/server/infraestructure/DatabaseMessageMapper.kt b/app/src/main/java/chat/rocket/android/server/infraestructure/DatabaseMessageMapper.kt index 316883fec5..a66e7ce15f 100644 --- a/app/src/main/java/chat/rocket/android/server/infraestructure/DatabaseMessageMapper.kt +++ b/app/src/main/java/chat/rocket/android/server/infraestructure/DatabaseMessageMapper.kt @@ -7,6 +7,7 @@ import chat.rocket.android.db.model.FullMessage import chat.rocket.android.db.model.ReactionEntity import chat.rocket.android.db.model.UrlEntity import chat.rocket.android.db.model.UserEntity +import chat.rocket.android.util.retryDB import chat.rocket.common.model.SimpleRoom import chat.rocket.common.model.SimpleUser import chat.rocket.core.model.Message @@ -135,14 +136,18 @@ class DatabaseMessageMapper(private val dbManager: DatabaseManager) { with(attachment) { val fields = if (hasFields) { withContext(CommonPool) { - dbManager.messageDao().getAttachmentFields(attachment._id) + retryDB("getAttachmentFields(${attachment._id})") { + dbManager.messageDao().getAttachmentFields(attachment._id) + } }.map { Field(it.title, it.value) } } else { null } val actions = if (hasActions) { withContext(CommonPool) { - dbManager.messageDao().getAttachmentActions(attachment._id) + retryDB("getAttachmentActions(${attachment._id})") { + dbManager.messageDao().getAttachmentActions(attachment._id) + } }.mapNotNull { mapAction(it) } } else { null @@ -183,29 +188,6 @@ class DatabaseMessageMapper(private val dbManager: DatabaseManager) { return list } - /*private suspend fun mapColorAttachmentWithFields(entity: AttachmentEntity): ColorAttachment { - val fields = withContext(CommonPool) { - dbManager.messageDao().getAttachmentFields(entity._id) - }.map { Field(it.title, it.value) } - return with(entity) { - ColorAttachment( - color = Color.Custom(color ?: DEFAULT_COLOR_STR), - text = text ?: "", - fallback = fallback, - fields = fields) - } - } - - private suspend fun mapActionAttachment(attachment: AttachmentEntity): ActionsAttachment { - val actions = withContext(CommonPool) { - dbManager.messageDao().getAttachmentActions(attachment._id) - }.mapNotNull { mapAction(it) } - return with(attachment) { - // TODO - remove the default "vertical" value from here... - ActionsAttachment(title, actions, buttonAlignment ?: "vertical") - } - }*/ - private fun mapAction(action: AttachmentActionEntity): Action? { return when (action.type) { "button" -> ButtonAction(action.type, action.text, action.url, action.isWebView, @@ -214,13 +196,4 @@ class DatabaseMessageMapper(private val dbManager: DatabaseManager) { else -> null } } - - /*private suspend fun mapAuthorAttachment(attachment: AttachmentEntity): AuthorAttachment { - val fields = withContext(CommonPool) { - dbManager.messageDao().getAttachmentFields(attachment._id) - }.map { Field(it.title, it.value) } - return with(attachment) { - AuthorAttachment(authorLink!!, authorIcon, authorName, fields) - } - }*/ } \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/server/infraestructure/DatabaseMessagesRepository.kt b/app/src/main/java/chat/rocket/android/server/infraestructure/DatabaseMessagesRepository.kt index 8d8fbd414f..b28e6d12cd 100644 --- a/app/src/main/java/chat/rocket/android/server/infraestructure/DatabaseMessagesRepository.kt +++ b/app/src/main/java/chat/rocket/android/server/infraestructure/DatabaseMessagesRepository.kt @@ -4,6 +4,7 @@ import chat.rocket.android.db.DatabaseManager import chat.rocket.android.db.Operation import chat.rocket.android.db.model.MessagesSync import chat.rocket.android.server.domain.MessagesRepository +import chat.rocket.android.util.retryDB import chat.rocket.core.model.Message import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.withContext @@ -14,25 +15,31 @@ class DatabaseMessagesRepository( ) : MessagesRepository { override suspend fun getById(id: String): Message? = withContext(CommonPool) { - dbManager.messageDao().getMessageById(id)?.let { message -> mapper.map(message) } + retryDB("getMessageById($id)") { + dbManager.messageDao().getMessageById(id)?.let { message -> mapper.map(message) } + } } override suspend fun getByRoomId(roomId: String): List = withContext(CommonPool) { // FIXME - investigate how to avoid this distinctBy here, since DAO is returning a lot of // duplicate rows (something related to our JOINS and relations on Room) - dbManager.messageDao().getMessagesByRoomId(roomId) - .distinctBy { it.message.message.id } - .let { messages -> - mapper.map(messages) - } + retryDB("getMessagesByRoomId($roomId)") { + dbManager.messageDao().getMessagesByRoomId(roomId) + .distinctBy { it.message.message.id } + .let { messages -> + mapper.map(messages) + } + } } override suspend fun getRecentMessages(roomId: String, count: Long): List = withContext(CommonPool) { - dbManager.messageDao().getRecentMessagesByRoomId(roomId, count) - .distinctBy { it.message.message.id } - .let { messages -> - mapper.map(messages) - } + retryDB("getRecentMessagesByRoomId($roomId, $count)") { + dbManager.messageDao().getRecentMessagesByRoomId(roomId, count) + .distinctBy { it.message.message.id } + .let { messages -> + mapper.map(messages) + } + } } override suspend fun save(message: Message) { @@ -45,20 +52,24 @@ class DatabaseMessagesRepository( override suspend fun removeById(id: String) { withContext(CommonPool) { - dbManager.messageDao().delete(id) + retryDB("delete($id)") { dbManager.messageDao().delete(id) } } } override suspend fun removeByRoomId(roomId: String) { withContext(CommonPool) { - dbManager.messageDao().deleteByRoomId(roomId) + retryDB("deleteByRoomId($roomId)") { + dbManager.messageDao().deleteByRoomId(roomId) + } } } override suspend fun getAllUnsent(): List = withContext(CommonPool) { - dbManager.messageDao().getUnsentMessages() - .distinctBy { it.message.message.id } - .let { mapper.map(it) } + retryDB("getUnsentMessages") { + dbManager.messageDao().getUnsentMessages() + .distinctBy { it.message.message.id } + .let { mapper.map(it) } + } } override suspend fun saveLastSyncDate(roomId: String, timeMillis: Long) { @@ -66,6 +77,8 @@ class DatabaseMessagesRepository( } override suspend fun getLastSyncDate(roomId: String): Long? = withContext(CommonPool) { - dbManager.messageDao().getLastSync(roomId)?.let { it.timestamp } + retryDB("getLastSync($roomId)") { + dbManager.messageDao().getLastSync(roomId)?.let { it.timestamp } + } } } \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/util/IO.kt b/app/src/main/java/chat/rocket/android/util/IO.kt index 9b918cf198..7818f6db67 100644 --- a/app/src/main/java/chat/rocket/android/util/IO.kt +++ b/app/src/main/java/chat/rocket/android/util/IO.kt @@ -1,5 +1,6 @@ package chat.rocket.android.util +import android.database.sqlite.SQLiteDatabaseLockedException import chat.rocket.common.RocketChatNetworkErrorException import kotlinx.coroutines.experimental.TimeoutCancellationException import kotlinx.coroutines.experimental.delay @@ -8,6 +9,7 @@ import timber.log.Timber import kotlin.coroutines.experimental.coroutineContext const val DEFAULT_RETRY = 3 +private const val DEFAULT_DB_RETRY = 5 suspend fun retryIO( description: String = "", @@ -32,6 +34,33 @@ suspend fun retryIO( currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelay) } + if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled") + return block() // last attempt +} + +suspend fun retryDB( + description: String = "", + times: Int = DEFAULT_DB_RETRY, + initialDelay: Long = 100, // 0.1 second + maxDelay: Long = 500, // 0.5 second + factor: Double = 1.2, + block: suspend () -> T): T +{ + var currentDelay = initialDelay + repeat(times - 1) { currentTry -> + if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled") + try { + return block() + } catch (e: SQLiteDatabaseLockedException) { + Timber.d(e, "failed call($currentTry): $description") + e.printStackTrace() + } + + if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled") + delay(currentDelay) + currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelay) + } + if (!coroutineContext.isActive) throw TimeoutCancellationException("job canceled") return block() // last attempt } \ No newline at end of file From a618439751d6ed7e9e246009f441a89b66f73f23 Mon Sep 17 00:00:00 2001 From: Samer Alabi Date: Tue, 13 Nov 2018 20:57:33 -0500 Subject: [PATCH 025/149] Recreation of Original Chat Details --- .../chat.rocket.android.db.RCDatabase/10.json | 24 +- .../chat.rocket.android.db.RCDatabase/12.json | 1105 +++++++++++++++++ app/src/main/AndroidManifest.xml | 5 + .../di/ChatDetailsFragmentModule.kt | 41 + .../di/ChatDetailsFragmentProvider.kt | 13 + .../chatdetails/di/ChatDetailsModule.kt | 14 + .../android/chatdetails/domain/ChatDetails.kt | 10 + .../presentation/ChatDetailsNavigator.kt | 42 + .../presentation/ChatDetailsPresenter.kt | 71 ++ .../presentation/ChatDetailsView.kt | 9 + .../chatdetails/ui/ChatDetailsActivity.kt | 85 ++ .../chatdetails/ui/ChatDetailsAdapter.kt | 49 + .../chatdetails/ui/ChatDetailsFragment.kt | 198 +++ .../viewmodel/ChatDetailsViewModel.kt | 28 + .../viewmodel/ChatDetailsViewModelFactory.kt | 12 + .../presentation/ChatRoomNavigator.kt | 44 +- .../presentation/ChatRoomPresenter.kt | 24 +- .../android/chatroom/ui/ChatRoomFragment.kt | 12 +- .../chat/rocket/android/chatroom/ui/Menu.kt | 62 +- .../android/chatroom/uimodel/UiModelMapper.kt | 2 +- .../android/dagger/module/ActivityBuilder.kt | 18 +- .../chat/rocket/android/db/ChatRoomDao.kt | 10 +- .../chat/rocket/android/db/DatabaseManager.kt | 20 +- .../rocket/android/db/model/ChatRoomEntity.kt | 3 + .../ui/FavoriteMessagesFragment.kt | 7 +- .../rocket/android/files/ui/FilesFragment.kt | 8 +- .../members/di/MembersFragmentModule.kt | 4 +- .../members/presentation/MembersNavigator.kt | 4 +- .../android/members/ui/MembersFragment.kt | 10 +- .../android/mentions/ui/MentionsFragment.kt | 8 +- .../ui/PinnedMessagesFragment.kt | 7 +- app/src/main/res/drawable/ic_files_24dp.xml | 2 - .../drawable/ic_info_outline_white_24dp.xml | 9 + .../drawable/ic_people_outline_black_24dp.xml | 9 + .../main/res/layout/activity_chat_details.xml | 15 + .../main/res/layout/app_bar_chat_details.xml | 29 + .../main/res/layout/fragment_chat_details.xml | 74 ++ .../main/res/layout/item_detail_option.xml | 26 + app/src/main/res/values-de/strings.xml | 10 +- app/src/main/res/values-es/strings.xml | 8 +- app/src/main/res/values-fr/strings.xml | 7 + app/src/main/res/values-hi-rIN/strings.xml | 7 + app/src/main/res/values-ja/strings.xml | 7 + app/src/main/res/values-pt-rBR/strings.xml | 7 + app/src/main/res/values-ru-rRU/strings.xml | 7 + app/src/main/res/values-tr/strings.xml | 8 +- app/src/main/res/values-uk/strings.xml | 7 + app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 8 + app/src/main/res/values/styles.xml | 12 +- 50 files changed, 2063 insertions(+), 139 deletions(-) create mode 100644 app/schemas/chat.rocket.android.db.RCDatabase/12.json create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/di/ChatDetailsFragmentModule.kt create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/di/ChatDetailsFragmentProvider.kt create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/di/ChatDetailsModule.kt create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/domain/ChatDetails.kt create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/presentation/ChatDetailsNavigator.kt create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/presentation/ChatDetailsPresenter.kt create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/presentation/ChatDetailsView.kt create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/ui/ChatDetailsActivity.kt create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/ui/ChatDetailsAdapter.kt create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/ui/ChatDetailsFragment.kt create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/viewmodel/ChatDetailsViewModel.kt create mode 100644 app/src/main/java/chat/rocket/android/chatdetails/viewmodel/ChatDetailsViewModelFactory.kt create mode 100644 app/src/main/res/drawable/ic_info_outline_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_people_outline_black_24dp.xml create mode 100644 app/src/main/res/layout/activity_chat_details.xml create mode 100644 app/src/main/res/layout/app_bar_chat_details.xml create mode 100644 app/src/main/res/layout/fragment_chat_details.xml create mode 100644 app/src/main/res/layout/item_detail_option.xml diff --git a/app/schemas/chat.rocket.android.db.RCDatabase/10.json b/app/schemas/chat.rocket.android.db.RCDatabase/10.json index a17af93dbf..d6d34f33e3 100644 --- a/app/schemas/chat.rocket.android.db.RCDatabase/10.json +++ b/app/schemas/chat.rocket.android.db.RCDatabase/10.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 10, - "identityHash": "db46c12dbb8747200288f48d5dc5558b", + "identityHash": "4024406c23a09800c0c3e987c6b5d40b", "entities": [ { "tableName": "users", @@ -59,7 +59,7 @@ }, { "tableName": "chatrooms", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, `broadcast` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `topic` TEXT, `announcement` TEXT, `description` TEXT, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, `broadcast` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )", "fields": [ { "fieldPath": "id", @@ -121,6 +121,24 @@ "affinity": "INTEGER", "notNull": false }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "announcement", + "columnName": "announcement", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, { "fieldPath": "open", "columnName": "open", @@ -1075,7 +1093,7 @@ ], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"db46c12dbb8747200288f48d5dc5558b\")" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"4024406c23a09800c0c3e987c6b5d40b\")" ] } } \ No newline at end of file diff --git a/app/schemas/chat.rocket.android.db.RCDatabase/12.json b/app/schemas/chat.rocket.android.db.RCDatabase/12.json new file mode 100644 index 0000000000..6a44649139 --- /dev/null +++ b/app/schemas/chat.rocket.android.db.RCDatabase/12.json @@ -0,0 +1,1105 @@ +{ + "formatVersion": 1, + "database": { + "version": 12, + "identityHash": "fb9f1c815809b0217d326452aeb34e92", + "entities": [ + { + "tableName": "users", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `username` TEXT, `name` TEXT, `status` TEXT NOT NULL, `utcOffset` REAL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "username", + "columnName": "username", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "utcOffset", + "columnName": "utcOffset", + "affinity": "REAL", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_users_username", + "unique": false, + "columnNames": [ + "username" + ], + "createSql": "CREATE INDEX `index_users_username` ON `${TABLE_NAME}` (`username`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "chatrooms", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `topic` TEXT, `announcement` TEXT, `description` TEXT, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, `broadcast` INTEGER, `muted` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subscriptionId", + "columnName": "subscriptionId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "fullname", + "columnName": "fullname", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "userId", + "columnName": "userId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ownerId", + "columnName": "ownerId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "readonly", + "columnName": "readonly", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "isDefault", + "columnName": "isDefault", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "favorite", + "columnName": "favorite", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "topic", + "columnName": "topic", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "announcement", + "columnName": "announcement", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "open", + "columnName": "open", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "alert", + "columnName": "alert", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userMentions", + "columnName": "userMentions", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "groupMentions", + "columnName": "groupMentions", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "updatedAt", + "columnName": "updatedAt", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "timestamp", + "columnName": "timestamp", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lastSeen", + "columnName": "lastSeen", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lastMessageText", + "columnName": "lastMessageText", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastMessageUserId", + "columnName": "lastMessageUserId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastMessageTimestamp", + "columnName": "lastMessageTimestamp", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "broadcast", + "columnName": "broadcast", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "muted", + "columnName": "muted", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_chatrooms_userId", + "unique": false, + "columnNames": [ + "userId" + ], + "createSql": "CREATE INDEX `index_chatrooms_userId` ON `${TABLE_NAME}` (`userId`)" + }, + { + "name": "index_chatrooms_ownerId", + "unique": false, + "columnNames": [ + "ownerId" + ], + "createSql": "CREATE INDEX `index_chatrooms_ownerId` ON `${TABLE_NAME}` (`ownerId`)" + }, + { + "name": "index_chatrooms_subscriptionId", + "unique": true, + "columnNames": [ + "subscriptionId" + ], + "createSql": "CREATE UNIQUE INDEX `index_chatrooms_subscriptionId` ON `${TABLE_NAME}` (`subscriptionId`)" + }, + { + "name": "index_chatrooms_updatedAt", + "unique": false, + "columnNames": [ + "updatedAt" + ], + "createSql": "CREATE INDEX `index_chatrooms_updatedAt` ON `${TABLE_NAME}` (`updatedAt`)" + }, + { + "name": "index_chatrooms_lastMessageUserId", + "unique": false, + "columnNames": [ + "lastMessageUserId" + ], + "createSql": "CREATE INDEX `index_chatrooms_lastMessageUserId` ON `${TABLE_NAME}` (`lastMessageUserId`)" + } + ], + "foreignKeys": [ + { + "table": "users", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "ownerId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "users", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "userId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "users", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "lastMessageUserId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "messages", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `roomId` TEXT NOT NULL, `message` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `senderId` TEXT, `updatedAt` INTEGER, `editedAt` INTEGER, `editedBy` TEXT, `senderAlias` TEXT, `avatar` TEXT, `type` TEXT, `groupable` INTEGER NOT NULL, `parseUrls` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `role` TEXT, `synced` INTEGER NOT NULL, `unread` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`senderId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`editedBy`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomId", + "columnName": "roomId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "message", + "columnName": "message", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timestamp", + "columnName": "timestamp", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "senderId", + "columnName": "senderId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "updatedAt", + "columnName": "updatedAt", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "editedAt", + "columnName": "editedAt", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "editedBy", + "columnName": "editedBy", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "senderAlias", + "columnName": "senderAlias", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "avatar", + "columnName": "avatar", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "groupable", + "columnName": "groupable", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "parseUrls", + "columnName": "parseUrls", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "pinned", + "columnName": "pinned", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "role", + "columnName": "role", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "synced", + "columnName": "synced", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "unread", + "columnName": "unread", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "users", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "senderId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "users", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "editedBy" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "message_favorites", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "fields": [ + { + "fieldPath": "messageId", + "columnName": "messageId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userId", + "columnName": "userId", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "messageId", + "userId" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "messages", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "messageId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "users", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "userId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "message_mentions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "fields": [ + { + "fieldPath": "messageId", + "columnName": "messageId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "userId", + "columnName": "userId", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "messageId", + "userId" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "messages", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "messageId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "users", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "userId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "message_channels", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `roomId` TEXT NOT NULL, `roomName` TEXT, PRIMARY KEY(`messageId`, `roomId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "messageId", + "columnName": "messageId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomId", + "columnName": "roomId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "roomName", + "columnName": "roomName", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "messageId", + "roomId" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "messages", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "messageId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "attachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` TEXT NOT NULL, `message_id` TEXT NOT NULL, `title` TEXT, `type` TEXT, `description` TEXT, `text` TEXT, `author_name` TEXT, `author_icon` TEXT, `author_link` TEXT, `thumb_url` TEXT, `color` TEXT, `fallback` TEXT, `title_link` TEXT, `title_link_download` INTEGER NOT NULL, `image_url` TEXT, `image_type` TEXT, `image_size` INTEGER, `video_url` TEXT, `video_type` TEXT, `video_size` INTEGER, `audio_url` TEXT, `audio_type` TEXT, `audio_size` INTEGER, `message_link` TEXT, `timestamp` INTEGER, `has_actions` INTEGER NOT NULL, `has_fields` INTEGER NOT NULL, `button_alignment` TEXT, PRIMARY KEY(`_id`), FOREIGN KEY(`message_id`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "_id", + "columnName": "_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "message_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "text", + "columnName": "text", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "authorName", + "columnName": "author_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "authorIcon", + "columnName": "author_icon", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "authorLink", + "columnName": "author_link", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "thumbUrl", + "columnName": "thumb_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "fallback", + "columnName": "fallback", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "titleLink", + "columnName": "title_link", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "titleLinkDownload", + "columnName": "title_link_download", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "imageUrl", + "columnName": "image_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "imageType", + "columnName": "image_type", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "imageSize", + "columnName": "image_size", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "videoUrl", + "columnName": "video_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "videoType", + "columnName": "video_type", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "videoSize", + "columnName": "video_size", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "audioUrl", + "columnName": "audio_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "audioType", + "columnName": "audio_type", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "audioSize", + "columnName": "audio_size", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "messageLink", + "columnName": "message_link", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "timestamp", + "columnName": "timestamp", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "hasActions", + "columnName": "has_actions", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hasFields", + "columnName": "has_fields", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "buttonAlignment", + "columnName": "button_alignment", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [ + { + "table": "messages", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "message_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "attachment_fields", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `title` TEXT NOT NULL, `value` TEXT NOT NULL, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "attachmentId", + "columnName": "attachmentId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_attachment_fields_attachmentId", + "unique": false, + "columnNames": [ + "attachmentId" + ], + "createSql": "CREATE INDEX `index_attachment_fields_attachmentId` ON `${TABLE_NAME}` (`attachmentId`)" + } + ], + "foreignKeys": [ + { + "table": "attachments", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "attachmentId" + ], + "referencedColumns": [ + "_id" + ] + } + ] + }, + { + "tableName": "attachment_action", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `type` TEXT NOT NULL, `text` TEXT, `url` TEXT, `isWebView` INTEGER, `webViewHeightRatio` TEXT, `imageUrl` TEXT, `message` TEXT, `isMessageInChatWindow` INTEGER, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "attachmentId", + "columnName": "attachmentId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "text", + "columnName": "text", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isWebView", + "columnName": "isWebView", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "webViewHeightRatio", + "columnName": "webViewHeightRatio", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "imageUrl", + "columnName": "imageUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "message", + "columnName": "message", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isMessageInChatWindow", + "columnName": "isMessageInChatWindow", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_attachment_action_attachmentId", + "unique": false, + "columnNames": [ + "attachmentId" + ], + "createSql": "CREATE INDEX `index_attachment_action_attachmentId` ON `${TABLE_NAME}` (`attachmentId`)" + } + ], + "foreignKeys": [ + { + "table": "attachments", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "attachmentId" + ], + "referencedColumns": [ + "_id" + ] + } + ] + }, + { + "tableName": "urls", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`urlId` INTEGER PRIMARY KEY AUTOINCREMENT, `messageId` TEXT NOT NULL, `url` TEXT NOT NULL, `hostname` TEXT, `title` TEXT, `description` TEXT, `imageUrl` TEXT, FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "urlId", + "columnName": "urlId", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "messageId", + "columnName": "messageId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hostname", + "columnName": "hostname", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "imageUrl", + "columnName": "imageUrl", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "urlId" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_urls_messageId", + "unique": false, + "columnNames": [ + "messageId" + ], + "createSql": "CREATE INDEX `index_urls_messageId` ON `${TABLE_NAME}` (`messageId`)" + } + ], + "foreignKeys": [ + { + "table": "messages", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "messageId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "reactions", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `messageId` TEXT NOT NULL, `count` INTEGER NOT NULL, `usernames` TEXT NOT NULL, PRIMARY KEY(`reaction`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "reaction", + "columnName": "reaction", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "messageId", + "columnName": "messageId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "count", + "columnName": "count", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "usernames", + "columnName": "usernames", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "reaction" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_reactions_messageId", + "unique": false, + "columnNames": [ + "messageId" + ], + "createSql": "CREATE INDEX `index_reactions_messageId` ON `${TABLE_NAME}` (`messageId`)" + } + ], + "foreignKeys": [ + { + "table": "messages", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "messageId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "messages_sync", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`roomId` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, PRIMARY KEY(`roomId`))", + "fields": [ + { + "fieldPath": "roomId", + "columnName": "roomId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timestamp", + "columnName": "timestamp", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "roomId" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"fb9f1c815809b0217d326452aeb34e92\")" + ] + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a0f96bc45f..1299772a9f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,6 +78,11 @@ android:theme="@style/AppTheme" android:windowSoftInputMode="adjustResize|stateAlwaysHidden" /> + + + + override fun onCreate(savedInstanceState: Bundle?) { + AndroidInjection.inject(this) + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_chat_details) + setupToolbar() + + val chatRoomId = intent.getStringExtra(INTENT_CHAT_ROOM_ID) + requireNotNull(chatRoomId) { "no chat_room_id provided in Intent extras" } + + val chatRoomType = intent.getStringExtra(INTENT_CHAT_ROOM_TYPE) + requireNotNull(chatRoomType) { "no chat_room_type provided in Intent extras" } + + val isSubscribed = intent.getBooleanExtra(INTENT_CHAT_IS_SUBSCRIBED, true) + val disableMenu = intent.getBooleanExtra(INTENT_CHAT_DISABLED_MENU, false) + + if (supportFragmentManager.findFragmentByTag(TAG_CHAT_DETAILS_FRAGMENT) == null) { + addFragment(TAG_CHAT_DETAILS_FRAGMENT, R.id.fragment_container) { + newInstance(chatRoomId, chatRoomType, isSubscribed, disableMenu) + } + } + } + + override fun supportFragmentInjector(): AndroidInjector = + fragmentDispatchingAndroidInjector + + override fun onBackPressed() { + super.onBackPressed() + overridePendingTransition(R.anim.close_enter, R.anim.close_exit) + } + + fun setNavigationIcon(resource: Int) { + toolbar.setNavigationIcon(resource) + } + + fun setToolbarTitle(title: String) { + toolbar_title.text = title + } + + private fun setupToolbar() { + setSupportActionBar(toolbar) + supportActionBar?.setDisplayShowTitleEnabled(false) + setToolbarTitle(getString(R.string.title_channel_details)) + setNavigationIcon(R.drawable.ic_close_white_24dp) + toolbar.setNavigationOnClickListener { onBackPressed() } + } +} \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/chatdetails/ui/ChatDetailsAdapter.kt b/app/src/main/java/chat/rocket/android/chatdetails/ui/ChatDetailsAdapter.kt new file mode 100644 index 0000000000..d9b141b478 --- /dev/null +++ b/app/src/main/java/chat/rocket/android/chatdetails/ui/ChatDetailsAdapter.kt @@ -0,0 +1,49 @@ +package chat.rocket.android.chatdetails.ui + +import android.content.Context +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import chat.rocket.android.R +import chat.rocket.android.util.extensions.inflate +import kotlinx.android.synthetic.main.item_detail_option.view.* + +class ChatDetailsAdapter(private val context: Context): RecyclerView.Adapter() { + private val options: MutableList