diff --git a/app/src/main/java/chat/rocket/android/chatdetails/adapter/OptionViewHolder.kt b/app/src/main/java/chat/rocket/android/chatdetails/adapter/OptionViewHolder.kt index a9cec0d045..dd9a087fb9 100644 --- a/app/src/main/java/chat/rocket/android/chatdetails/adapter/OptionViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatdetails/adapter/OptionViewHolder.kt @@ -4,16 +4,22 @@ import DrawableHelper import android.view.View import android.widget.ImageView import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView import chat.rocket.android.R import chat.rocket.android.chatdetails.domain.Option -import chat.rocket.android.chatrooms.adapter.ViewHolder import kotlinx.android.synthetic.main.item_detail_option.view.* class OptionViewHolder( itemView: View -): ViewHolder(itemView) { +): RecyclerView.ViewHolder(itemView) { + var data: OptionItemHolder? = null - override fun bindViews(data: OptionItemHolder) { + fun bind(data: OptionItemHolder) { + this.data = data + this.bindViews(data) + } + + fun bindViews(data: OptionItemHolder) { val option = data.data bindName(option, itemView.name) bindIcon(option, itemView.icon) diff --git a/app/src/main/java/chat/rocket/android/chatrooms/adapter/HeaderViewHolder.kt b/app/src/main/java/chat/rocket/android/chatrooms/adapter/HeaderViewHolder.kt index c541e4e941..efbd7f5963 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/adapter/HeaderViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/adapter/HeaderViewHolder.kt @@ -3,7 +3,7 @@ package chat.rocket.android.chatrooms.adapter import android.view.View import kotlinx.android.synthetic.main.item_chatroom_header.view.* -class HeaderViewHolder(itemView: View) : ViewHolder(itemView) { +class HeaderViewHolder(itemView: View, listener: ActionsListener) : ViewHolder(itemView, listener) { override fun bindViews(data: HeaderItemHolder) { with(itemView) { text_chatroom_header.text = data.data diff --git a/app/src/main/java/chat/rocket/android/chatrooms/adapter/LoadingViewHolder.kt b/app/src/main/java/chat/rocket/android/chatrooms/adapter/LoadingViewHolder.kt index a4f61f9880..36cf2d15f2 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/adapter/LoadingViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/adapter/LoadingViewHolder.kt @@ -2,7 +2,7 @@ package chat.rocket.android.chatrooms.adapter import android.view.View -class LoadingViewHolder(itemView: View) : ViewHolder>(itemView) { +class LoadingViewHolder(itemView: View, listener: ActionsListener) : ViewHolder>(itemView, listener) { override fun bindViews(data: ItemHolder) { } } \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomViewHolder.kt b/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomViewHolder.kt index 2317178adf..dd470737bc 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomViewHolder.kt @@ -14,8 +14,9 @@ import chat.rocket.common.model.UserStatus import kotlinx.android.synthetic.main.item_chat.view.* import kotlinx.android.synthetic.main.unread_messages_badge.view.* -class RoomViewHolder(itemView: View, private val listener: (RoomUiModel) -> Unit) : - ViewHolder(itemView) { +class RoomViewHolder(itemView: View, private val listener: (RoomUiModel) -> Unit, actionsListener: ActionsListener) : + ViewHolder(itemView, actionsListener) { + private val resources: Resources = itemView.resources private val channelIcon: Drawable = resources.getDrawable(R.drawable.ic_hashtag_12dp, null) private val groupIcon: Drawable = resources.getDrawable(R.drawable.ic_lock_12_dp, null) @@ -24,6 +25,12 @@ class RoomViewHolder(itemView: View, private val listener: (RoomUiModel) -> Unit private val busyIcon: Drawable = resources.getDrawable(R.drawable.ic_status_busy_12dp, null) private val offlineIcon: Drawable = resources.getDrawable(R.drawable.ic_status_invisible_12dp, null) + init { + with(itemView) { + setupActionMenu(itemView) + } + } + override fun bindViews(data: RoomItemHolder) { val room = data.data with(itemView) { diff --git a/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomsAdapter.kt b/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomsAdapter.kt index 03d2bce87e..c52068328b 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomsAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomsAdapter.kt @@ -1,15 +1,18 @@ package chat.rocket.android.chatrooms.adapter +import android.view.MenuItem import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import chat.rocket.android.R import chat.rocket.android.chatrooms.adapter.model.RoomUiModel +import chat.rocket.android.chatrooms.presentation.ChatRoomsPresenter import chat.rocket.android.util.extensions.inflate -class RoomsAdapter(private val listener: (RoomUiModel) -> Unit) : +class RoomsAdapter(private val listener: (RoomUiModel) -> Unit, presenter: ChatRoomsPresenter) : RecyclerView.Adapter>() { + private val enableActions: Boolean = true - init { + init { setHasStableIds(true) } @@ -22,15 +25,15 @@ class RoomsAdapter(private val listener: (RoomUiModel) -> Unit) : override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder<*> = when (viewType) { VIEW_TYPE_ROOM -> { val view = parent.inflate(R.layout.item_chat) - RoomViewHolder(view, listener) + RoomViewHolder(view, listener, actionsListener) } VIEW_TYPE_HEADER -> { val view = parent.inflate(R.layout.item_chatroom_header) - HeaderViewHolder(view) + HeaderViewHolder(view, actionsListener) } VIEW_TYPE_LOADING -> { val view = parent.inflate(R.layout.item_loading) - LoadingViewHolder(view) + LoadingViewHolder(view, actionsListener) } else -> throw IllegalStateException("View type must be either Room, Header or Loading") } @@ -67,4 +70,27 @@ class RoomsAdapter(private val listener: (RoomUiModel) -> Unit) : const val VIEW_TYPE_HEADER = 2 const val VIEW_TYPE_LOADING = 3 } + + private val actionsListener = object : ViewHolder.ActionsListener { + override fun isActionsEnabled(): Boolean = enableActions + override fun onActionSelected(item: MenuItem, room: RoomUiModel) { + room.apply { + when (item.itemId) { + R.id.action_favorite_room-> { + presenter.toggleFavoriteChatRoom(this.id, this.favorite==true) + } + R.id.action_leave_room-> { + presenter.leaveChatRoom(this.id, this.type) + } + R.id.action_read->{ + presenter.toggleMarkRead(this.id, this.unread) + } + R.id.action_hide_room->{ + presenter.hideRoom(this.id, this.type) + } + else -> TODO("Not implemented") + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/chatrooms/adapter/ViewHolder.kt b/app/src/main/java/chat/rocket/android/chatrooms/adapter/ViewHolder.kt index c2004d3f3f..e21410a3f2 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/adapter/ViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/adapter/ViewHolder.kt @@ -1,17 +1,73 @@ package chat.rocket.android.chatrooms.adapter +import android.view.ContextThemeWrapper +import android.view.MenuItem import android.view.View +import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView +import chat.rocket.android.R +import chat.rocket.android.chatroom.ui.bottomsheet.ChatRoomActionBottomSheet +import chat.rocket.android.chatrooms.adapter.model.RoomUiModel +import chat.rocket.android.util.extensions.inflate +import chat.rocket.android.util.extensions.toList abstract class ViewHolder>( - itemView: View -) : RecyclerView.ViewHolder(itemView) { + itemView: View, + private val listener: ActionsListener +) : RecyclerView.ViewHolder(itemView), + MenuItem.OnMenuItemClickListener { var data: T? = null + init { + setupActionMenu(itemView) + } + fun bind(data: T) { this.data = data bindViews(data) } abstract fun bindViews(data: T) + + interface ActionsListener { + fun isActionsEnabled(): Boolean + fun onActionSelected(item: MenuItem, room: RoomUiModel) + } + + internal fun setupActionMenu(view: View) { + view.setOnLongClickListener{ + if (data?.data is RoomUiModel) { + data?.let { vm -> + vm.data.let { + val menuItems = view.context.inflate(R.menu.chatrooms_action).toList() + menuItems.find { it.itemId == R.id.action_favorite_room }?.apply { + setTitle(if ((it as RoomUiModel).favorite == true) R.string.action_unfavorite else R.string.action_favorite) + setIcon(if (it.favorite == true) R.drawable.ic_star_24dp else R.drawable.ic_star_border_24dp) + isChecked = (it.favorite==true) + } + menuItems.find { it.itemId == R.id.action_read }?.apply { + setTitle(if ((it as RoomUiModel).unread.isNullOrEmpty()) R.string.action_mark_unread else R.string.action_mark_read) + } + view.context?.let { + if (it is ContextThemeWrapper && it is AppCompatActivity) { + with(it) { + val actionsBottomSheet = ChatRoomActionBottomSheet() + actionsBottomSheet.addItems(menuItems, this@ViewHolder) + actionsBottomSheet.show(supportFragmentManager, null) + } + } + } + } + } + } + true + } + } + + override fun onMenuItemClick(item: MenuItem): Boolean { + data?.let { + listener.onActionSelected(item, (it as RoomItemHolder).data) + } + return true + } } \ No newline at end of file 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 4f1ee432d2..a259abca5d 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 @@ -20,9 +20,9 @@ import chat.rocket.common.RocketChatException import chat.rocket.common.model.RoomType import chat.rocket.common.model.User import chat.rocket.common.model.roomTypeOf +import chat.rocket.common.util.ifNull import chat.rocket.core.internal.realtime.createDirectMessage -import chat.rocket.core.internal.rest.me -import chat.rocket.core.internal.rest.show +import chat.rocket.core.internal.rest.* import kotlinx.coroutines.withTimeout import timber.log.Timber import javax.inject.Inject @@ -30,6 +30,7 @@ import javax.inject.Named import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine + class ChatRoomsPresenter @Inject constructor( private val view: ChatRoomsView, private val strategy: CancelStrategy, @@ -144,6 +145,85 @@ class ChatRoomsPresenter @Inject constructor( } } + fun toggleFavoriteChatRoom(roomId: String, isFavorite: Boolean) { + launchUI(strategy) { + try { + // Note that if it is favorite then the user wants to unfavorite - and vice versa. + retryIO("favorite($roomId, $isFavorite)") { + client.favorite(roomId, !isFavorite) + val rooms = retryIO("fetch chatRooms", times = 10, + initialDelay = 200, maxDelay = 2000) { + client.chatRooms().update + } + Timber.d("Refreshing rooms: $rooms") + dbManager.processRooms(rooms) + } + } catch (e: RocketChatException) { + Timber.e(e, "Error while trying to favorite/unfavorite chat room.") + e.message?.let { + view.showMessage(it) + }.ifNull { + view.showGenericErrorMessage() + } + } + } + } + + fun toggleMarkRead(roomId: String, unread: String?) { + launchUI(strategy) { + try { + if(unread.isNullOrEmpty()) { + retryIO(description = "markAsUnread($roomId)") { client.markAsUnread(roomId) } + val rooms = retryIO("fetch chatRooms", times = 10, + initialDelay = 200, maxDelay = 2000) { + client.chatRooms().update + } + Timber.d("Refreshing rooms: $rooms") + dbManager.processRooms(rooms) + } + else + retryIO(description = "markAsRead($roomId)") { client.markAsRead(roomId) } + } catch (ex: RocketChatException) { + view.showMessage(ex.message!!) // TODO Remove. + Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber. + } + } + } + + fun leaveChatRoom(roomId: String, roomType: RoomType) { + launchUI(strategy) { + try { + retryIO(description = "leaveChat($roomId, $roomType)") { client.leaveChat(roomId, roomType) } + val rooms = retryIO("fetch chatRooms", times = 10, + initialDelay = 200, maxDelay = 2000) { + client.chatRooms().update + } + Timber.d("Refreshing rooms: $rooms") + dbManager.processRooms(rooms) + } catch (ex: RocketChatException) { + view.showMessage(ex.message!!) // TODO Remove. + Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber. + } + } + } + + fun hideRoom(roomId: String, roomType: RoomType) { + launchUI(strategy) { + try { + retryIO(description = "hide($roomId, $roomType, ${true})") { client.hide(roomId, roomType, hideRoom = true) } + val rooms = retryIO("fetch chatRooms", times = 10, + initialDelay = 200, maxDelay = 2000) { + client.chatRooms().update + } + Timber.d("Refreshing rooms: $rooms") + dbManager.processRooms(rooms) + } catch (ex: RocketChatException) { + view.showMessage(ex.message!!) // TODO Remove. + Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber. + } + } + } + private suspend fun getCurrentUser(): User? { userHelper.user()?.let { return it diff --git a/app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt b/app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt index 58f3355722..e5b5f9e7eb 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt @@ -60,6 +60,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { lateinit var analyticsManager: AnalyticsManager private lateinit var viewModel: ChatRoomsViewModel + private lateinit var adapter: RoomsAdapter private var searchView: SearchView? = null private var sortView: MenuItem? = null @@ -110,11 +111,12 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { analyticsManager.logScreenView(ScreenViewEvent.ChatRooms) } + private fun subscribeUi() { ui { - val adapter = RoomsAdapter { room -> + adapter = RoomsAdapter ({ room -> presenter.loadChatRoom(room) - } + },presenter) recycler_view.layoutManager = LinearLayoutManager(it) recycler_view.addItemDecoration( diff --git a/app/src/main/java/chat/rocket/android/chatrooms/ui/bottomsheet/ChatRoomActionBottomSheet.kt b/app/src/main/java/chat/rocket/android/chatrooms/ui/bottomsheet/ChatRoomActionBottomSheet.kt new file mode 100644 index 0000000000..088940b3a9 --- /dev/null +++ b/app/src/main/java/chat/rocket/android/chatrooms/ui/bottomsheet/ChatRoomActionBottomSheet.kt @@ -0,0 +1,76 @@ +package chat.rocket.android.chatroom.ui.bottomsheet + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import chat.rocket.android.R +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import kotlinx.android.synthetic.main.message_action_item.view.* +import kotlinx.android.synthetic.main.message_bottomsheet.* + +class ChatRoomActionBottomSheet : BottomSheetDialogFragment() { + + private var adapter = ChatRoomActionAdapter() + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + return inflater.inflate(R.layout.message_bottomsheet, container, false) + } + + fun addItems(items: List, itemClickListener: MenuItem.OnMenuItemClickListener) { + adapter.addItems(items, ActionItemClickListener(dismissAction = { dismiss() }, + itemClickListener = itemClickListener)) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + bottomsheet_recycler_view.layoutManager = LinearLayoutManager(context) + bottomsheet_recycler_view.adapter = adapter + } + + private class ActionItemClickListener( + val dismissAction: () -> Unit, + val itemClickListener: MenuItem.OnMenuItemClickListener + ) + + private class ChatRoomActionAdapter : RecyclerView.Adapter() { + + private lateinit var itemClickListener: ActionItemClickListener + private val menuItems = mutableListOf() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatRoomActionViewHolder { + return ChatRoomActionViewHolder( + LayoutInflater.from(parent.context).inflate(R.layout.message_action_item, parent, false) + ) + } + + override fun getItemCount() = menuItems.size + + override fun onBindViewHolder(holder: ChatRoomActionViewHolder, position: Int) { + holder.bind(menuItems[position], itemClickListener) + } + + fun addItems(items: List, itemClickListener: ActionItemClickListener) { + this.itemClickListener = itemClickListener + menuItems.clear() + menuItems.addAll(items) + notifyDataSetChanged() + } + } + + private class ChatRoomActionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + + fun bind(item: MenuItem, itemClickListener: ActionItemClickListener) { + with(itemView) { + message_action_title.text = item.title + message_action_icon.setImageDrawable(item.icon) + setOnClickListener { + itemClickListener.itemClickListener.onMenuItemClick(item) + itemClickListener.dismissAction.invoke() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_flag_24dp.xml b/app/src/main/res/drawable/ic_flag_24dp.xml new file mode 100644 index 0000000000..03cbf7d286 --- /dev/null +++ b/app/src/main/res/drawable/ic_flag_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_leave_room_24dp.xml b/app/src/main/res/drawable/ic_leave_room_24dp.xml new file mode 100644 index 0000000000..3fc9f003b6 --- /dev/null +++ b/app/src/main/res/drawable/ic_leave_room_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_star_24dp.xml b/app/src/main/res/drawable/ic_star_24dp.xml new file mode 100644 index 0000000000..b85c696c2a --- /dev/null +++ b/app/src/main/res/drawable/ic_star_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_star_border_24dp.xml b/app/src/main/res/drawable/ic_star_border_24dp.xml new file mode 100644 index 0000000000..8704105e1e --- /dev/null +++ b/app/src/main/res/drawable/ic_star_border_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_visibility_off_24dp.xml b/app/src/main/res/drawable/ic_visibility_off_24dp.xml new file mode 100644 index 0000000000..da65c447e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_off_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/item_chat.xml b/app/src/main/res/layout/item_chat.xml index febbd65fe6..862efb8085 100644 --- a/app/src/main/res/layout/item_chat.xml +++ b/app/src/main/res/layout/item_chat.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" + android:id="@+id/item_container" android:layout_height="wrap_content" android:background="?android:attr/selectableItemBackground" android:paddingStart="@dimen/screen_edge_left_and_right_padding" diff --git a/app/src/main/res/menu/chatrooms_action.xml b/app/src/main/res/menu/chatrooms_action.xml new file mode 100644 index 0000000000..d8dfe95707 --- /dev/null +++ b/app/src/main/res/menu/chatrooms_action.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + \ 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 3dfbad4ae3..8025b1e1ea 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -44,6 +44,11 @@ Erstelle Abmelden Eine Datei anhängen + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite Bestätige Passwort Änderung Trete Chat bei Erstelle Account diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 54af22f1e8..4ffd72009e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -40,6 +40,11 @@ Crear canal Create Cerrar sesión + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite Attach a file Confirmar cambio de contraseña Unirse al chat diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 29026d081b..3b8c813a39 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -35,6 +35,11 @@ شرایط خدمات رسانی سیاست حفظ جریم خصوصی جست‌وجو + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite به روزرسانی تنظیمات ایجاد کانال diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4d69d7b63f..2d12473cb2 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -25,6 +25,11 @@ les permis Êtes-vous sûr? Détails de la chaîne + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite Sujet Annonce La description diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index 00e260222e..2e4cee426a 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -39,6 +39,11 @@ सेटिंग्स चैनल बनाएं बनाएं + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite लोग आउट करें एक फ़ाइल जोडो पासवर्ड परिवर्तन की पुष्टि करें diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d0c7219017..41e50ac46c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -39,6 +39,11 @@ Parametri Crea canale Crea + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite Disconnettersi Ceangail comhad Conferma Cambio Password diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 97b67eb741..3fb6b94dfa 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -40,6 +40,11 @@ チャンネル作成 作ります ログアウト + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite Attach a file 変更したパスワードの確認 チャットに参加 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index aab1531b47..91228026da 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -23,6 +23,11 @@ Sobre Criar chat Licença + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite Você tem certeza? Detalhes do canal Tópico diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index ba90c51586..b33c6599ab 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -39,6 +39,11 @@ Настройки Создать канал Создать + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite Выйти Прикрепить файл Подтверждение изменения пароля diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 69719c7923..3086a5ec75 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -40,6 +40,11 @@ Yeni Kanal Oluştur Oluştur Çıkış Yap + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite Attach a file Şifre Değişikliğini Onaylayın Sohbete Bağlan diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b63e0f60f3..e7d688b891 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -40,6 +40,11 @@ Створити канал Створити Вийти + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite Attach a file Підтвердження зміни пароля Приєднатися до чату diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4bacccc750..1075792a6c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -35,6 +35,11 @@ 服务条款 隐私政策 搜索 + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite 更新 设置 新建频道 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a2d2384b68..910a2126f3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -47,6 +47,11 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Terms of Service Privacy Policy Search + Mark As Unread + Mark As Read + Hide Room + Leave Room + Unfavorite Update Settings Create channel