Unverified Commit b1ee6ac6 authored by Filipe de Lima Brito's avatar Filipe de Lima Brito Committed by GitHub

Merge branch 'develop' into rocket.nbamir

parents e3c41a6c 8d05af4a
package chat.rocket.android.about.di
import chat.rocket.android.about.ui.AboutFragment
import dagger.Module
import dagger.android.ContributesAndroidInjector
@Module
abstract class AboutFragmentProvider {
@ContributesAndroidInjector()
abstract fun provideAboutFragment(): AboutFragment
}
package chat.rocket.android.about.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import chat.rocket.android.BuildConfig
import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.main.ui.MainActivity
import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.app_bar.*
import kotlinx.android.synthetic.main.fragment_about.*
import javax.inject.Inject
internal const val TAG_ABOUT_FRAGMENT = "AboutFragment"
class AboutFragment : Fragment() {
@Inject
lateinit var analyticsManager: AnalyticsManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AndroidSupportInjection.inject(this)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_about, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupViews()
analyticsManager.logScreenView(ScreenViewEvent.About)
}
override fun onResume() {
super.onResume()
setupToolbar()
}
private fun setupViews() {
text_version_name.text = BuildConfig.VERSION_NAME
text_build_number.text = getString(
R.string.msg_build, BuildConfig.VERSION_CODE,
BuildConfig.GIT_SHA, BuildConfig.FLAVOR
)
}
private fun setupToolbar() {
with((activity as MainActivity).toolbar) {
title = getString(R.string.title_about)
setNavigationIcon(R.drawable.ic_arrow_back_white_24dp)
setNavigationOnClickListener { activity?.onBackPressed() }
}
}
companion object {
fun newInstance() = AboutFragment()
}
}
...@@ -10,7 +10,7 @@ interface Analytics { ...@@ -10,7 +10,7 @@ interface Analytics {
* Logs the login event. * Logs the login event.
* *
* @param event The [AuthenticationEvent] used to log in. * @param event The [AuthenticationEvent] used to log in.
* @param loginSucceeded True if successful logged in, false otherwise. * @param loginSucceeded True if logged in successfully, false otherwise.
*/ */
fun logLogin(event: AuthenticationEvent, loginSucceeded: Boolean) {} fun logLogin(event: AuthenticationEvent, loginSucceeded: Boolean) {}
...@@ -18,7 +18,7 @@ interface Analytics { ...@@ -18,7 +18,7 @@ interface Analytics {
* Logs the sign up event. * Logs the sign up event.
* *
* @param event The [AuthenticationEvent] used to sign up. * @param event The [AuthenticationEvent] used to sign up.
* @param signUpSucceeded True if successful signed up, false otherwise. * @param signUpSucceeded True if signed up successfully, false otherwise.
*/ */
fun logSignUp(event: AuthenticationEvent, signUpSucceeded: Boolean) {} fun logSignUp(event: AuthenticationEvent, signUpSucceeded: Boolean) {}
......
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.widget.TextView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
import android.widget.TextView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.common.model.UserStatus import chat.rocket.common.model.UserStatus
...@@ -78,7 +78,7 @@ object DrawableHelper { ...@@ -78,7 +78,7 @@ object DrawableHelper {
* *
* @param textView The array of TextView. * @param textView The array of TextView.
* @param drawables The array of Drawable. * @param drawables The array of Drawable.
* @see compoundDrawable * @see compoundLeftDrawable
*/ */
fun compoundDrawables(textView: Array<TextView>, drawables: Array<Drawable>) { fun compoundDrawables(textView: Array<TextView>, drawables: Array<Drawable>) {
if (textView.size != drawables.size) { if (textView.size != drawables.size) {
...@@ -97,7 +97,7 @@ object DrawableHelper { ...@@ -97,7 +97,7 @@ object DrawableHelper {
* @param drawable The Drawable. * @param drawable The Drawable.
* @see compoundDrawables * @see compoundDrawables
*/ */
fun compoundDrawable(textView: TextView, drawable: Drawable) = fun compoundLeftDrawable(textView: TextView, drawable: Drawable) =
textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null) textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)
/** /**
...@@ -105,11 +105,26 @@ object DrawableHelper { ...@@ -105,11 +105,26 @@ object DrawableHelper {
* *
* @param textView The TextView. * @param textView The TextView.
* @param drawable The Drawable. * @param drawable The Drawable.
* @see compoundDrawable * @see compoundLeftDrawable
*/ */
fun compoundRightDrawable(textView: TextView, drawable: Drawable) = fun compoundRightDrawable(textView: TextView, drawable: Drawable) =
textView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null) textView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null)
/**
* Compounds a Drawable (to appear on the left and right side of a text) into a TextView.
*
* @param textView The TextView.
* @param leftDrawable The left Drawable.
* @param rightDrawable The right Drawable.
* @see compoundLeftDrawable
*/
fun compoundLeftAndRightDrawable(
textView: TextView,
leftDrawable: Drawable,
rightDrawable: Drawable
) =
textView.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, rightDrawable, null)
/** /**
* Returns the user status drawable. * Returns the user status drawable.
* *
......
...@@ -115,7 +115,7 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje ...@@ -115,7 +115,7 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
// TODO - remove this // TODO - remove this
checkCurrentServer() checkCurrentServer()
// TODO - FIXME - we need to proper inject the EmojiRepository and initialize it properly // TODO - FIXME - we need to properly inject and initialize the EmojiRepository
loadEmojis() loadEmojis()
} }
...@@ -176,7 +176,7 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje ...@@ -176,7 +176,7 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
val currentServer = getCurrentServerInteractor.get() val currentServer = getCurrentServerInteractor.get()
currentServer?.let { server -> currentServer?.let { server ->
GlobalScope.launch { GlobalScope.launch {
val client = factory.create(server) val client = factory.get(server)
EmojiRepository.setCurrentServerUrl(server) EmojiRepository.setCurrentServerUrl(server)
val customEmojiList = mutableListOf<Emoji>() val customEmojiList = mutableListOf<Emoji>()
try { try {
......
...@@ -60,7 +60,7 @@ class LoginPresenter @Inject constructor( ...@@ -60,7 +60,7 @@ class LoginPresenter @Inject constructor(
private fun setupConnectionInfo(serverUrl: String) { private fun setupConnectionInfo(serverUrl: String) {
currentServer = serverUrl currentServer = serverUrl
client = factory.create(currentServer) client = factory.get(currentServer)
settings = settingsInteractor.get(currentServer) settings = settingsInteractor.get(currentServer)
} }
......
...@@ -169,7 +169,7 @@ class LoginOptionsPresenter @Inject constructor( ...@@ -169,7 +169,7 @@ class LoginOptionsPresenter @Inject constructor(
private fun setupConnectionInfo(serverUrl: String) { private fun setupConnectionInfo(serverUrl: String) {
currentServer = serverUrl currentServer = serverUrl
client = factory.create(currentServer) client = factory.get(currentServer)
settings = settingsInteractor.get(currentServer) settings = settingsInteractor.get(currentServer)
} }
......
...@@ -38,7 +38,7 @@ class RegisterUsernamePresenter @Inject constructor( ...@@ -38,7 +38,7 @@ class RegisterUsernamePresenter @Inject constructor(
val settingsInteractor: GetSettingsInteractor val settingsInteractor: GetSettingsInteractor
) { ) {
private val currentServer = serverInteractor.get()!! private val currentServer = serverInteractor.get()!!
private val client: RocketChatClient = factory.create(currentServer) private val client: RocketChatClient = factory.get(currentServer)
private var settings: PublicSettings = settingsInteractor.get(serverInteractor.get()!!) private var settings: PublicSettings = settingsInteractor.get(serverInteractor.get()!!)
fun registerUsername(username: String, userId: String, authToken: String) { fun registerUsername(username: String, userId: String, authToken: String) {
......
...@@ -140,7 +140,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView { ...@@ -140,7 +140,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView {
val atDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_at_black_20dp, it) val atDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_at_black_20dp, it)
DrawableHelper.wrapDrawable(atDrawable) DrawableHelper.wrapDrawable(atDrawable)
DrawableHelper.tintDrawable(atDrawable, it, R.color.colorDrawableTintGrey) DrawableHelper.tintDrawable(atDrawable, it, R.color.colorDrawableTintGrey)
DrawableHelper.compoundDrawable(text_username, atDrawable) DrawableHelper.compoundLeftDrawable(text_username, atDrawable)
} }
} }
......
...@@ -21,7 +21,7 @@ class ResetPasswordPresenter @Inject constructor( ...@@ -21,7 +21,7 @@ class ResetPasswordPresenter @Inject constructor(
serverInteractor: GetConnectingServerInteractor serverInteractor: GetConnectingServerInteractor
) { ) {
private val currentServer = serverInteractor.get()!! private val currentServer = serverInteractor.get()!!
private val client: RocketChatClient = factory.create(currentServer) private val client: RocketChatClient = factory.get(currentServer)
fun resetPassword(email: String) { fun resetPassword(email: String) {
launchUI(strategy) { launchUI(strategy) {
......
...@@ -21,7 +21,7 @@ interface ResetPasswordView : LoadingView, MessageView { ...@@ -21,7 +21,7 @@ interface ResetPasswordView : LoadingView, MessageView {
fun enableButtonConnect() fun enableButtonConnect()
/** /**
* Disables the button to reset the password when the user entered an invalid email address * Disables the button to reset the password when the user has entered an invalid email address
*/ */
fun disableButtonConnect() fun disableButtonConnect()
} }
\ No newline at end of file
...@@ -26,7 +26,7 @@ interface VersionCheckView { ...@@ -26,7 +26,7 @@ interface VersionCheckView {
fun versionOk() {} fun versionOk() {}
/** /**
* Alters the user this protocol is invalid. This is optional. * Alters the user that this protocol is invalid. This is optional.
*/ */
fun errorInvalidProtocol() {} fun errorInvalidProtocol() {}
......
...@@ -44,7 +44,7 @@ class SignupPresenter @Inject constructor( ...@@ -44,7 +44,7 @@ class SignupPresenter @Inject constructor(
private var settings: PublicSettings = settingsInteractor.get(serverInteractor.get()!!) private var settings: PublicSettings = settingsInteractor.get(serverInteractor.get()!!)
fun signup(name: String, username: String, password: String, email: String) { fun signup(name: String, username: String, password: String, email: String) {
val client = factory.create(currentServer) val client = factory.get(currentServer)
launchUI(strategy) { launchUI(strategy) {
view.showLoading() view.showLoading()
try { try {
......
...@@ -51,7 +51,7 @@ class TwoFAPresenter @Inject constructor( ...@@ -51,7 +51,7 @@ class TwoFAPresenter @Inject constructor(
twoFactorAuthenticationCode: String twoFactorAuthenticationCode: String
) { ) {
launchUI(strategy) { launchUI(strategy) {
val client = factory.create(currentServer) val client = factory.get(currentServer)
view.showLoading() view.showLoading()
try { try {
// The token is saved via the client TokenProvider // The token is saved via the client TokenProvider
......
...@@ -200,7 +200,7 @@ class ChatDetailsFragment : Fragment(), ChatDetailsView { ...@@ -200,7 +200,7 @@ class ChatDetailsFragment : Fragment(), ChatDetailsView {
val wrappedDrawable = DrawableHelper.wrapDrawable(it) val wrappedDrawable = DrawableHelper.wrapDrawable(it)
val mutableDrawable = wrappedDrawable.mutate() val mutableDrawable = wrappedDrawable.mutate()
DrawableHelper.tintDrawable(mutableDrawable, context!!, R.color.colorPrimary) DrawableHelper.tintDrawable(mutableDrawable, context!!, R.color.colorPrimary)
DrawableHelper.compoundDrawable(name, mutableDrawable) DrawableHelper.compoundLeftDrawable(name, mutableDrawable)
} }
} }
......
...@@ -44,7 +44,6 @@ class MessageInfoFragment : Fragment(), MessageInfoView { ...@@ -44,7 +44,6 @@ class MessageInfoFragment : Fragment(), MessageInfoView {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
AndroidSupportInjection.inject(this) AndroidSupportInjection.inject(this)
setHasOptionsMenu(true)
val bundle = arguments val bundle = arguments
if (bundle != null) { if (bundle != null) {
...@@ -52,6 +51,8 @@ class MessageInfoFragment : Fragment(), MessageInfoView { ...@@ -52,6 +51,8 @@ class MessageInfoFragment : Fragment(), MessageInfoView {
} else { } else {
requireNotNull(bundle) { "no arguments supplied when the fragment was instantiated" } requireNotNull(bundle) { "no arguments supplied when the fragment was instantiated" }
} }
setHasOptionsMenu(true)
} }
override fun onCreateView( override fun onCreateView(
......
...@@ -268,7 +268,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -268,7 +268,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
AndroidSupportInjection.inject(this) AndroidSupportInjection.inject(this)
setHasOptionsMenu(true)
arguments?.run { arguments?.run {
chatRoomId = getString(BUNDLE_CHAT_ROOM_ID, "") chatRoomId = getString(BUNDLE_CHAT_ROOM_ID, "")
...@@ -292,6 +291,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -292,6 +291,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
navigator = navigator, navigator = navigator,
analyticsManager = analyticsManager analyticsManager = analyticsManager
) )
setHasOptionsMenu(true)
} }
override fun onCreateView( override fun onCreateView(
......
...@@ -10,7 +10,6 @@ import chat.rocket.android.dagger.scope.PerFragment ...@@ -10,7 +10,6 @@ import chat.rocket.android.dagger.scope.PerFragment
import chat.rocket.android.db.ChatRoomDao import chat.rocket.android.db.ChatRoomDao
import chat.rocket.android.db.DatabaseManager import chat.rocket.android.db.DatabaseManager
import chat.rocket.android.db.UserDao import chat.rocket.android.db.UserDao
import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.server.domain.GetCurrentUserInteractor import chat.rocket.android.server.domain.GetCurrentUserInteractor
import chat.rocket.android.server.domain.PermissionsInteractor import chat.rocket.android.server.domain.PermissionsInteractor
import chat.rocket.android.server.domain.PublicSettings import chat.rocket.android.server.domain.PublicSettings
...@@ -45,7 +44,7 @@ class ChatRoomsFragmentModule { ...@@ -45,7 +44,7 @@ class ChatRoomsFragmentModule {
factory: RocketChatClientFactory, factory: RocketChatClientFactory,
@Named("currentServer") currentServer: String @Named("currentServer") currentServer: String
): RocketChatClient { ): RocketChatClient {
return factory.create(currentServer) return factory.get(currentServer)
} }
@Provides @Provides
......
...@@ -10,6 +10,7 @@ import chat.rocket.android.helper.UserHelper ...@@ -10,6 +10,7 @@ import chat.rocket.android.helper.UserHelper
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.main.presentation.MainNavigator import chat.rocket.android.main.presentation.MainNavigator
import chat.rocket.android.server.domain.SettingsRepository import chat.rocket.android.server.domain.SettingsRepository
import chat.rocket.android.server.domain.SortingAndGroupingInteractor
import chat.rocket.android.server.domain.useRealName import chat.rocket.android.server.domain.useRealName
import chat.rocket.android.server.domain.useSpecialCharsOnRoom import chat.rocket.android.server.domain.useSpecialCharsOnRoom
import chat.rocket.android.server.infraestructure.ConnectionManager import chat.rocket.android.server.infraestructure.ConnectionManager
...@@ -35,6 +36,7 @@ class ChatRoomsPresenter @Inject constructor( ...@@ -35,6 +36,7 @@ class ChatRoomsPresenter @Inject constructor(
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val navigator: MainNavigator, private val navigator: MainNavigator,
@Named("currentServer") private val currentServer: String, @Named("currentServer") private val currentServer: String,
private val sortingAndGroupingInteractor: SortingAndGroupingInteractor,
private val dbManager: DatabaseManager, private val dbManager: DatabaseManager,
manager: ConnectionManager, manager: ConnectionManager,
private val localRepository: LocalRepository, private val localRepository: LocalRepository,
...@@ -44,29 +46,42 @@ class ChatRoomsPresenter @Inject constructor( ...@@ -44,29 +46,42 @@ class ChatRoomsPresenter @Inject constructor(
private val client = manager.client private val client = manager.client
private val settings = settingsRepository.get(currentServer) private val settings = settingsRepository.get(currentServer)
fun toCreateChannel() = navigator.toCreateChannel()
fun toSettings() = navigator.toSettings()
fun getCurrentServerName() = view.setupToolbar(currentServer)
fun getSortingAndGroupingPreferences() {
with(sortingAndGroupingInteractor) {
view.setupSortingAndGrouping(
getSortByName(currentServer),
getUnreadOnTop(currentServer),
getGroupByType(currentServer),
getGroupByFavorites(currentServer)
)
}
}
fun loadChatRoom(roomId: String) { fun loadChatRoom(roomId: String) {
launchUI(strategy) { launchUI(strategy) {
view.showLoadingRoom("")
try { try {
val room = dbManager.getRoom(roomId) val room = dbManager.getRoom(roomId)
if (room != null) { if (room != null) {
loadChatRoom(room.chatRoom, true) loadChatRoom(room.chatRoom, true)
} else { } else {
Timber.d("Error loading channel") Timber.e("Error loading channel")
view.showGenericErrorMessage() view.showGenericErrorMessage()
} }
} catch (ex: Exception) { } catch (ex: Exception) {
Timber.d(ex, "Error loading channel") Timber.e(ex, "Error loading channel")
view.showGenericErrorMessage() view.showGenericErrorMessage()
} finally {
view.hideLoadingRoom()
} }
} }
} }
fun loadChatRoom(chatRoom: RoomUiModel) { fun loadChatRoom(chatRoom: RoomUiModel) {
launchUI(strategy) { launchUI(strategy) {
view.showLoadingRoom(chatRoom.name)
try { try {
val room = retryDB("getRoom(${chatRoom.id}") { dbManager.getRoom(chatRoom.id) } val room = retryDB("getRoom(${chatRoom.id}") { dbManager.getRoom(chatRoom.id) }
if (room != null) { if (room != null) {
...@@ -86,10 +101,8 @@ class ChatRoomsPresenter @Inject constructor( ...@@ -86,10 +101,8 @@ class ChatRoomsPresenter @Inject constructor(
} }
} }
} catch (ex: Exception) { } catch (ex: Exception) {
Timber.d(ex, "Error loading channel") Timber.e(ex, "Error loading channel")
view.showGenericErrorMessage() view.showGenericErrorMessage()
} finally {
view.hideLoadingRoom()
} }
} }
} }
...@@ -97,11 +110,12 @@ class ChatRoomsPresenter @Inject constructor( ...@@ -97,11 +110,12 @@ class ChatRoomsPresenter @Inject constructor(
suspend fun loadChatRoom(chatRoom: ChatRoomEntity, local: Boolean = false) { suspend fun loadChatRoom(chatRoom: ChatRoomEntity, local: Boolean = false) {
with(chatRoom) { with(chatRoom) {
val isDirectMessage = roomTypeOf(type) is RoomType.DirectMessage val isDirectMessage = roomTypeOf(type) is RoomType.DirectMessage
val roomName = if (settings.useSpecialCharsOnRoom() || (isDirectMessage && settings.useRealName())) { val roomName =
fullname ?: name if (settings.useSpecialCharsOnRoom() || (isDirectMessage && settings.useRealName())) {
} else { fullname ?: name
name } else {
} name
}
val myself = getCurrentUser() val myself = getCurrentUser()
if (myself?.username == null) { if (myself?.username == null) {
...@@ -131,14 +145,14 @@ class ChatRoomsPresenter @Inject constructor( ...@@ -131,14 +145,14 @@ class ChatRoomsPresenter @Inject constructor(
} }
navigator.toChatRoom( navigator.toChatRoom(
chatRoomId = id, chatRoomId = id,
chatRoomName = roomName, chatRoomName = roomName,
chatRoomType = type, chatRoomType = type,
isReadOnly = readonly ?: false, isReadOnly = readonly ?: false,
chatRoomLastSeen = lastSeen ?: -1, chatRoomLastSeen = lastSeen ?: -1,
isSubscribed = open, isSubscribed = open,
isCreator = ownerId == myself.id || isDirectMessage, isCreator = ownerId == myself.id || isDirectMessage,
isFavorite = favorite ?: false isFavorite = favorite ?: false
) )
} }
} }
......
...@@ -4,7 +4,27 @@ import chat.rocket.android.core.behaviours.LoadingView ...@@ -4,7 +4,27 @@ import chat.rocket.android.core.behaviours.LoadingView
import chat.rocket.android.core.behaviours.MessageView import chat.rocket.android.core.behaviours.MessageView
interface ChatRoomsView : LoadingView, MessageView { interface ChatRoomsView : LoadingView, MessageView {
fun showLoadingRoom(name: CharSequence)
fun hideLoadingRoom() /**
* Setups the toolbar with the current logged in server name.
*
* @param serverName The current logged in server name to show on Toolbar.
*/
fun setupToolbar(serverName: String)
/**
* Setups the sorting and grouping in the bases of the user preference for
* the current logged in server.
*
* @param isSortByName True if sorting by name, false otherwise.
* @param isUnreadOnTop True if grouping by unread on top, false otherwise.
* @param isGroupByType True if grouping by type , false otherwise.
* @param isGroupByFavorites True if grouping by favorites, false otherwise.
*/
fun setupSortingAndGrouping(
isSortByName: Boolean,
isUnreadOnTop: Boolean,
isGroupByType: Boolean,
isGroupByFavorites: Boolean
)
} }
\ No newline at end of file
package chat.rocket.android.chatrooms.ui package chat.rocket.android.chatrooms.ui
import androidx.appcompat.app.AlertDialog
import android.app.ProgressDialog
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.Menu import android.view.Menu
import android.view.MenuInflater import android.view.MenuInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.CheckBox
import android.widget.RadioGroup
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.view.isVisible import androidx.core.view.isVisible
...@@ -30,12 +25,9 @@ import chat.rocket.android.chatrooms.viewmodel.ChatRoomsViewModel ...@@ -30,12 +25,9 @@ import chat.rocket.android.chatrooms.viewmodel.ChatRoomsViewModel
import chat.rocket.android.chatrooms.viewmodel.ChatRoomsViewModelFactory import chat.rocket.android.chatrooms.viewmodel.ChatRoomsViewModelFactory
import chat.rocket.android.chatrooms.viewmodel.LoadingState import chat.rocket.android.chatrooms.viewmodel.LoadingState
import chat.rocket.android.chatrooms.viewmodel.Query import chat.rocket.android.chatrooms.viewmodel.Query
import chat.rocket.android.helper.ChatRoomsSortOrder import chat.rocket.android.servers.ui.ServersBottomSheetFragment
import chat.rocket.android.helper.Constants import chat.rocket.android.sortingandgrouping.ui.SortingAndGroupingBottomSheetFragment
import chat.rocket.android.helper.SharedPreferenceHelper
import chat.rocket.android.util.extension.onQueryTextListener import chat.rocket.android.util.extension.onQueryTextListener
import chat.rocket.android.util.extensions.fadeIn
import chat.rocket.android.util.extensions.fadeOut
import chat.rocket.android.util.extensions.ifNotNullNotEmpty import chat.rocket.android.util.extensions.ifNotNullNotEmpty
import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.extensions.showToast import chat.rocket.android.util.extensions.showToast
...@@ -43,6 +35,7 @@ import chat.rocket.android.util.extensions.ui ...@@ -43,6 +35,7 @@ import chat.rocket.android.util.extensions.ui
import chat.rocket.android.widget.DividerItemDecoration import chat.rocket.android.widget.DividerItemDecoration
import chat.rocket.core.internal.realtime.socket.model.State import chat.rocket.core.internal.realtime.socket.model.State
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.app_bar_chat_rooms.*
import kotlinx.android.synthetic.main.fragment_chat_rooms.* import kotlinx.android.synthetic.main.fragment_chat_rooms.*
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
...@@ -51,46 +44,38 @@ internal const val TAG_CHAT_ROOMS_FRAGMENT = "ChatRoomsFragment" ...@@ -51,46 +44,38 @@ internal const val TAG_CHAT_ROOMS_FRAGMENT = "ChatRoomsFragment"
private const val BUNDLE_CHAT_ROOM_ID = "BUNDLE_CHAT_ROOM_ID" private const val BUNDLE_CHAT_ROOM_ID = "BUNDLE_CHAT_ROOM_ID"
class ChatRoomsFragment : Fragment(), ChatRoomsView {
@Inject
lateinit var presenter: ChatRoomsPresenter
@Inject
lateinit var factory: ChatRoomsViewModelFactory
@Inject
lateinit var analyticsManager: AnalyticsManager
private lateinit var viewModel: ChatRoomsViewModel fun newInstance(chatRoomId: String?): Fragment = ChatRoomsFragment().apply {
arguments = Bundle(1).apply {
putString(BUNDLE_CHAT_ROOM_ID, chatRoomId)
}
}
private var searchView: SearchView? = null class ChatRoomsFragment : Fragment(), ChatRoomsView {
private var sortView: MenuItem? = null @Inject lateinit var presenter: ChatRoomsPresenter
private val handler = Handler() @Inject lateinit var factory: ChatRoomsViewModelFactory
@Inject lateinit var analyticsManager: AnalyticsManager
private lateinit var viewModel: ChatRoomsViewModel
private var chatRoomId: String? = null private var chatRoomId: String? = null
private var progressDialog: ProgressDialog? = null private var isSortByName = false
private var isUnreadOnTop = false
companion object { private var isGroupByType = false
fun newInstance(chatRoomId: String? = null): ChatRoomsFragment = ChatRoomsFragment().apply { private var isGroupByFavorites = false
arguments = Bundle(1).apply {
putString(BUNDLE_CHAT_ROOM_ID, chatRoomId)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
AndroidSupportInjection.inject(this) AndroidSupportInjection.inject(this)
setHasOptionsMenu(true)
arguments?.run { arguments?.run {
chatRoomId = getString(BUNDLE_CHAT_ROOM_ID) chatRoomId = getString(BUNDLE_CHAT_ROOM_ID)
chatRoomId.ifNotNullNotEmpty { roomId ->
presenter.loadChatRoom(roomId) chatRoomId.ifNotNullNotEmpty {
presenter.loadChatRoom(it)
chatRoomId = null chatRoomId = null
} }
} }
}
override fun onDestroy() { setHasOptionsMenu(true)
handler.removeCallbacks(dismissStatus)
super.onDestroy()
} }
override fun onCreateView( override fun onCreateView(
...@@ -102,62 +87,47 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -102,62 +87,47 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
with(presenter) {
getCurrentServerName()
getSortingAndGroupingPreferences()
}
viewModel = ViewModelProviders.of(this, factory).get(ChatRoomsViewModel::class.java) viewModel = ViewModelProviders.of(this, factory).get(ChatRoomsViewModel::class.java)
subscribeUi() subscribeUi()
setupListeners()
setupToolbar()
analyticsManager.logScreenView(ScreenViewEvent.ChatRooms) analyticsManager.logScreenView(ScreenViewEvent.ChatRooms)
} }
private fun subscribeUi() { override fun setupToolbar(serverName: String) {
ui { with((activity as AppCompatActivity)) {
val adapter = RoomsAdapter { room -> with(toolbar) {
presenter.loadChatRoom(room) setSupportActionBar(this)
setNavigationOnClickListener { presenter.toSettings() }
} }
}
text_server_name.text = serverName
}
recycler_view.layoutManager = LinearLayoutManager(it) override fun setupSortingAndGrouping(
recycler_view.addItemDecoration( isSortByName: Boolean,
DividerItemDecoration( isUnreadOnTop: Boolean,
it, isGroupByType: Boolean,
resources.getDimensionPixelSize(R.dimen.divider_item_decorator_bound_start), isGroupByFavorites: Boolean
resources.getDimensionPixelSize(R.dimen.divider_item_decorator_bound_end) ) {
) this.isSortByName = isSortByName
this.isUnreadOnTop = isUnreadOnTop
this.isGroupByType = isGroupByType
this.isGroupByFavorites = isGroupByFavorites
if (isSortByName) {
text_sort_by.text =
getString(R.string.msg_sort_by, getString(R.string.msg_sort_by_name).toLowerCase())
} else {
text_sort_by.text = getString(
R.string.msg_sort_by,
getString(R.string.msg_sort_by_activity).toLowerCase()
) )
recycler_view.itemAnimator = DefaultItemAnimator()
viewModel.getChatRooms().observe(viewLifecycleOwner, Observer { rooms ->
rooms?.let {
Timber.d("Got items: $it")
adapter.values = it
if (recycler_view.adapter != adapter) {
recycler_view.adapter = adapter
}
if (rooms.isNotEmpty()) {
text_no_data_to_display.isVisible = false
}
}
})
viewModel.loadingState.observe(viewLifecycleOwner, Observer { state ->
when (state) {
is LoadingState.Loading -> if (state.count == 0L) showLoading()
is LoadingState.Loaded -> {
hideLoading()
if (state.count == 0L) showNoChatRoomsToDisplay()
}
is LoadingState.Error -> {
hideLoading()
showGenericErrorMessage()
}
}
})
viewModel.getStatus().observe(viewLifecycleOwner, Observer { status ->
status?.let { showConnectionState(status) }
})
updateSort()
} }
} }
...@@ -165,120 +135,40 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -165,120 +135,40 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
super.onCreateOptionsMenu(menu, inflater) super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.chatrooms, menu) inflater.inflate(R.menu.chatrooms, menu)
sortView = menu.findItem(R.id.action_sort) val searchMenuItem = menu.findItem(R.id.action_search)
val searchView = searchMenuItem?.actionView as SearchView
val searchItem = menu.findItem(R.id.action_search) with(searchView) {
searchView = searchItem?.actionView as? SearchView setIconifiedByDefault(false)
searchView?.setIconifiedByDefault(false) maxWidth = Integer.MAX_VALUE
searchView?.maxWidth = Integer.MAX_VALUE onQueryTextListener { queryChatRoomsByName(it) }
searchView?.onQueryTextListener { queryChatRoomsByName(it) } }
val expandListener = object : MenuItem.OnActionExpandListener { searchMenuItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener {
override fun onMenuItemActionCollapse(item: MenuItem): Boolean { override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
// Simply setting sortView to visible won't work, so we invalidate the options // We need to show all the menu items here by invalidating the options to recreate the entire menu.
// to recreate the entire menu...
viewModel.showLastMessage = true
activity?.invalidateOptionsMenu() activity?.invalidateOptionsMenu()
queryChatRoomsByName(null) queryChatRoomsByName(null)
return true return true
} }
override fun onMenuItemActionExpand(item: MenuItem): Boolean { override fun onMenuItemActionExpand(item: MenuItem): Boolean {
viewModel.showLastMessage = false // We need to hide the all the menu items here.
sortView?.isVisible = false menu.findItem(R.id.action_new_channel).isVisible = false
return true return true
} }
} })
searchItem?.setOnActionExpandListener(expandListener)
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
// TODO - simplify this R.id.action_new_channel -> presenter.toCreateChannel()
R.id.action_sort -> {
val dialogLayout = layoutInflater.inflate(R.layout.chatroom_sort_dialog, null)
val sortType = SharedPreferenceHelper.getInt(
Constants.CHATROOM_SORT_TYPE_KEY,
ChatRoomsSortOrder.ACTIVITY
)
val groupByType =
SharedPreferenceHelper.getBoolean(Constants.CHATROOM_GROUP_BY_TYPE_KEY, false)
val radioGroup = dialogLayout.findViewById<RadioGroup>(R.id.radio_group_sort)
val groupByTypeCheckBox =
dialogLayout.findViewById<CheckBox>(R.id.checkbox_group_by_type)
radioGroup.check(
when (sortType) {
0 -> R.id.radio_sort_alphabetical
else -> R.id.radio_sort_activity
}
)
radioGroup.setOnCheckedChangeListener { _, checkedId ->
run {
SharedPreferenceHelper.putInt(
Constants.CHATROOM_SORT_TYPE_KEY, when (checkedId) {
R.id.radio_sort_alphabetical -> 0
R.id.radio_sort_activity -> 1
else -> 1
}
)
}
}
groupByTypeCheckBox.isChecked = groupByType
groupByTypeCheckBox.setOnCheckedChangeListener { _, isChecked ->
SharedPreferenceHelper.putBoolean(
Constants.CHATROOM_GROUP_BY_TYPE_KEY,
isChecked
)
}
context?.let {
AlertDialog.Builder(it)
.setTitle(R.string.dialog_sort_title)
.setView(dialogLayout)
.setPositiveButton(R.string.msg_sort) { dialog, _ ->
invalidateQueryOnSearch()
updateSort()
dialog.dismiss()
}.show()
}
}
} }
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)
} }
private fun updateSort() {
val sortType = SharedPreferenceHelper.getInt(
Constants.CHATROOM_SORT_TYPE_KEY,
ChatRoomsSortOrder.ACTIVITY
)
val grouped = SharedPreferenceHelper.getBoolean(Constants.CHATROOM_GROUP_BY_TYPE_KEY, false)
val query = when (sortType) {
ChatRoomsSortOrder.ALPHABETICAL -> {
Query.ByName(grouped)
}
ChatRoomsSortOrder.ACTIVITY -> {
Query.ByActivity(grouped)
}
else -> Query.ByActivity()
}
viewModel.setQuery(query)
}
private fun invalidateQueryOnSearch() {
searchView?.let {
if (!searchView!!.isIconified) {
queryChatRoomsByName(searchView!!.query.toString())
}
}
}
private fun showNoChatRoomsToDisplay() { private fun showNoChatRoomsToDisplay() {
ui { text_no_data_to_display.isVisible = true } // ui { text_no_data_to_display.isVisible = true }
} }
override fun showLoading() { override fun showLoading() {
...@@ -303,55 +193,135 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -303,55 +193,135 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error)) override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
override fun showLoadingRoom(name: CharSequence) {
ui {
progressDialog = ProgressDialog.show(activity, "Rocket.Chat", "Loading room $name")
}
}
override fun hideLoadingRoom() {
progressDialog?.dismiss()
}
private fun showConnectionState(state: State) { private fun showConnectionState(state: State) {
Timber.d("Got new state: $state") Timber.d("Got new state: $state")
// ui {
// text_connection_status.fadeIn()
// handler.removeCallbacks(dismissStatus)
// text_connection_status.text = when (state) {
// is State.Connected -> {
// handler.postDelayed(dismissStatus, 2000)
// getString(R.string.status_connected)
// }
// is State.Disconnected -> getString(R.string.status_disconnected)
// is State.Connecting -> getString(R.string.status_connecting)
// is State.Authenticating -> getString(R.string.status_authenticating)
// is State.Disconnecting -> getString(R.string.status_disconnecting)
// is State.Waiting -> getString(R.string.status_waiting, state.seconds)
// else -> {
// handler.postDelayed(dismissStatus, 500)
// ""
// }
// }
// }
}
private fun subscribeUi() {
ui { ui {
text_connection_status.fadeIn() val adapter = RoomsAdapter { room ->
handler.removeCallbacks(dismissStatus) presenter.loadChatRoom(room)
text_connection_status.text = when (state) { }
is State.Connected -> {
handler.postDelayed(dismissStatus, 2000) with(recycler_view) {
getString(R.string.status_connected) layoutManager = LinearLayoutManager(it)
addItemDecoration(
DividerItemDecoration(
it,
resources.getDimensionPixelSize(R.dimen.divider_item_decorator_bound_start),
resources.getDimensionPixelSize(R.dimen.divider_item_decorator_bound_end)
)
)
itemAnimator = DefaultItemAnimator()
}
viewModel.getChatRooms().observe(viewLifecycleOwner, Observer { rooms ->
rooms?.let {
adapter.values = it
if (recycler_view.adapter != adapter) {
recycler_view.adapter = adapter
}
if (rooms.isNotEmpty()) {
// text_no_data_to_display.isVisible = false
}
} }
is State.Disconnected -> getString(R.string.status_disconnected) })
is State.Connecting -> getString(R.string.status_connecting)
is State.Authenticating -> getString(R.string.status_authenticating) viewModel.loadingState.observe(viewLifecycleOwner, Observer { state ->
is State.Disconnecting -> getString(R.string.status_disconnecting) when (state) {
is State.Waiting -> getString(R.string.status_waiting, state.seconds) is LoadingState.Loading -> if (state.count == 0L) showLoading()
else -> { is LoadingState.Loaded -> {
handler.postDelayed(dismissStatus, 500) hideLoading()
"" if (state.count == 0L) showNoChatRoomsToDisplay()
}
is LoadingState.Error -> {
hideLoading()
showGenericErrorMessage()
}
} }
} })
viewModel.getStatus().observe(viewLifecycleOwner, Observer { status ->
status?.let { showConnectionState(status) }
})
showAllChats()
} }
} }
private val dismissStatus = { private fun setupListeners() {
if (text_connection_status != null) { text_server_name.setOnClickListener {
text_connection_status.fadeOut() ServersBottomSheetFragment().show(
activity?.supportFragmentManager,
chat.rocket.android.servers.ui.TAG
)
}
text_sort_by.setOnClickListener {
SortingAndGroupingBottomSheetFragment().show(
activity?.supportFragmentManager,
chat.rocket.android.sortingandgrouping.ui.TAG
)
} }
} }
private fun setupToolbar() { fun sortChatRoomsList(
(activity as AppCompatActivity?)?.supportActionBar?.title = getString(R.string.title_chats) isSortByName: Boolean,
isUnreadOnTop: Boolean,
isGroupByType: Boolean,
isGroupByFavorites: Boolean
) {
this.isSortByName = isSortByName
this.isUnreadOnTop = isUnreadOnTop
this.isGroupByType = isGroupByType
this.isGroupByFavorites = isGroupByFavorites
if (isSortByName) {
viewModel.setQuery(Query.ByName(isGroupByType))
changeSortByTitle(getString(R.string.msg_sort_by_name))
} else {
viewModel.setQuery(Query.ByActivity(isGroupByType))
changeSortByTitle(getString(R.string.msg_sort_by_activity))
}
}
private fun changeSortByTitle(text: String) {
text_sort_by.text = getString(R.string.msg_sort_by, text.toLowerCase())
} }
private fun queryChatRoomsByName(name: String?): Boolean { private fun queryChatRoomsByName(name: String?): Boolean {
if (name.isNullOrEmpty()) { if (name.isNullOrEmpty()) {
updateSort() showAllChats()
} else { } else {
viewModel.setQuery(Query.Search(name!!)) viewModel.setQuery(Query.Search(name))
} }
return true return true
} }
private fun showAllChats() {
if (isSortByName) {
viewModel.setQuery(Query.ByName(isGroupByType))
} else {
viewModel.setQuery(Query.ByActivity(isGroupByType))
}
}
} }
...@@ -22,7 +22,7 @@ class CreateChannelPresenter @Inject constructor( ...@@ -22,7 +22,7 @@ class CreateChannelPresenter @Inject constructor(
val serverInteractor: GetCurrentServerInteractor, val serverInteractor: GetCurrentServerInteractor,
val factory: RocketChatClientFactory val factory: RocketChatClientFactory
) { ) {
private val client: RocketChatClient = factory.create(serverInteractor.get()!!) private val client: RocketChatClient = factory.get(serverInteractor.get()!!)
fun createChannel( fun createChannel(
roomType: RoomType, roomType: RoomType,
...@@ -35,7 +35,6 @@ class CreateChannelPresenter @Inject constructor( ...@@ -35,7 +35,6 @@ class CreateChannelPresenter @Inject constructor(
view.disableUserInput() view.disableUserInput()
try { try {
client.createChannel(roomType, channelName, usersList, readOnly) client.createChannel(roomType, channelName, usersList, readOnly)
view.prepareToShowChatList()
view.showChannelCreatedSuccessfullyMessage() view.showChannelCreatedSuccessfullyMessage()
toChatList() toChatList()
} catch (exception: RocketChatException) { } catch (exception: RocketChatException) {
......
...@@ -28,12 +28,6 @@ interface CreateChannelView : LoadingView, MessageView { ...@@ -28,12 +28,6 @@ interface CreateChannelView : LoadingView, MessageView {
*/ */
fun hideSuggestionViewInProgress() fun hideSuggestionViewInProgress()
/**
* Shows the navigation drawer with the chat item checked before showing the chat list.
* This function is invoked after successfully created the channel.
*/
fun prepareToShowChatList()
/** /**
* Shows a message that a channel was successfully created. * Shows a message that a channel was successfully created.
*/ */
......
...@@ -9,7 +9,6 @@ import android.view.ViewGroup ...@@ -9,7 +9,6 @@ import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.postDelayed
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
...@@ -19,7 +18,6 @@ import chat.rocket.android.analytics.AnalyticsManager ...@@ -19,7 +18,6 @@ import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.createchannel.presentation.CreateChannelPresenter import chat.rocket.android.createchannel.presentation.CreateChannelPresenter
import chat.rocket.android.createchannel.presentation.CreateChannelView import chat.rocket.android.createchannel.presentation.CreateChannelView
import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.members.adapter.MembersAdapter import chat.rocket.android.members.adapter.MembersAdapter
import chat.rocket.android.members.uimodel.MemberUiModel import chat.rocket.android.members.uimodel.MemberUiModel
import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extension.asObservable
...@@ -32,17 +30,18 @@ import com.google.android.material.chip.Chip ...@@ -32,17 +30,18 @@ import com.google.android.material.chip.Chip
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
import kotlinx.android.synthetic.main.app_bar.*
import kotlinx.android.synthetic.main.fragment_create_channel.* import kotlinx.android.synthetic.main.fragment_create_channel.*
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_CREATE_CHANNEL_FRAGMENT = "CreateChannelFragment" internal const val TAG_CREATE_CHANNEL_FRAGMENT = "CreateChannelFragment"
fun newInstance() = CreateChannelFragment()
class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback { class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback {
@Inject @Inject lateinit var presenter: CreateChannelPresenter
lateinit var createChannelPresenter: CreateChannelPresenter @Inject lateinit var analyticsManager: AnalyticsManager
@Inject
lateinit var analyticsManager: AnalyticsManager
private var actionMode: ActionMode? = null private var actionMode: ActionMode? = null
private val adapter: MembersAdapter = MembersAdapter { private val adapter: MembersAdapter = MembersAdapter {
it.username?.run { processSelectedMember(this) } it.username?.run { processSelectedMember(this) }
...@@ -52,10 +51,6 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback ...@@ -52,10 +51,6 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback
private var isChannelReadOnly: Boolean = false private var isChannelReadOnly: Boolean = false
private var memberList = arrayListOf<String>() private var memberList = arrayListOf<String>()
companion object {
fun newInstance() = CreateChannelFragment()
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
AndroidSupportInjection.inject(this) AndroidSupportInjection.inject(this)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
...@@ -93,7 +88,7 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback ...@@ -93,7 +88,7 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback
override fun onActionItemClicked(mode: ActionMode, menuItem: MenuItem): Boolean { override fun onActionItemClicked(mode: ActionMode, menuItem: MenuItem): Boolean {
return when (menuItem.itemId) { return when (menuItem.itemId) {
R.id.action_create_channel -> { R.id.action_create_channel -> {
createChannelPresenter.createChannel( presenter.createChannel(
roomTypeOf(channelType), roomTypeOf(channelType),
text_channel_name.text.toString(), text_channel_name.text.toString(),
memberList, memberList,
...@@ -165,17 +160,6 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback ...@@ -165,17 +160,6 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback
view_member_suggestion_loading.isVisible = false view_member_suggestion_loading.isVisible = false
} }
override fun prepareToShowChatList() {
with(activity as MainActivity) {
setCheckedNavDrawerItem(R.id.menu_action_chats)
openDrawer()
getDrawerLayout().postDelayed(1000) {
closeDrawer()
createChannelPresenter.toChatList()
}
}
}
override fun showChannelCreatedSuccessfullyMessage() { override fun showChannelCreatedSuccessfullyMessage() {
showMessage(getString(R.string.msg_channel_created_successfully)) showMessage(getString(R.string.msg_channel_created_successfully))
} }
...@@ -191,8 +175,14 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback ...@@ -191,8 +175,14 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback
} }
private fun setupToolBar() { private fun setupToolBar() {
(activity as AppCompatActivity?)?.supportActionBar?.title = with((activity as AppCompatActivity)) {
getString(R.string.title_create_channel) with(toolbar) {
setSupportActionBar(this)
title = getString(R.string.title_create_channel)
setNavigationIcon(R.drawable.ic_arrow_back_white_24dp)
setNavigationOnClickListener { activity?.onBackPressed() }
}
}
} }
private fun setupViewListeners() { private fun setupViewListeners() {
...@@ -247,7 +237,7 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback ...@@ -247,7 +237,7 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback
.filter { t -> t.isNotBlank() } .filter { t -> t.isNotBlank() }
.subscribe { .subscribe {
if (it.length >= 3) { if (it.length >= 3) {
createChannelPresenter.searchUser(it.toString()) presenter.searchUser(it.toString())
} else { } else {
view_member_suggestion.isVisible = false view_member_suggestion.isVisible = false
} }
......
package chat.rocket.android.dagger.module package chat.rocket.android.dagger.module
import chat.rocket.android.about.di.AboutFragmentProvider
import chat.rocket.android.authentication.di.AuthenticationModule import chat.rocket.android.authentication.di.AuthenticationModule
import chat.rocket.android.authentication.login.di.LoginFragmentProvider import chat.rocket.android.authentication.login.di.LoginFragmentProvider
import chat.rocket.android.authentication.loginoptions.di.LoginOptionsFragmentProvider import chat.rocket.android.authentication.loginoptions.di.LoginOptionsFragmentProvider
...@@ -29,13 +28,14 @@ import chat.rocket.android.main.ui.MainActivity ...@@ -29,13 +28,14 @@ import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.members.di.MembersFragmentProvider import chat.rocket.android.members.di.MembersFragmentProvider
import chat.rocket.android.mentions.di.MentionsFragmentProvider import chat.rocket.android.mentions.di.MentionsFragmentProvider
import chat.rocket.android.pinnedmessages.di.PinnedMessagesFragmentProvider import chat.rocket.android.pinnedmessages.di.PinnedMessagesFragmentProvider
import chat.rocket.android.preferences.di.PreferencesFragmentProvider
import chat.rocket.android.profile.di.ProfileFragmentProvider import chat.rocket.android.profile.di.ProfileFragmentProvider
import chat.rocket.android.server.di.ChangeServerModule import chat.rocket.android.server.di.ChangeServerModule
import chat.rocket.android.server.ui.ChangeServerActivity import chat.rocket.android.server.ui.ChangeServerActivity
import chat.rocket.android.servers.di.ServersBottomSheetFragmentProvider
import chat.rocket.android.settings.di.SettingsFragmentProvider import chat.rocket.android.settings.di.SettingsFragmentProvider
import chat.rocket.android.settings.password.di.PasswordFragmentProvider import chat.rocket.android.settings.password.di.PasswordFragmentProvider
import chat.rocket.android.settings.password.ui.PasswordActivity import chat.rocket.android.settings.password.ui.PasswordActivity
import chat.rocket.android.sortingandgrouping.di.SortingAndGroupingBottomSheetFragmentProvider
import chat.rocket.android.userdetails.di.UserDetailsFragmentProvider import chat.rocket.android.userdetails.di.UserDetailsFragmentProvider
import chat.rocket.android.videoconference.di.VideoConferenceModule import chat.rocket.android.videoconference.di.VideoConferenceModule
import chat.rocket.android.videoconference.ui.VideoConferenceActivity import chat.rocket.android.videoconference.ui.VideoConferenceActivity
...@@ -65,11 +65,11 @@ abstract class ActivityBuilder { ...@@ -65,11 +65,11 @@ abstract class ActivityBuilder {
@ContributesAndroidInjector( @ContributesAndroidInjector(
modules = [MainModule::class, modules = [MainModule::class,
ChatRoomsFragmentProvider::class, ChatRoomsFragmentProvider::class,
ServersBottomSheetFragmentProvider::class,
SortingAndGroupingBottomSheetFragmentProvider::class,
CreateChannelProvider::class, CreateChannelProvider::class,
ProfileFragmentProvider::class, ProfileFragmentProvider::class,
SettingsFragmentProvider::class, SettingsFragmentProvider::class,
AboutFragmentProvider::class,
PreferencesFragmentProvider::class,
AdminPanelWebViewFragmentProvider::class AdminPanelWebViewFragmentProvider::class
] ]
) )
......
...@@ -27,23 +27,23 @@ import chat.rocket.android.push.PushManager ...@@ -27,23 +27,23 @@ import chat.rocket.android.push.PushManager
import chat.rocket.android.server.domain.AccountsRepository import chat.rocket.android.server.domain.AccountsRepository
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.server.domain.AnalyticsTrackingRepository import chat.rocket.android.server.domain.AnalyticsTrackingRepository
import chat.rocket.android.server.domain.BasicAuthRepository
import chat.rocket.android.server.domain.ChatRoomsRepository import chat.rocket.android.server.domain.ChatRoomsRepository
import chat.rocket.android.server.domain.CurrentServerRepository import chat.rocket.android.server.domain.CurrentServerRepository
import chat.rocket.android.server.domain.GetAccountInteractor import chat.rocket.android.server.domain.GetAccountInteractor
import chat.rocket.android.server.domain.GetAccountsInteractor import chat.rocket.android.server.domain.GetAccountsInteractor
import chat.rocket.android.server.domain.GetBasicAuthInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.GetSettingsInteractor import chat.rocket.android.server.domain.GetSettingsInteractor
import chat.rocket.android.server.domain.JobSchedulerInteractor import chat.rocket.android.server.domain.JobSchedulerInteractor
import chat.rocket.android.server.domain.MessagesRepository import chat.rocket.android.server.domain.MessagesRepository
import chat.rocket.android.server.domain.MultiServerTokenRepository import chat.rocket.android.server.domain.MultiServerTokenRepository
import chat.rocket.android.server.domain.PermissionsRepository import chat.rocket.android.server.domain.PermissionsRepository
import chat.rocket.android.server.domain.SaveBasicAuthInteractor
import chat.rocket.android.server.domain.SettingsRepository import chat.rocket.android.server.domain.SettingsRepository
import chat.rocket.android.server.domain.SortingAndGroupingRepository
import chat.rocket.android.server.domain.TokenRepository import chat.rocket.android.server.domain.TokenRepository
import chat.rocket.android.server.domain.UsersRepository import chat.rocket.android.server.domain.UsersRepository
import chat.rocket.android.server.domain.BasicAuthRepository
import chat.rocket.android.server.domain.GetBasicAuthInteractor
import chat.rocket.android.server.domain.SaveBasicAuthInteractor
import chat.rocket.android.server.infraestructure.SharedPrefsBasicAuthRepository
import chat.rocket.android.server.infraestructure.DatabaseMessageMapper import chat.rocket.android.server.infraestructure.DatabaseMessageMapper
import chat.rocket.android.server.infraestructure.DatabaseMessagesRepository import chat.rocket.android.server.infraestructure.DatabaseMessagesRepository
import chat.rocket.android.server.infraestructure.JobSchedulerInteractorImpl import chat.rocket.android.server.infraestructure.JobSchedulerInteractorImpl
...@@ -53,11 +53,13 @@ import chat.rocket.android.server.infraestructure.SharedPreferencesAccountsRepos ...@@ -53,11 +53,13 @@ import chat.rocket.android.server.infraestructure.SharedPreferencesAccountsRepos
import chat.rocket.android.server.infraestructure.SharedPreferencesPermissionsRepository import chat.rocket.android.server.infraestructure.SharedPreferencesPermissionsRepository
import chat.rocket.android.server.infraestructure.SharedPreferencesSettingsRepository import chat.rocket.android.server.infraestructure.SharedPreferencesSettingsRepository
import chat.rocket.android.server.infraestructure.SharedPrefsAnalyticsTrackingRepository import chat.rocket.android.server.infraestructure.SharedPrefsAnalyticsTrackingRepository
import chat.rocket.android.server.infraestructure.SharedPrefsBasicAuthRepository
import chat.rocket.android.server.infraestructure.SharedPrefsConnectingServerRepository import chat.rocket.android.server.infraestructure.SharedPrefsConnectingServerRepository
import chat.rocket.android.server.infraestructure.SharedPrefsCurrentServerRepository import chat.rocket.android.server.infraestructure.SharedPrefsCurrentServerRepository
import chat.rocket.android.server.infraestructure.SharedPrefsSortingAndGroupingRepository
import chat.rocket.android.util.AppJsonAdapterFactory import chat.rocket.android.util.AppJsonAdapterFactory
import chat.rocket.android.util.HttpLoggingInterceptor
import chat.rocket.android.util.BasicAuthenticatorInterceptor import chat.rocket.android.util.BasicAuthenticatorInterceptor
import chat.rocket.android.util.HttpLoggingInterceptor
import chat.rocket.android.util.TimberLogger import chat.rocket.android.util.TimberLogger
import chat.rocket.common.internal.FallbackSealedClassJsonAdapter import chat.rocket.common.internal.FallbackSealedClassJsonAdapter
import chat.rocket.common.internal.ISO8601Date import chat.rocket.common.internal.ISO8601Date
...@@ -123,7 +125,10 @@ class AppModule { ...@@ -123,7 +125,10 @@ class AppModule {
@Provides @Provides
@Singleton @Singleton
fun provideOkHttpClient(logger: HttpLoggingInterceptor, basicAuthenticator: BasicAuthenticatorInterceptor): OkHttpClient { fun provideOkHttpClient(
logger: HttpLoggingInterceptor,
basicAuthenticator: BasicAuthenticatorInterceptor
): OkHttpClient {
return OkHttpClient.Builder() return OkHttpClient.Builder()
.addInterceptor(logger) .addInterceptor(logger)
.addInterceptor(basicAuthenticator) .addInterceptor(basicAuthenticator)
...@@ -194,6 +199,12 @@ class AppModule { ...@@ -194,6 +199,12 @@ class AppModule {
return SharedPrefsAnalyticsTrackingRepository(prefs) return SharedPrefsAnalyticsTrackingRepository(prefs)
} }
@Provides
@Singleton
fun provideSortingAndGroupingRepository(prefs: SharedPreferences): SortingAndGroupingRepository {
return SharedPrefsSortingAndGroupingRepository(prefs)
}
@Provides @Provides
@ForAuthentication @ForAuthentication
fun provideConnectingServerRepository(prefs: SharedPreferences): CurrentServerRepository { fun provideConnectingServerRepository(prefs: SharedPreferences): CurrentServerRepository {
...@@ -293,10 +304,10 @@ class AppModule { ...@@ -293,10 +304,10 @@ class AppModule {
@Provides @Provides
@Singleton @Singleton
fun provideBasicAuthRepository ( fun provideBasicAuthRepository(
preferences: SharedPreferences, preferences: SharedPreferences,
moshi: Moshi moshi: Moshi
): BasicAuthRepository = ): BasicAuthRepository =
SharedPrefsBasicAuthRepository(preferences, moshi) SharedPrefsBasicAuthRepository(preferences, moshi)
@Provides @Provides
......
...@@ -139,7 +139,7 @@ class DatabaseManager(val context: Application, val serverUrl: String) { ...@@ -139,7 +139,7 @@ class DatabaseManager(val context: Application, val serverUrl: String) {
} }
/* /*
* Creates a list of data base operations * Creates a list of database operations
*/ */
fun processChatRoomsBatch(batch: List<StreamMessage<BaseRoom>>) { fun processChatRoomsBatch(batch: List<StreamMessage<BaseRoom>>) {
GlobalScope.launch(dbManagerContext) { GlobalScope.launch(dbManagerContext) {
......
...@@ -5,7 +5,6 @@ import chat.rocket.android.core.lifecycle.CancelStrategy ...@@ -5,7 +5,6 @@ import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.db.DatabaseManager import chat.rocket.android.db.DatabaseManager
import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.retryDB
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
import chat.rocket.common.model.roomTypeOf import chat.rocket.common.model.roomTypeOf
import chat.rocket.common.util.ifNull import chat.rocket.common.util.ifNull
...@@ -23,7 +22,7 @@ class FavoriteMessagesPresenter @Inject constructor( ...@@ -23,7 +22,7 @@ class FavoriteMessagesPresenter @Inject constructor(
private val mapper: UiModelMapper, private val mapper: UiModelMapper,
val factory: RocketChatClientFactory val factory: RocketChatClientFactory
) { ) {
private val client: RocketChatClient = factory.create(currentServer) private val client: RocketChatClient = factory.get(currentServer)
private var offset: Int = 0 private var offset: Int = 0
/** /**
......
...@@ -7,7 +7,6 @@ import chat.rocket.android.files.uimodel.FileUiModel ...@@ -7,7 +7,6 @@ import chat.rocket.android.files.uimodel.FileUiModel
import chat.rocket.android.files.uimodel.FileUiModelMapper import chat.rocket.android.files.uimodel.FileUiModelMapper
import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.retryDB
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
import chat.rocket.common.model.roomTypeOf import chat.rocket.common.model.roomTypeOf
import chat.rocket.common.util.ifNull import chat.rocket.common.util.ifNull
...@@ -25,7 +24,7 @@ class FilesPresenter @Inject constructor( ...@@ -25,7 +24,7 @@ class FilesPresenter @Inject constructor(
private val mapper: FileUiModelMapper, private val mapper: FileUiModelMapper,
val factory: RocketChatClientFactory val factory: RocketChatClientFactory
) { ) {
private val client: RocketChatClient = factory.create(currentServer) private val client: RocketChatClient = factory.get(currentServer)
private var offset: Int = 0 private var offset: Int = 0
/** /**
......
package chat.rocket.android.helper
object Constants {
const val CHATROOM_SORT_TYPE_KEY: String = "chatroom_sort_type"
const val CHATROOM_GROUP_BY_TYPE_KEY: String = "chatroom_group_by_type"
const val CHATROOM_GROUP_FAVOURITES_KEY: String = "chatroom_group_favourites"
//Used to sort chat rooms
const val CHATROOM_CHANNEL = 0
const val CHATROOM_PRIVATE_GROUP = 1
const val CHATROOM_DM = 2
const val CHATROOM_LIVE_CHAT = 3
}
object ChatRoomsSortOrder {
const val ALPHABETICAL: Int = 0
const val ACTIVITY: Int = 1
}
\ No newline at end of file
package chat.rocket.android.helper
import android.content.SharedPreferences
import android.preference.PreferenceManager
import chat.rocket.android.app.RocketChatApplication
object SharedPreferenceHelper {
private var sharedPreferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(RocketChatApplication.getAppContext())
private var editor: SharedPreferences.Editor? = sharedPreferences.edit()
//Add more methods for other types if needed
fun putInt(key: String, value: Int) {
editor!!.putInt(key, value).apply()
}
fun getInt(key: String, defaultValue: Int): Int {
return sharedPreferences.getInt(key, defaultValue)
}
fun putLong(key: String, value: Long) {
editor!!.putLong(key, value).apply()
}
fun getLong(key: String, defaultValue: Long): Long {
return sharedPreferences.getLong(key, defaultValue)
}
fun putString(key: String, value: String) {
editor!!.putString(key, value).apply()
}
fun getString(key: String, defaultValue: String): String? {
return sharedPreferences.getString(key, defaultValue)
}
fun putBoolean(key: String, value: Boolean) {
editor!!.putBoolean(key, value).apply()
}
fun getBoolean(key: String, defaultValue: Boolean): Boolean {
return sharedPreferences.getBoolean(key, defaultValue)
}
fun remove(key: String) {
editor!!.remove(key).apply()
}
}
\ No newline at end of file
...@@ -24,6 +24,24 @@ class UserHelper @Inject constructor( ...@@ -24,6 +24,24 @@ class UserHelper @Inject constructor(
*/ */
fun username(): String? = localRepository.get(LocalRepository.CURRENT_USERNAME_KEY, null) fun username(): String? = localRepository.get(LocalRepository.CURRENT_USERNAME_KEY, null)
/**
* Return the name for the current logged [User].
*/
fun name(): String? = user()?.name
/**
* Return the display name for the given [user].
* If setting 'Use_Real_Name' is true then the real name will be given, otherwise the username
* without the '@' is yielded.
*/
fun displayName(user: User) = getCurrentServerInteractor.get()?.let {
if (settingsRepository.get(it).useRealName()) {
user.name
} else {
user.username
}
}
/** /**
* Return the display name for the given [user]. * Return the display name for the given [user].
* If setting 'Use_Real_Name' is true then the real name will be given, otherwise the username * If setting 'Use_Real_Name' is true then the real name will be given, otherwise the username
......
package chat.rocket.android.main.adapter
import androidx.recyclerview.widget.RecyclerView
import android.view.View
import chat.rocket.common.model.UserStatus
import kotlinx.android.synthetic.main.item_change_status.view.*
class StatusViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(listener: (UserStatus) -> Unit) {
with(itemView) {
text_online.setOnClickListener { listener(UserStatus.Online()) }
text_away.setOnClickListener { listener(UserStatus.Away()) }
text_busy.setOnClickListener { listener(UserStatus.Busy()) }
text_invisible.setOnClickListener { listener(UserStatus.Offline()) }
}
}
}
\ No newline at end of file
...@@ -4,7 +4,6 @@ import androidx.lifecycle.LifecycleOwner ...@@ -4,7 +4,6 @@ import androidx.lifecycle.LifecycleOwner
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.dagger.scope.PerActivity import chat.rocket.android.dagger.scope.PerActivity
import chat.rocket.android.main.presentation.MainNavigator import chat.rocket.android.main.presentation.MainNavigator
import chat.rocket.android.main.presentation.MainView
import chat.rocket.android.main.ui.MainActivity import chat.rocket.android.main.ui.MainActivity
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
...@@ -13,16 +12,13 @@ import kotlinx.coroutines.Job ...@@ -13,16 +12,13 @@ import kotlinx.coroutines.Job
@Module @Module
class MainModule { class MainModule {
@Provides
@PerActivity
fun provideJob() = Job()
@Provides @Provides
@PerActivity @PerActivity
fun provideMainNavigator(activity: MainActivity) = MainNavigator(activity) fun provideMainNavigator(activity: MainActivity) = MainNavigator(activity)
@Provides @Provides
fun provideMainView(activity: MainActivity): MainView = activity @PerActivity
fun provideJob() = Job()
@Provides @Provides
fun provideLifecycleOwner(activity: MainActivity): LifecycleOwner = activity fun provideLifecycleOwner(activity: MainActivity): LifecycleOwner = activity
......
...@@ -3,51 +3,53 @@ package chat.rocket.android.main.presentation ...@@ -3,51 +3,53 @@ package chat.rocket.android.main.presentation
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.authentication.ui.newServerIntent import chat.rocket.android.authentication.ui.newServerIntent
import chat.rocket.android.chatroom.ui.chatRoomIntent import chat.rocket.android.chatroom.ui.chatRoomIntent
import chat.rocket.android.chatrooms.ui.ChatRoomsFragment
import chat.rocket.android.chatrooms.ui.TAG_CHAT_ROOMS_FRAGMENT import chat.rocket.android.chatrooms.ui.TAG_CHAT_ROOMS_FRAGMENT
import chat.rocket.android.createchannel.ui.CreateChannelFragment
import chat.rocket.android.createchannel.ui.TAG_CREATE_CHANNEL_FRAGMENT import chat.rocket.android.createchannel.ui.TAG_CREATE_CHANNEL_FRAGMENT
import chat.rocket.android.main.ui.MainActivity import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.profile.ui.ProfileFragment
import chat.rocket.android.profile.ui.TAG_PROFILE_FRAGMENT import chat.rocket.android.profile.ui.TAG_PROFILE_FRAGMENT
import chat.rocket.android.server.ui.changeServerIntent import chat.rocket.android.server.ui.changeServerIntent
import chat.rocket.android.settings.ui.SettingsFragment
import chat.rocket.android.settings.ui.TAG_SETTINGS_FRAGMENT import chat.rocket.android.settings.ui.TAG_SETTINGS_FRAGMENT
import chat.rocket.android.util.extensions.addFragment import chat.rocket.android.util.extensions.addFragment
import chat.rocket.android.webview.adminpanel.ui.AdminPanelWebViewFragment import chat.rocket.android.util.extensions.addFragmentBackStack
import chat.rocket.android.webview.adminpanel.ui.TAG_ADMIN_PANEL_WEB_VIEW_FRAGMENT
import chat.rocket.android.webview.ui.webViewIntent
class MainNavigator(internal val activity: MainActivity) { class MainNavigator(internal val activity: MainActivity) {
fun toChatList(chatRoomId: String? = null) { fun toChatList(chatRoomId: String? = null) {
activity.addFragment(TAG_CHAT_ROOMS_FRAGMENT, R.id.fragment_container) { activity.addFragment(TAG_CHAT_ROOMS_FRAGMENT, R.id.fragment_container) {
ChatRoomsFragment.newInstance(chatRoomId) chat.rocket.android.chatrooms.ui.newInstance(chatRoomId)
} }
} }
fun toCreateChannel() { fun toSettings() {
activity.addFragment(TAG_CREATE_CHANNEL_FRAGMENT, R.id.fragment_container) { activity.addFragmentBackStack(TAG_SETTINGS_FRAGMENT, R.id.fragment_container) {
CreateChannelFragment.newInstance() chat.rocket.android.settings.ui.newInstance()
} }
} }
fun toUserProfile() { fun toCreateChannel() {
activity.addFragment(TAG_PROFILE_FRAGMENT, R.id.fragment_container) { activity.addFragmentBackStack(TAG_CREATE_CHANNEL_FRAGMENT, R.id.fragment_container) {
ProfileFragment.newInstance() chat.rocket.android.createchannel.ui.newInstance()
} }
} }
fun toSettings() { fun toProfile() {
activity.addFragment(TAG_SETTINGS_FRAGMENT, R.id.fragment_container) { activity.addFragmentBackStack(TAG_PROFILE_FRAGMENT, R.id.fragment_container) {
SettingsFragment.newInstance() chat.rocket.android.profile.ui.newInstance()
} }
} }
fun toAdminPanel(webPageUrl: String, userToken: String) { fun toAdminPanel(webPageUrl: String, userToken: String) {
activity.addFragment("AdminPanelWebViewFragment", R.id.fragment_container) { activity.addFragmentBackStack(TAG_ADMIN_PANEL_WEB_VIEW_FRAGMENT, R.id.fragment_container) {
AdminPanelWebViewFragment.newInstance(webPageUrl, userToken) chat.rocket.android.webview.adminpanel.ui.newInstance(webPageUrl, userToken)
} }
} }
fun toLicense(licenseUrl: String, licenseTitle: String) {
activity.startActivity(activity.webViewIntent(licenseUrl, licenseTitle))
}
fun toChatRoom( fun toChatRoom(
chatRoomId: String, chatRoomId: String,
chatRoomName: String, chatRoomName: String,
......
package chat.rocket.android.main.presentation package chat.rocket.android.main.presentation
import android.content.Context
import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.db.DatabaseManagerFactory
import chat.rocket.android.emoji.Emoji
import chat.rocket.android.emoji.EmojiRepository
import chat.rocket.android.emoji.Fitzpatrick
import chat.rocket.android.emoji.internal.EmojiCategory
import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.main.uimodel.NavHeaderUiModel
import chat.rocket.android.main.uimodel.NavHeaderUiModelMapper
import chat.rocket.android.push.GroupedPush import chat.rocket.android.push.GroupedPush
import chat.rocket.android.server.domain.GetAccountsInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.GetSettingsInteractor
import chat.rocket.android.server.domain.PublicSettings
import chat.rocket.android.server.domain.RefreshSettingsInteractor
import chat.rocket.android.server.domain.RefreshPermissionsInteractor import chat.rocket.android.server.domain.RefreshPermissionsInteractor
import chat.rocket.android.server.domain.RemoveAccountInteractor import chat.rocket.android.server.domain.RefreshSettingsInteractor
import chat.rocket.android.server.domain.SaveAccountInteractor
import chat.rocket.android.server.domain.TokenRepository
import chat.rocket.android.server.domain.favicon
import chat.rocket.android.server.domain.model.Account
import chat.rocket.android.server.infraestructure.ConnectionManagerFactory 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.launchUI
import chat.rocket.android.util.extensions.adminPanelUrl
import chat.rocket.android.util.extensions.serverLogoUrl
import chat.rocket.android.util.retryIO
import chat.rocket.common.RocketChatAuthException
import chat.rocket.common.RocketChatException
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.me
import chat.rocket.core.model.Myself
import kotlinx.coroutines.channels.Channel
import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named
class MainPresenter @Inject constructor( class MainPresenter @Inject constructor(
private val view: MainView, @Named("currentServer") private val currentServerUrl: String,
private val strategy: CancelStrategy, private val mainNavigator: MainNavigator,
private val navigator: MainNavigator,
private val tokenRepository: TokenRepository,
private val refreshSettingsInteractor: RefreshSettingsInteractor, private val refreshSettingsInteractor: RefreshSettingsInteractor,
private val refreshPermissionsInteractor: RefreshPermissionsInteractor, private val refreshPermissionsInteractor: RefreshPermissionsInteractor,
private val navHeaderMapper: NavHeaderUiModelMapper, private val connectionManagerFactory: ConnectionManagerFactory,
private val saveAccountInteractor: SaveAccountInteractor, private val groupedPush: GroupedPush
private val getAccountsInteractor: GetAccountsInteractor,
private val groupedPush: GroupedPush,
serverInteractor: GetCurrentServerInteractor,
localRepository: LocalRepository,
removeAccountInteractor: RemoveAccountInteractor,
factory: RocketChatClientFactory,
dbManagerFactory: DatabaseManagerFactory,
getSettingsInteractor: GetSettingsInteractor,
managerFactory: ConnectionManagerFactory
) : 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 client: RocketChatClient = factory.create(currentServer)
private var settings: PublicSettings = getSettingsInteractor.get(serverInteractor.get()!!)
private val userDataChannel = Channel<Myself>()
fun toChatList(chatRoomId: String? = null) = navigator.toChatList(chatRoomId)
fun toUserProfile() = navigator.toUserProfile()
fun toSettings() = navigator.toSettings()
fun toAdminPanel() = tokenRepository.get(currentServer)?.let {
navigator.toAdminPanel(currentServer.adminPanelUrl(), it.authToken)
}
fun toCreateChannel() = navigator.toCreateChannel()
fun loadServerAccounts() {
launchUI(strategy) {
try {
view.setupServerAccountList(getAccountsInteractor.get())
} catch (ex: Exception) {
when (ex) {
is RocketChatAuthException -> logout()
else -> {
Timber.d(ex, "Error loading serve accounts")
ex.message?.let {
view.showMessage(it)
}.ifNull {
view.showGenericErrorMessage()
}
}
}
}
}
}
fun loadCurrentInfo() {
setupConnectionInfo(currentServer)
checkServerInfo(currentServer)
launchUI(strategy) {
try {
val me = retryIO("me") { client.me() }
val model = navHeaderMapper.mapToUiModel(me)
saveAccount(model)
view.setupUserAccountInfo(model)
} catch (ex: Exception) {
when (ex) {
is RocketChatAuthException -> logout()
else -> {
Timber.d(ex, "Error loading my information for navheader")
ex.message?.let {
view.showMessage(it)
}.ifNull {
view.showGenericErrorMessage()
}
}
}
}
subscribeMyselfUpdates()
}
}
/**
* Load all emojis for the current server. Simple emojis are always the same for every server,
* but custom emojis vary according to the its url.
*/
fun loadEmojis() {
launchUI(strategy) {
EmojiRepository.setCurrentServerUrl(currentServer)
val customEmojiList = mutableListOf<Emoji>()
try {
for (customEmoji in retryIO("getCustomEmojis()") { client.getCustomEmojis() }) {
customEmojiList.add(Emoji(
shortname = ":${customEmoji.name}:",
category = EmojiCategory.CUSTOM.name,
url = "$currentServer/emoji-custom/${customEmoji.name}.${customEmoji.extension}",
count = 0,
fitzpatrick = Fitzpatrick.Default.type,
keywords = customEmoji.aliases,
shortnameAlternates = customEmoji.aliases,
siblings = mutableListOf(),
unicode = "",
isDefault = true
))
}
EmojiRepository.load(view as Context, customEmojis = customEmojiList)
} catch (ex: RocketChatException) {
Timber.e(ex)
EmojiRepository.load(view as Context)
}
}
}
fun logout() {
setupConnectionInfo(currentServer)
super.logout(userDataChannel)
}
fun connect() { fun connect() {
refreshSettingsInteractor.refreshAsync(currentServer) refreshSettingsInteractor.refreshAsync(currentServerUrl)
refreshPermissionsInteractor.refreshAsync(currentServer) refreshPermissionsInteractor.refreshAsync(currentServerUrl)
manager.connect() connectionManagerFactory.create(currentServerUrl).connect()
}
fun disconnect() {
setupConnectionInfo(currentServer)
super.disconnect(userDataChannel)
}
fun changeServer(serverUrl: String) {
if (currentServer != serverUrl) {
navigator.switchOrAddNewServer(serverUrl)
} else {
view.closeServerSelection()
}
}
fun addNewServer() {
navigator.toServerScreen()
} }
fun changeDefaultStatus(userStatus: UserStatus) { fun clearNotificationsForChatRoom(chatRoomId: String?) {
launchUI(strategy) {
try {
manager.setDefaultStatus(userStatus)
view.showUserStatus(userStatus)
} catch (ex: RocketChatException) {
ex.message?.let {
view.showMessage(it)
}.ifNull {
view.showGenericErrorMessage()
}
}
}
}
private fun saveAccount(uiModel: NavHeaderUiModel) {
val icon = settings.favicon()?.let {
currentServer.serverLogoUrl(it)
}
val account = Account(
currentServer,
icon,
uiModel.serverLogo,
uiModel.userDisplayName!!,
uiModel.userAvatar
)
saveAccountInteractor.save(account)
}
private suspend fun subscribeMyselfUpdates() {
manager.addUserDataChannel(userDataChannel)
for (myself in userDataChannel) {
updateMyself(myself)
}
}
private fun updateMyself(myself: Myself) =
view.setupUserAccountInfo(navHeaderMapper.mapToUiModel(myself))
fun clearNotificationsForChatroom(chatRoomId: String?) {
if (chatRoomId == null) return if (chatRoomId == null) return
groupedPush.hostToPushMessageList[currentServer]?.let { list -> groupedPush.hostToPushMessageList[currentServerUrl].let { list ->
list.removeAll { it.info.roomId == chatRoomId } list?.removeAll { it.info.roomId == chatRoomId }
} }
} }
}
fun showChatList(chatRoomId: String? = null) = mainNavigator.toChatList(chatRoomId)
}
\ No newline at end of file
package chat.rocket.android.main.presentation
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, TokenView {
/**
* Shows the current user status.
*
* @see [UserStatus]
*/
fun showUserStatus(userStatus: UserStatus)
/**
* Setups the user account info (displayed in the nav. header)
*
* @param uiModel The [NavHeaderUiModel].
*/
fun setupUserAccountInfo(uiModel: NavHeaderUiModel)
/**
* Setups the server account list.
*
* @param serverAccountList The list of server accounts.
*/
fun setupServerAccountList(serverAccountList: List<Account>)
fun closeServerSelection()
fun showProgress()
fun hideProgress()
}
\ No newline at end of file
package chat.rocket.android.main.ui package chat.rocket.android.main.ui
import DrawableHelper
import android.app.Activity import android.app.Activity
import androidx.appcompat.app.AlertDialog import android.app.NotificationManager
import android.app.ProgressDialog import android.content.Context
import android.os.Bundle import android.os.Bundle
import androidx.annotation.IdRes
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import chat.rocket.android.BuildConfig
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatrooms.ui.ChatRoomsFragment
import chat.rocket.android.main.adapter.AccountsAdapter
import chat.rocket.android.main.adapter.Selector
import chat.rocket.android.main.presentation.MainPresenter import chat.rocket.android.main.presentation.MainPresenter
import chat.rocket.android.main.presentation.MainView
import chat.rocket.android.main.uimodel.NavHeaderUiModel
import chat.rocket.android.push.refreshPushToken import chat.rocket.android.push.refreshPushToken
import chat.rocket.android.server.domain.PermissionsInteractor
import chat.rocket.android.server.domain.model.Account
import chat.rocket.android.server.ui.INTENT_CHAT_ROOM_ID import chat.rocket.android.server.ui.INTENT_CHAT_ROOM_ID
import chat.rocket.android.util.extensions.fadeIn
import chat.rocket.android.util.extensions.fadeOut
import chat.rocket.android.util.extensions.rotateBy
import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.util.invalidateFirebaseToken
import chat.rocket.common.model.UserStatus
import dagger.android.AndroidInjection import dagger.android.AndroidInjection
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector import dagger.android.DispatchingAndroidInjector
import dagger.android.HasActivityInjector import dagger.android.HasActivityInjector
import dagger.android.support.HasSupportFragmentInjector import dagger.android.support.HasSupportFragmentInjector
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.app_bar.*
import kotlinx.android.synthetic.main.nav_header.view.*
import javax.inject.Inject import javax.inject.Inject
import android.app.NotificationManager
import android.content.Context
private const val CURRENT_STATE = "current_state" class MainActivity : AppCompatActivity(), HasActivityInjector,
class MainActivity : AppCompatActivity(), MainView, HasActivityInjector,
HasSupportFragmentInjector { HasSupportFragmentInjector {
@Inject @Inject
lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity> lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
@Inject @Inject
lateinit var fragmentDispatchingAndroidInjector: DispatchingAndroidInjector<Fragment> lateinit var fagmentDispatchingAndroidInjector: DispatchingAndroidInjector<Fragment>
@Inject @Inject
lateinit var presenter: MainPresenter lateinit var presenter: MainPresenter
@Inject
lateinit var permissions: PermissionsInteractor
private var isFragmentAdded: Boolean = false
private var expanded = false
private val headerLayout by lazy { view_navigation.getHeaderView(0) }
private var chatRoomId: String? = null
private var progressDialog: ProgressDialog? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this) AndroidInjection.inject(this)
...@@ -66,217 +32,27 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector, ...@@ -66,217 +32,27 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector,
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
refreshPushToken() refreshPushToken()
chatRoomId = intent.getStringExtra(INTENT_CHAT_ROOM_ID)
presenter.clearNotificationsForChatroom(chatRoomId)
presenter.connect()
presenter.loadServerAccounts()
presenter.loadCurrentInfo()
presenter.loadEmojis()
setupToolbar()
setupNavigationView()
}
override fun onSaveInstanceState(outState: Bundle?) { with(presenter) {
super.onSaveInstanceState(outState) connect()
outState?.putBoolean(CURRENT_STATE, isFragmentAdded) intent.getStringExtra(INTENT_CHAT_ROOM_ID).let {
} clearNotificationsForChatRoom(it)
showChatList(it)
override fun onRestoreInstanceState(savedInstanceState: Bundle?) { }
super.onRestoreInstanceState(savedInstanceState) }
isFragmentAdded = savedInstanceState?.getBoolean(CURRENT_STATE) ?: false
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if (!isFragmentAdded) { clearAppNotifications()
presenter.toChatList(chatRoomId)
isFragmentAdded = true
}
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)
as NotificationManager
notificationManager.cancelAll()
}
override fun onDestroy() {
super.onDestroy()
if (isFinishing) {
presenter.disconnect()
}
}
override fun onBackPressed() {
if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
closeDrawer()
} else {
supportFragmentManager.findFragmentById(R.id.fragment_container)?.let {
if (it !is ChatRoomsFragment && supportFragmentManager.backStackEntryCount == 0) {
presenter.toChatList(chatRoomId)
setCheckedNavDrawerItem(R.id.menu_action_chats)
} else {
super.onBackPressed()
}
}
}
} }
override fun activityInjector(): AndroidInjector<Activity> = activityDispatchingAndroidInjector override fun activityInjector(): AndroidInjector<Activity> =
activityDispatchingAndroidInjector
override fun supportFragmentInjector(): AndroidInjector<Fragment> = override fun supportFragmentInjector(): AndroidInjector<Fragment> =
fragmentDispatchingAndroidInjector fagmentDispatchingAndroidInjector
override fun showUserStatus(userStatus: UserStatus) {
headerLayout.apply {
image_user_status.setImageDrawable(
DrawableHelper.getUserStatusDrawable(userStatus, this.context)
)
}
}
override fun setupUserAccountInfo(uiModel: NavHeaderUiModel) {
with(headerLayout) {
with(uiModel) {
if (userStatus != null) {
image_user_status.setImageDrawable(
DrawableHelper.getUserStatusDrawable(userStatus, context)
)
}
if (userDisplayName != null) {
text_user_name.text = userDisplayName
}
if (userAvatar != null) {
setAvatar(userAvatar)
}
if (serverLogo != null) {
server_logo.setImageURI(serverLogo)
}
text_server_url.text = uiModel.serverUrl
}
}
}
override fun setupServerAccountList(serverAccountList: List<Account>) { private fun clearAppNotifications() =
accounts_list.layoutManager = LinearLayoutManager(this) (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).cancelAll()
accounts_list.adapter = AccountsAdapter(serverAccountList, object : Selector {
override fun onStatusSelected(userStatus: UserStatus) {
presenter.changeDefaultStatus(userStatus)
}
override fun onAccountSelected(serverUrl: String) {
presenter.changeServer(serverUrl)
}
override fun onAddedAccountSelected() {
presenter.addNewServer()
}
})
headerLayout.account_container.setOnClickListener {
it.image_account_expand.rotateBy(180f)
if (expanded) {
accounts_list.fadeOut()
} else {
accounts_list.fadeIn()
}
expanded = !expanded
}
headerLayout.image_avatar.setOnClickListener {
view_navigation.menu.findItem(R.id.menu_action_profile).isChecked = true
presenter.toUserProfile()
drawer_layout.closeDrawer(GravityCompat.START)
}
}
override fun closeServerSelection() {
view_navigation.getHeaderView(0).account_container.performClick()
}
override fun alertNotRecommendedVersion() {
AlertDialog.Builder(this)
.setMessage(
getString(
R.string.msg_ver_not_recommended,
BuildConfig.RECOMMENDED_SERVER_VERSION
)
)
.setPositiveButton(android.R.string.ok, null)
.create()
.show()
}
override fun blockAndAlertNotRequiredVersion() {
AlertDialog.Builder(this)
.setMessage(
getString(
R.string.msg_ver_not_minimum,
BuildConfig.REQUIRED_SERVER_VERSION
)
)
.setOnDismissListener { presenter.logout() }
.setPositiveButton(android.R.string.ok, null)
.create()
.show()
}
override fun invalidateToken(token: String) = invalidateFirebaseToken(token)
override fun showMessage(resId: Int) = showToast(resId)
override fun showMessage(message: String) = showToast(message)
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
private fun setupToolbar() {
setSupportActionBar(toolbar)
}
fun setupNavigationView() {
with (view_navigation.menu) {
clear()
setupMenu(this)
}
view_navigation.setNavigationItemSelectedListener {
it.isChecked = true
closeDrawer()
onNavDrawerItemSelected(it)
true
}
toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp)
toolbar.setNavigationOnClickListener { openDrawer() }
}
fun showLogoutDialog() {
val builder = AlertDialog.Builder(this)
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) {
headerLayout.image_avatar.setImageURI(avatarUrl)
}
fun getDrawerLayout(): DrawerLayout = drawer_layout
fun openDrawer() = drawer_layout.openDrawer(GravityCompat.START)
fun closeDrawer() = drawer_layout.closeDrawer(GravityCompat.START)
fun setCheckedNavDrawerItem(@IdRes item: Int) = view_navigation.setCheckedItem(item)
override fun showProgress() {
progressDialog = ProgressDialog.show(this, getString(R.string.app_name), getString(R.string.msg_log_out), true, false)
}
override fun hideProgress() {
progressDialog?.dismiss()
progressDialog = null
}
} }
package chat.rocket.android.main.ui
import android.view.Menu
import android.view.MenuItem
import chat.rocket.android.R
internal fun MainActivity.setupMenu(menu: Menu) {
with(menu) {
add(
R.id.menu_section_one,
R.id.menu_action_chats,
Menu.NONE,
R.string.title_chats
).setIcon(R.drawable.ic_chat_bubble_black_24dp)
.isChecked = true
add(
R.id.menu_section_one,
R.id.menu_action_create_channel,
Menu.NONE,
R.string.action_create_channel
).setIcon(R.drawable.ic_create_black_24dp)
add(
R.id.menu_section_two,
R.id.menu_action_profile,
Menu.NONE,
R.string.title_profile
).setIcon(R.drawable.ic_person_black_20dp)
add(
R.id.menu_section_two,
R.id.menu_action_settings,
Menu.NONE,
R.string.title_settings
).setIcon(R.drawable.ic_settings_black_24dp)
if (permissions.canSeeTheAdminPanel()) {
add(
R.id.menu_section_two,
R.id.menu_action_admin_panel,
Menu.NONE,
R.string.title_admin_panel
).setIcon(R.drawable.ic_settings_black_24dp)
}
add(
R.id.menu_section_three,
R.id.menu_action_logout,
Menu.NONE,
R.string.action_logout
).setIcon(R.drawable.ic_logout_black_24dp)
setGroupCheckable(R.id.menu_section_one, true, true)
setGroupCheckable(R.id.menu_section_two, true, true)
setGroupCheckable(R.id.menu_section_three, true, true)
}
}
internal fun MainActivity.onNavDrawerItemSelected(menuItem: MenuItem) {
when (menuItem.itemId) {
R.id.menu_action_chats-> presenter.toChatList()
R.id.menu_action_create_channel -> presenter.toCreateChannel()
R.id.menu_action_profile -> presenter.toUserProfile()
R.id.menu_action_settings -> presenter.toSettings()
R.id.menu_action_admin_panel -> presenter.toAdminPanel()
R.id.menu_action_logout -> showLogoutDialog()
}
}
package chat.rocket.android.main.uimodel
import chat.rocket.common.model.UserStatus
data class NavHeaderUiModel(
val userDisplayName: String?,
val userStatus: UserStatus?,
val userAvatar: String?,
val serverUrl: String,
val serverLogo: String?
)
\ No newline at end of file
package chat.rocket.android.main.uimodel
import chat.rocket.android.server.domain.*
import chat.rocket.android.util.extensions.avatarUrl
import chat.rocket.android.util.extensions.serverLogoUrl
import chat.rocket.core.model.Myself
import javax.inject.Inject
class NavHeaderUiModelMapper @Inject constructor(
serverInteractor: GetCurrentServerInteractor,
getSettingsInteractor: GetSettingsInteractor
) {
private val currentServer = serverInteractor.get()!!
private var settings: PublicSettings = getSettingsInteractor.get(currentServer)
fun mapToUiModel(me: Myself): NavHeaderUiModel {
val displayName = mapDisplayName(me)
val status = me.status
val avatar = me.username?.let { currentServer.avatarUrl(it) }
val image = settings.wideTile() ?: settings.faviconLarge()
val logo = image?.let { currentServer.serverLogoUrl(it) }
return NavHeaderUiModel(displayName, status, avatar, currentServer, logo)
}
private fun mapDisplayName(me: Myself): String? {
val username = me.username
val realName = me.name
val senderName = if (settings.useRealName()) realName else username
return senderName ?: username
}
}
\ No newline at end of file
...@@ -27,7 +27,7 @@ class MembersPresenter @Inject constructor( ...@@ -27,7 +27,7 @@ class MembersPresenter @Inject constructor(
val factory: RocketChatClientFactory, val factory: RocketChatClientFactory,
private val userHelper: UserHelper private val userHelper: UserHelper
) { ) {
private val client: RocketChatClient = factory.create(currentServer) private val client: RocketChatClient = factory.get(currentServer)
private var offset: Long = 0 private var offset: Long = 0
/** /**
......
...@@ -18,7 +18,7 @@ class MentionsPresenter @Inject constructor( ...@@ -18,7 +18,7 @@ class MentionsPresenter @Inject constructor(
private val mapper: UiModelMapper, private val mapper: UiModelMapper,
val factory: RocketChatClientFactory val factory: RocketChatClientFactory
) { ) {
private val client = factory.create(currentServer) private val client = factory.get(currentServer)
private var offset: Long = 0 private var offset: Long = 0
/** /**
......
...@@ -5,7 +5,6 @@ import chat.rocket.android.core.lifecycle.CancelStrategy ...@@ -5,7 +5,6 @@ import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.db.DatabaseManager import chat.rocket.android.db.DatabaseManager
import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.retryDB
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
import chat.rocket.common.model.roomTypeOf import chat.rocket.common.model.roomTypeOf
import chat.rocket.common.util.ifNull import chat.rocket.common.util.ifNull
...@@ -23,7 +22,7 @@ class PinnedMessagesPresenter @Inject constructor( ...@@ -23,7 +22,7 @@ class PinnedMessagesPresenter @Inject constructor(
private val mapper: UiModelMapper, private val mapper: UiModelMapper,
val factory: RocketChatClientFactory val factory: RocketChatClientFactory
) { ) {
private val client: RocketChatClient = factory.create(currentServer) private val client: RocketChatClient = factory.get(currentServer)
private var offset: Int = 0 private var offset: Int = 0
/** /**
......
package chat.rocket.android.preferences.presentation
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import javax.inject.Inject
class PreferencesPresenter @Inject constructor(
private val view: PreferencesView,
private val analyticsTrackingInteractor: AnalyticsTrackingInteractor
) {
fun loadAnalyticsTrackingInformation() {
view.setupAnalyticsTrackingView(analyticsTrackingInteractor.get())
}
fun enableAnalyticsTracking() {
analyticsTrackingInteractor.save(true)
}
fun disableAnalyticsTracking() {
analyticsTrackingInteractor.save(false)
}
}
\ No newline at end of file
package chat.rocket.android.preferences.presentation
interface PreferencesView {
/**
* Setups the analytics tracking view.
*
* @param isAnalyticsTrackingEnabled Whether the analytics tracking is enabled
*/
fun setupAnalyticsTrackingView(isAnalyticsTrackingEnabled: Boolean)
}
\ No newline at end of file
package chat.rocket.android.preferences.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import chat.rocket.android.BuildConfig
import chat.rocket.android.R
import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.main.ui.MainActivity
import chat.rocket.android.preferences.presentation.PreferencesPresenter
import chat.rocket.android.preferences.presentation.PreferencesView
import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.app_bar.*
import kotlinx.android.synthetic.main.fragment_preferences.*
import javax.inject.Inject
internal const val TAG_PREFERENCES_FRAGMENT = "PreferencesFragment"
class PreferencesFragment : Fragment(), PreferencesView {
@Inject
lateinit var presenter: PreferencesPresenter
@Inject
lateinit var analyticsManager: AnalyticsManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AndroidSupportInjection.inject(this)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_preferences, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupListeners()
presenter.loadAnalyticsTrackingInformation()
analyticsManager.logScreenView(ScreenViewEvent.Preferences)
}
override fun onResume() {
setupToolbar()
super.onResume()
}
override fun setupAnalyticsTrackingView(isAnalyticsTrackingEnabled: Boolean) {
if (BuildConfig.FLAVOR == "foss") {
switch_analytics_tracking.isChecked = false
switch_analytics_tracking.isEnabled = false
text_analytics_tracking_description.text =
getString(R.string.msg_not_applicable_since_it_is_a_foss_version)
return
}
if (isAnalyticsTrackingEnabled) {
text_analytics_tracking_description.text =
getString(R.string.msg_send_analytics_tracking)
} else {
text_analytics_tracking_description.text =
getString(R.string.msg_do_not_send_analytics_tracking)
}
switch_analytics_tracking.isChecked = isAnalyticsTrackingEnabled
}
private fun setupToolbar() {
with((activity as MainActivity).toolbar) {
title = getString(R.string.title_preferences)
setNavigationIcon(R.drawable.ic_arrow_back_white_24dp)
setNavigationOnClickListener { activity?.onBackPressed() }
}
}
private fun setupListeners() {
switch_analytics_tracking.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
text_analytics_tracking_description.text =
getString(R.string.msg_send_analytics_tracking)
presenter.enableAnalyticsTracking()
} else {
text_analytics_tracking_description.text =
getString(R.string.msg_do_not_send_analytics_tracking)
presenter.disableAnalyticsTracking()
}
}
}
companion object {
fun newInstance() = PreferencesFragment()
}
}
...@@ -15,20 +15,19 @@ import chat.rocket.android.server.infraestructure.ConnectionManagerFactory ...@@ -15,20 +15,19 @@ import chat.rocket.android.server.infraestructure.ConnectionManagerFactory
import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import chat.rocket.android.server.presentation.CheckServerPresenter import chat.rocket.android.server.presentation.CheckServerPresenter
import chat.rocket.android.util.extension.compressImageAndGetByteArray 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.launchUI
import chat.rocket.android.util.extension.toHex
import chat.rocket.android.util.extensions.avatarUrl import chat.rocket.android.util.extensions.avatarUrl
import chat.rocket.android.util.retryIO import chat.rocket.android.util.retryIO
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
import chat.rocket.common.model.UserStatus
import chat.rocket.common.model.userStatusOf
import chat.rocket.common.util.ifNull import chat.rocket.common.util.ifNull
import chat.rocket.core.RocketChatClient import chat.rocket.core.RocketChatClient
import chat.rocket.core.internal.rest.deleteOwnAccount import chat.rocket.core.internal.realtime.setDefaultStatus
import chat.rocket.core.internal.rest.me
import chat.rocket.core.internal.rest.resetAvatar import chat.rocket.core.internal.rest.resetAvatar
import chat.rocket.core.internal.rest.setAvatar import chat.rocket.core.internal.rest.setAvatar
import chat.rocket.core.internal.rest.updateProfile import chat.rocket.core.internal.rest.updateProfile
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
...@@ -56,18 +55,23 @@ class ProfilePresenter @Inject constructor( ...@@ -56,18 +55,23 @@ class ProfilePresenter @Inject constructor(
navigator = navigator navigator = navigator
) { ) {
private val serverUrl = serverInteractor.get()!! private val serverUrl = serverInteractor.get()!!
private val client: RocketChatClient = factory.create(serverUrl) private val client: RocketChatClient = factory.get(serverUrl)
private val user = userHelper.user() private val user = userHelper.user()
fun loadUserProfile() { fun loadUserProfile() {
launchUI(strategy) { launchUI(strategy) {
view.showLoading() view.showLoading()
try { try {
val me = retryIO(description = "serverInfo", times = 5) {
client.me()
}
view.showProfile( view.showProfile(
serverUrl.avatarUrl(user?.username ?: ""), me.status.toString(),
user?.name ?: "", serverUrl.avatarUrl(me.username ?: ""),
user?.username ?: "", me.name ?: "",
user?.emails?.getOrNull(0)?.address ?: "" me.username ?: "",
me.emails?.getOrNull(0)?.address ?: ""
) )
} catch (exception: RocketChatException) { } catch (exception: RocketChatException) {
view.showMessage(exception) view.showMessage(exception)
...@@ -82,9 +86,17 @@ class ProfilePresenter @Inject constructor( ...@@ -82,9 +86,17 @@ class ProfilePresenter @Inject constructor(
view.showLoading() view.showLoading()
try { try {
user?.id?.let { id -> user?.id?.let { id ->
retryIO { client.updateProfile(userId = id, email = email, name = name, username = username) } retryIO {
client.updateProfile(
userId = id,
email = email,
name = name,
username = username
)
}
view.showProfileUpdateSuccessfullyMessage() view.showProfileUpdateSuccessfullyMessage()
view.showProfile( view.showProfile(
user.status.toString(),
serverUrl.avatarUrl(user.username ?: ""), serverUrl.avatarUrl(user.username ?: ""),
name, name,
username, username,
...@@ -176,26 +188,17 @@ class ProfilePresenter @Inject constructor( ...@@ -176,26 +188,17 @@ class ProfilePresenter @Inject constructor(
} }
} }
fun deleteAccount(password: String) { fun updateStatus(status: UserStatus) {
launchUI(strategy) { launchUI(strategy) {
view.showLoading()
try { try {
withContext(Dispatchers.Default) { client.setDefaultStatus(status)
// REMARK: Backend API is only working with a lowercase hash. } catch (exception: RocketChatException) {
// 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 { exception.message?.let {
view.showMessage(it) view.showMessage(it)
}.ifNull { }.ifNull {
view.showGenericErrorMessage() view.showGenericErrorMessage()
} }
} finally {
view.hideLoading()
} }
} }
} }
} }
\ No newline at end of file
...@@ -9,12 +9,19 @@ interface ProfileView : TokenView, LoadingView, MessageView { ...@@ -9,12 +9,19 @@ interface ProfileView : TokenView, LoadingView, MessageView {
/** /**
* Shows the user profile. * Shows the user profile.
* *
* @param status The user status.
* @param avatarUrl The user avatar URL. * @param avatarUrl The user avatar URL.
* @param name The user display name. * @param name The user display name.
* @param username The user username. * @param username The user username.
* @param email The user email. * @param email The user email.
*/ */
fun showProfile(avatarUrl: String, name: String, username: String, email: String?) fun showProfile(
status: String,
avatarUrl: String,
name: String,
username: String,
email: String?
)
/** /**
* Reloads the user avatar (after successfully updating it). * Reloads the user avatar (after successfully updating it).
......
...@@ -2,7 +2,6 @@ package chat.rocket.android.profile.ui ...@@ -2,7 +2,6 @@ package chat.rocket.android.profile.ui
import DrawableHelper import DrawableHelper
import android.app.Activity import android.app.Activity
import androidx.appcompat.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap import android.graphics.Bitmap
import android.os.Build import android.os.Build
...@@ -12,8 +11,8 @@ import android.view.Menu ...@@ -12,8 +11,8 @@ import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.MenuInflater import android.widget.RadioGroup
import android.widget.EditText import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import androidx.core.net.toUri import androidx.core.net.toUri
...@@ -33,10 +32,13 @@ import chat.rocket.android.util.extensions.showToast ...@@ -33,10 +32,13 @@ import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.util.extensions.textContent import chat.rocket.android.util.extensions.textContent
import chat.rocket.android.util.extensions.ui import chat.rocket.android.util.extensions.ui
import chat.rocket.android.util.invalidateFirebaseToken import chat.rocket.android.util.invalidateFirebaseToken
import chat.rocket.common.model.UserStatus
import chat.rocket.common.model.userStatusOf
import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.drawee.backends.pipeline.Fresco
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.Observables import io.reactivex.rxkotlin.Observables
import kotlinx.android.synthetic.main.app_bar.*
import kotlinx.android.synthetic.main.avatar_profile.* import kotlinx.android.synthetic.main.avatar_profile.*
import kotlinx.android.synthetic.main.fragment_profile.* import kotlinx.android.synthetic.main.fragment_profile.*
import kotlinx.android.synthetic.main.update_avatar_options.* import kotlinx.android.synthetic.main.update_avatar_options.*
...@@ -47,24 +49,21 @@ internal const val TAG_PROFILE_FRAGMENT = "ProfileFragment" ...@@ -47,24 +49,21 @@ internal const val TAG_PROFILE_FRAGMENT = "ProfileFragment"
private const val REQUEST_CODE_FOR_PERFORM_SAF = 1 private const val REQUEST_CODE_FOR_PERFORM_SAF = 1
private const val REQUEST_CODE_FOR_PERFORM_CAMERA = 2 private const val REQUEST_CODE_FOR_PERFORM_CAMERA = 2
fun newInstance() = ProfileFragment()
class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
@Inject @Inject lateinit var presenter: ProfilePresenter
lateinit var presenter: ProfilePresenter @Inject lateinit var analyticsManager: AnalyticsManager
@Inject private var currentStatus = ""
lateinit var analyticsManager: AnalyticsManager
private var currentName = "" private var currentName = ""
private var currentUsername = "" private var currentUsername = ""
private var currentEmail = "" private var currentEmail = ""
private var actionMode: ActionMode? = null private var actionMode: ActionMode? = null
private val editTextsDisposable = CompositeDisposable() private val editTextsDisposable = CompositeDisposable()
companion object {
fun newInstance() = ProfileFragment()
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
AndroidSupportInjection.inject(this)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
AndroidSupportInjection.inject(this)
setHasOptionsMenu(true) setHasOptionsMenu(true)
} }
...@@ -78,11 +77,12 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -78,11 +77,12 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupToolbar() setupToolbar()
setupListeners()
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
tintEditTextDrawableStart() tintEditTextDrawableStart()
} }
presenter.loadUserProfile() presenter.loadUserProfile()
setupListeners()
subscribeEditTexts() subscribeEditTexts()
analyticsManager.logScreenView(ScreenViewEvent.Profile) analyticsManager.logScreenView(ScreenViewEvent.Profile)
...@@ -112,25 +112,21 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -112,25 +112,21 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
super.onPrepareOptionsMenu(menu) super.onPrepareOptionsMenu(menu)
} }
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { override fun showProfile(
super.onCreateOptionsMenu(menu, inflater) status: String,
inflater.inflate(R.menu.profile, menu) avatarUrl: String,
} name: String,
username: String,
override fun onOptionsItemSelected(item: MenuItem): Boolean { email: String?
when (item.itemId) { ) {
R.id.action_delete_account -> showDeleteAccountDialog()
}
return true
}
override fun showProfile(avatarUrl: String, name: String, username: String, email: String?) {
ui { ui {
text_status.text = getString(R.string.status, status.capitalize())
image_avatar.setImageURI(avatarUrl) image_avatar.setImageURI(avatarUrl)
text_name.textContent = name text_name.textContent = name
text_username.textContent = username text_username.textContent = username
text_email.textContent = email ?: "" text_email.textContent = email ?: ""
currentStatus = status
currentName = name currentName = name
currentUsername = username currentUsername = username
currentEmail = email ?: "" currentEmail = email ?: ""
...@@ -142,7 +138,6 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -142,7 +138,6 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
override fun reloadUserAvatar(avatarUrl: String) { override fun reloadUserAvatar(avatarUrl: String) {
Fresco.getImagePipeline().evictFromCache(avatarUrl.toUri()) Fresco.getImagePipeline().evictFromCache(avatarUrl.toUri())
image_avatar.setImageURI(avatarUrl) image_avatar.setImageURI(avatarUrl)
(activity as MainActivity).setAvatar(avatarUrl)
} }
override fun showProfileUpdateSuccessfullyMessage() { override fun showProfileUpdateSuccessfullyMessage() {
...@@ -205,10 +200,19 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -205,10 +200,19 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
} }
private fun setupToolbar() { private fun setupToolbar() {
(activity as AppCompatActivity?)?.supportActionBar?.title = getString(R.string.title_profile) with((activity as AppCompatActivity)) {
with(toolbar) {
setSupportActionBar(this)
title = getString(R.string.title_profile)
setNavigationIcon(R.drawable.ic_arrow_back_white_24dp)
setNavigationOnClickListener { activity?.onBackPressed() }
}
}
} }
private fun setupListeners() { private fun setupListeners() {
text_status.setOnClickListener { showStatusDialog(currentStatus) }
image_avatar.setOnClickListener { showUpdateAvatarOptions() } image_avatar.setOnClickListener { showUpdateAvatarOptions() }
view_dim.setOnClickListener { hideUpdateAvatarOptions() } view_dim.setOnClickListener { hideUpdateAvatarOptions() }
...@@ -293,15 +297,38 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -293,15 +297,38 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
} }
} }
fun showDeleteAccountDialog() { private fun showStatusDialog(currentStatus: String) {
context?.let { val dialogLayout = layoutInflater.inflate(R.layout.dialog_status, null)
val passwordEText = EditText(context); val radioGroup = dialogLayout.findViewById<RadioGroup>(R.id.radio_group_status)
val mDialogView = LayoutInflater.from(it).inflate(R.layout.item_account_delete, null)
val mBuilder = AlertDialog.Builder(it) radioGroup.check(
when (userStatusOf(currentStatus)) {
is UserStatus.Online -> R.id.radio_button_online
is UserStatus.Away -> R.id.radio_button_away
is UserStatus.Busy -> R.id.radio_button_busy
else -> R.id.radio_button_invisible
}
)
var newStatus: UserStatus = userStatusOf(currentStatus)
radioGroup.setOnCheckedChangeListener { _, checkId ->
when (checkId) {
R.id.radio_button_online -> newStatus = UserStatus.Online()
R.id.radio_button_away -> newStatus = UserStatus.Away()
R.id.radio_button_busy -> newStatus = UserStatus.Busy()
else -> newStatus = UserStatus.Offline()
}
}
mBuilder.setView(mDialogView).setPositiveButton(R.string.action_delete_account) { _, _ -> context?.let {
presenter.deleteAccount(passwordEText.text.toString()) AlertDialog.Builder(it)
}.setNegativeButton(android.R.string.no) { dialog, _ -> dialog.cancel() }.create().show() .setView(dialogLayout)
.setPositiveButton(R.string.msg_change_status) { dialog, _ ->
presenter.updateStatus(newStatus)
text_status.text = getString(R.string.status, newStatus.toString().capitalize())
this.currentStatus = newStatus.toString()
dialog.dismiss()
}.show()
} }
} }
} }
...@@ -69,7 +69,7 @@ class PermissionsInteractor @Inject constructor( ...@@ -69,7 +69,7 @@ class PermissionsInteractor @Inject constructor(
} }
fun canSeeTheAdminPanel(): Boolean { fun isAdministrationEnabled(): Boolean {
currentServerUrl()?.let { serverUrl -> currentServerUrl()?.let { serverUrl ->
val viewStatistics = val viewStatistics =
permissionsRepository.get(serverUrl, VIEW_STATISTICS) permissionsRepository.get(serverUrl, VIEW_STATISTICS)
......
...@@ -20,7 +20,7 @@ class RefreshPermissionsInteractor @Inject constructor( ...@@ -20,7 +20,7 @@ class RefreshPermissionsInteractor @Inject constructor(
fun refreshAsync(server: String) { fun refreshAsync(server: String) {
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
try { try {
factory.create(server).let { client -> factory.get(server).let { client ->
val permissions = retryIO( val permissions = retryIO(
description = "permissions", description = "permissions",
times = 5, times = 5,
......
...@@ -74,7 +74,7 @@ class RefreshSettingsInteractor @Inject constructor( ...@@ -74,7 +74,7 @@ class RefreshSettingsInteractor @Inject constructor(
suspend fun refresh(server: String) { suspend fun refresh(server: String) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
factory.create(server).let { client -> factory.get(server).let { client ->
val settings = retryIO( val settings = retryIO(
description = "settings", description = "settings",
times = 5, times = 5,
......
package chat.rocket.android.server.domain
import javax.inject.Inject
class SortingAndGroupingInteractor @Inject constructor(val repository: SortingAndGroupingRepository) {
fun save(
currentServerUrl: String,
isSortByName: Boolean,
isUnreadOnTop: Boolean,
isGroupByType: Boolean,
isGroupByFavorites: Boolean
) = repository.save(
currentServerUrl,
isSortByName,
isUnreadOnTop,
isGroupByType,
isGroupByFavorites
)
fun getSortByName(currentServerUrl: String): Boolean =
repository.getSortByName(currentServerUrl)
fun getUnreadOnTop(currentServerUrl: String): Boolean =
repository.getUnreadOnTop(currentServerUrl)
fun getGroupByType(currentServerUrl: String): Boolean =
repository.getGroupByType(currentServerUrl)
fun getGroupByFavorites(currentServerUrl: String): Boolean =
repository.getGroupByFavorites(currentServerUrl)
}
\ No newline at end of file
package chat.rocket.android.server.domain
interface SortingAndGroupingRepository {
fun save(
currentServerUrl: String,
isSortByName: Boolean,
isUnreadOnTop: Boolean,
isGroupByType: Boolean,
isGroupByFavorites: Boolean
)
fun getSortByName(currentServerUrl: String): Boolean
fun getUnreadOnTop(currentServerUrl: String): Boolean
fun getGroupByType(currentServerUrl: String): Boolean
fun getGroupByFavorites(currentServerUrl: String): Boolean
}
\ No newline at end of file
package chat.rocket.android.server.infraestructure package chat.rocket.android.server.infraestructure
import chat.rocket.android.db.DatabaseManagerFactory import chat.rocket.android.db.DatabaseManagerFactory
import chat.rocket.android.infrastructure.LocalRepository
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
...@@ -20,7 +19,7 @@ class ConnectionManagerFactory @Inject constructor( ...@@ -20,7 +19,7 @@ class ConnectionManagerFactory @Inject constructor(
} }
Timber.d("Returning FRESH Manager for: $url") Timber.d("Returning FRESH Manager for: $url")
val manager = ConnectionManager(factory.create(url), dbFactory.create(url)) val manager = ConnectionManager(factory.get(url), dbFactory.create(url))
cache[url] = manager cache[url] = manager
return manager return manager
} }
......
...@@ -18,7 +18,7 @@ class RocketChatClientFactory @Inject constructor( ...@@ -18,7 +18,7 @@ class RocketChatClientFactory @Inject constructor(
) { ) {
private val cache = HashMap<String, RocketChatClient>() private val cache = HashMap<String, RocketChatClient>()
fun create(url: String): RocketChatClient { fun get(url: String): RocketChatClient {
cache[url]?.let { cache[url]?.let {
Timber.d("Returning CACHED client for: $url") Timber.d("Returning CACHED client for: $url")
return it return it
......
package chat.rocket.android.server.infraestructure
import android.content.SharedPreferences
import chat.rocket.android.server.domain.SortingAndGroupingRepository
private const val SORT_BY_NAME_KEY = "SORT_BY_NAME_KEY"
private const val UNREAD_ON_TOP_KEY = "UNREAD_ON_TOP_KEY"
private const val GROUP_BY_TYPE_KEY = "GROUP_BY_TYPE_KEY"
private const val GROUP_BY_FAVORITES_KEY = "GROUP_BY_FAVORITES_KEY"
class SharedPrefsSortingAndGroupingRepository(private val preferences: SharedPreferences) :
SortingAndGroupingRepository {
override fun save(
currentServerUrl: String,
isSortByName: Boolean,
isUnreadOnTop: Boolean,
isGroupByType: Boolean,
isGroupByFavorites: Boolean
) {
preferences.edit().putBoolean(SORT_BY_NAME_KEY + currentServerUrl, isSortByName).apply()
preferences.edit().putBoolean(UNREAD_ON_TOP_KEY + currentServerUrl, isUnreadOnTop).apply()
preferences.edit().putBoolean(GROUP_BY_TYPE_KEY + currentServerUrl, isGroupByType).apply()
preferences.edit().putBoolean(GROUP_BY_FAVORITES_KEY + currentServerUrl, isGroupByFavorites)
.apply()
}
override fun getSortByName(currentServerUrl: String): Boolean =
preferences.getBoolean(SORT_BY_NAME_KEY + currentServerUrl, false)
override fun getUnreadOnTop(currentServerUrl: String): Boolean =
preferences.getBoolean(UNREAD_ON_TOP_KEY + currentServerUrl, false)
override fun getGroupByType(currentServerUrl: String): Boolean =
preferences.getBoolean(GROUP_BY_TYPE_KEY + currentServerUrl, false)
override fun getGroupByFavorites(currentServerUrl: String): Boolean =
preferences.getBoolean(GROUP_BY_FAVORITES_KEY + currentServerUrl, false)
}
\ No newline at end of file
...@@ -105,7 +105,7 @@ abstract class CheckServerPresenter constructor( ...@@ -105,7 +105,7 @@ abstract class CheckServerPresenter constructor(
internal fun setupConnectionInfo(serverUrl: String) { internal fun setupConnectionInfo(serverUrl: String) {
currentServer = serverUrl currentServer = serverUrl
client = factory.create(serverUrl) client = factory.get(serverUrl)
managerFactory?.create(serverUrl)?.let { managerFactory?.create(serverUrl)?.let {
manager = it manager = it
} }
......
package chat.rocket.android.main.adapter package chat.rocket.android.servers.adapter
import androidx.recyclerview.widget.RecyclerView
import android.view.View import android.view.View
import androidx.recyclerview.widget.RecyclerView
class AddAccountViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) class AddNewServerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
\ No newline at end of file \ No newline at end of file
package chat.rocket.android.main.adapter package chat.rocket.android.servers.adapter
import androidx.recyclerview.widget.RecyclerView
import android.view.View import android.view.View
import androidx.core.view.isInvisible
import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.server.domain.model.Account import chat.rocket.android.server.domain.model.Account
import kotlinx.android.synthetic.main.item_account.view.* import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.item_server.view.*
class AccountViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { class ServerViewHolder(itemView: View, private val currentServerUrl: String) :
RecyclerView.ViewHolder(itemView) {
fun bind(account: Account) { fun bind(account: Account) {
with(itemView) { with(itemView) {
server_logo.setImageURI(account.serverLogo) Glide.with(context).load(account.serverLogo).into(image_server)
text_server_name.text = account.serverUrl
text_server_url.text = account.serverUrl text_server_url.text = account.serverUrl
text_username.text = account.userName image_check.isInvisible = currentServerUrl != account.serverUrl
} }
} }
} }
\ No newline at end of file
package chat.rocket.android.main.adapter package chat.rocket.android.servers.adapter
import androidx.recyclerview.widget.RecyclerView
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.server.domain.model.Account import chat.rocket.android.server.domain.model.Account
import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.inflate
import chat.rocket.common.model.UserStatus
private const val VIEW_TYPE_CHANGE_STATUS = 0 private const val VIEW_TYPE_SERVER = 0
private const val VIEW_TYPE_ACCOUNT = 1 private const val VIEW_TYPE_ADD_NEW_SERVER = 1
private const val VIEW_TYPE_ADD_ACCOUNT = 2
class AccountsAdapter( class ServersAdapter(
private val accounts: List<Account>, private val servers: List<Account>,
private val currentServerUrl: String,
private val selector: Selector private val selector: Selector
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) { return when (viewType) {
VIEW_TYPE_CHANGE_STATUS -> StatusViewHolder(parent.inflate(R.layout.item_change_status)) VIEW_TYPE_SERVER -> ServerViewHolder(
VIEW_TYPE_ACCOUNT -> AccountViewHolder(parent.inflate(R.layout.item_account)) parent.inflate(R.layout.item_server), currentServerUrl
else -> AddAccountViewHolder(parent.inflate(R.layout.item_add_account)) )
else -> AddNewServerViewHolder(parent.inflate(R.layout.item_add_new_server))
} }
} }
override fun getItemCount() = accounts.size + 2 override fun getItemCount() = servers.size + 1
override fun getItemViewType(position: Int): Int { override fun getItemViewType(position: Int): Int {
return when { return when {
position == 0 -> VIEW_TYPE_CHANGE_STATUS position < servers.size -> VIEW_TYPE_SERVER
position <= accounts.size -> VIEW_TYPE_ACCOUNT else -> VIEW_TYPE_ADD_NEW_SERVER
else -> VIEW_TYPE_ADD_ACCOUNT
} }
} }
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) { when (holder) {
is StatusViewHolder -> bindStatusViewHolder(holder) is ServerViewHolder -> bindServerViewHolder(holder, position)
is AccountViewHolder -> bindAccountViewHolder(holder, position) is AddNewServerViewHolder -> bindAddNewServerViewHolder(holder)
is AddAccountViewHolder -> bindAddAccountViewHolder(holder)
} }
} }
private fun bindStatusViewHolder(holder: StatusViewHolder) {
holder.bind { userStatus -> selector.onStatusSelected(userStatus) }
}
private fun bindAccountViewHolder(holder: AccountViewHolder, position: Int) { private fun bindServerViewHolder(holder: ServerViewHolder, position: Int) {
val account = accounts[position - 1] val account = servers[position]
holder.bind(account) holder.bind(account)
holder.itemView.setOnClickListener { holder.itemView.setOnClickListener { selector.onServerSelected(account.serverUrl) }
selector.onAccountSelected(account.serverUrl)
}
} }
private fun bindAddAccountViewHolder(holder: AddAccountViewHolder) { private fun bindAddNewServerViewHolder(holder: AddNewServerViewHolder) {
holder.itemView.setOnClickListener { holder.itemView.setOnClickListener { selector.onAddNewServerSelected() }
selector.onAddedAccountSelected()
}
} }
} }
interface Selector { interface Selector {
fun onStatusSelected(userStatus: UserStatus) fun onServerSelected(serverUrl: String)
fun onAccountSelected(serverUrl: String) fun onAddNewServerSelected()
fun onAddedAccountSelected()
} }
\ No newline at end of file
package chat.rocket.android.preferences.di package chat.rocket.android.servers.di
import chat.rocket.android.dagger.scope.PerFragment import chat.rocket.android.dagger.scope.PerFragment
import chat.rocket.android.preferences.presentation.PreferencesView import chat.rocket.android.servers.presentation.ServersView
import chat.rocket.android.preferences.ui.PreferencesFragment import chat.rocket.android.servers.ui.ServersBottomSheetFragment
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
@Module @Module
class PreferencesFragmentModule { class ServersBottomSheetFragmentModule {
@Provides @Provides
@PerFragment @PerFragment
fun preferencesView(frag: PreferencesFragment): PreferencesView { fun serversView(frag: ServersBottomSheetFragment): ServersView = frag
return frag
}
} }
\ No newline at end of file
package chat.rocket.android.preferences.di package chat.rocket.android.servers.di
import chat.rocket.android.dagger.scope.PerFragment import chat.rocket.android.dagger.scope.PerFragment
import chat.rocket.android.preferences.ui.PreferencesFragment import chat.rocket.android.servers.ui.ServersBottomSheetFragment
import dagger.Module import dagger.Module
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector
@Module @Module
abstract class PreferencesFragmentProvider { abstract class ServersBottomSheetFragmentProvider {
@ContributesAndroidInjector(modules = [PreferencesFragmentModule::class]) @ContributesAndroidInjector(modules = [ServersBottomSheetFragmentModule::class])
@PerFragment @PerFragment
abstract fun providePreferencesFragment(): PreferencesFragment abstract fun provideServersBottomSheetFragment(): ServersBottomSheetFragment
} }
\ No newline at end of file
package chat.rocket.android.servers.presentation
import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.main.presentation.MainNavigator
import chat.rocket.android.server.domain.GetAccountsInteractor
import chat.rocket.android.util.extension.launchUI
import chat.rocket.common.util.ifNull
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Named
class ServersPresenter @Inject constructor(
private val view: ServersView,
private val navigator: MainNavigator,
private val strategy: CancelStrategy,
private val getAccountsInteractor: GetAccountsInteractor,
@Named("currentServer") private val currentServerUrl: String
) {
fun getAllServers() {
launchUI(strategy) {
try {
view.showServerList(getAccountsInteractor.get(), currentServerUrl)
} catch (exception: Exception) {
Timber.e(exception, "Error loading servers")
exception.message?.let {
view.showMessage(it)
}.ifNull {
view.showGenericErrorMessage()
}
}
}
}
fun changeServer(serverUrl: String) {
if (currentServerUrl != serverUrl) {
navigator.switchOrAddNewServer(serverUrl)
} else {
view.hideServerView()
}
}
fun addNewServer() {
view.hideServerView()
navigator.toServerScreen()
}
}
\ No newline at end of file
package chat.rocket.android.servers.presentation
import chat.rocket.android.core.behaviours.MessageView
import chat.rocket.android.server.domain.model.Account
interface ServersView : MessageView {
/**
* Shows the server list.
*
* @param serverList The list of server to show.
* @param currentServerUrl The current logged in server url.
*/
fun showServerList(serverList: List<Account>, currentServerUrl: String)
/**
* Hides the servers view.
*/
fun hideServerView()
}
\ No newline at end of file
package chat.rocket.android.servers.ui
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import chat.rocket.android.R
import chat.rocket.android.server.domain.model.Account
import chat.rocket.android.servers.adapter.Selector
import chat.rocket.android.servers.adapter.ServersAdapter
import chat.rocket.android.servers.presentation.ServersPresenter
import chat.rocket.android.servers.presentation.ServersView
import chat.rocket.android.util.extensions.showToast
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.bottom_sheet_fragment_servers.*
import javax.inject.Inject
const val TAG = "ServersBottomSheetFragment"
class ServersBottomSheetFragment : BottomSheetDialogFragment(), ServersView {
@Inject
lateinit var presenter: ServersPresenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AndroidSupportInjection.inject(this)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? =
inflater.inflate(R.layout.bottom_sheet_fragment_servers, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
presenter.getAllServers()
}
override fun showServerList(serverList: List<Account>, currentServerUrl: String) {
recycler_view.layoutManager = LinearLayoutManager(context)
recycler_view.adapter = ServersAdapter(serverList, currentServerUrl, object : Selector {
override fun onServerSelected(serverUrl: String) {
presenter.changeServer(serverUrl)
}
override fun onAddNewServerSelected() {
presenter.addNewServer()
}
})
}
override fun hideServerView() = dismiss()
override fun showMessage(resId: Int) {
showToast(resId)
}
override fun showMessage(message: String) {
showToast(message)
}
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
}
\ No newline at end of file
package chat.rocket.android.settings.di package chat.rocket.android.settings.di
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.dagger.scope.PerFragment import chat.rocket.android.dagger.scope.PerFragment
import chat.rocket.android.settings.presentation.SettingsView import chat.rocket.android.settings.presentation.SettingsView
import chat.rocket.android.settings.ui.SettingsFragment import chat.rocket.android.settings.ui.SettingsFragment
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import kotlinx.coroutines.Job
@Module @Module
class SettingsFragmentModule { class SettingsFragmentModule {
...@@ -20,13 +18,7 @@ class SettingsFragmentModule { ...@@ -20,13 +18,7 @@ class SettingsFragmentModule {
@Provides @Provides
@PerFragment @PerFragment
fun settingsLifecycleOwner(frag: SettingsFragment): LifecycleOwner { fun settingsLifecycleOwner(fragment: SettingsFragment): LifecycleOwner {
return frag return fragment
}
@Provides
@PerFragment
fun provideCancelStrategy(owner: LifecycleOwner, jobs: Job): CancelStrategy {
return CancelStrategy(owner, jobs)
} }
} }
\ No newline at end of file
package chat.rocket.android.settings.di package chat.rocket.android.settings.di
import chat.rocket.android.dagger.scope.PerFragment
import chat.rocket.android.settings.ui.SettingsFragment import chat.rocket.android.settings.ui.SettingsFragment
import dagger.Module import dagger.Module
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector
...@@ -8,5 +9,6 @@ import dagger.android.ContributesAndroidInjector ...@@ -8,5 +9,6 @@ import dagger.android.ContributesAndroidInjector
abstract class SettingsFragmentProvider { abstract class SettingsFragmentProvider {
@ContributesAndroidInjector(modules = [SettingsFragmentModule::class]) @ContributesAndroidInjector(modules = [SettingsFragmentModule::class])
@PerFragment
abstract fun provideSettingsFragment(): SettingsFragment abstract fun provideSettingsFragment(): SettingsFragment
} }
\ No newline at end of file
...@@ -8,7 +8,6 @@ import chat.rocket.android.server.infraestructure.RocketChatClientFactory ...@@ -8,7 +8,6 @@ import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.retryIO import chat.rocket.android.util.retryIO
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
import chat.rocket.common.util.ifNull
import chat.rocket.core.RocketChatClient import chat.rocket.core.RocketChatClient
import chat.rocket.core.internal.rest.updateProfile import chat.rocket.core.internal.rest.updateProfile
import javax.inject.Inject import javax.inject.Inject
...@@ -22,7 +21,7 @@ class PasswordPresenter @Inject constructor( ...@@ -22,7 +21,7 @@ class PasswordPresenter @Inject constructor(
factory: RocketChatClientFactory factory: RocketChatClientFactory
) { ) {
private val serverUrl = serverInteractor.get()!! private val serverUrl = serverInteractor.get()!!
private val client: RocketChatClient = factory.create(serverUrl) private val client: RocketChatClient = factory.get(serverUrl)
fun updatePassword(password: String) { fun updatePassword(password: String) {
launchUI(strategy) { launchUI(strategy) {
......
package chat.rocket.android.settings.presentation
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.AnalyticsTrackingInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.PermissionsInteractor
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.gethash
import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.extension.toHex
import chat.rocket.android.util.extensions.adminPanelUrl
import chat.rocket.android.util.extensions.avatarUrl
import chat.rocket.android.util.retryIO
import chat.rocket.common.util.ifNull
import chat.rocket.core.internal.rest.deleteOwnAccount
import chat.rocket.core.internal.rest.me
import chat.rocket.core.internal.rest.serverInfo
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Named
class SettingsPresenter @Inject constructor(
private val view: SettingsView,
private val strategy: CancelStrategy,
private val navigator: MainNavigator,
@Named("currentServer") private val currentServer: String,
private val userHelper: UserHelper,
private val analyticsTrackingInteractor: AnalyticsTrackingInteractor,
private val tokenRepository: TokenRepository,
private val permissions: PermissionsInteractor,
private val rocketChatClientFactory: RocketChatClientFactory,
getCurrentServerInteractor: GetCurrentServerInteractor,
removeAccountInteractor: RemoveAccountInteractor,
databaseManagerFactory: DatabaseManagerFactory,
connectionManagerFactory: ConnectionManagerFactory
) : CheckServerPresenter(
strategy = strategy,
factory = rocketChatClientFactory,
serverInteractor = getCurrentServerInteractor,
removeAccountInteractor = removeAccountInteractor,
tokenRepository = tokenRepository,
dbManagerFactory = databaseManagerFactory,
managerFactory = connectionManagerFactory,
tokenView = view,
navigator = navigator
) {
fun setupView() {
launchUI(strategy) {
try {
val serverInfo = retryIO(description = "serverInfo", times = 5) {
rocketChatClientFactory.get(currentServer).serverInfo()
}
val me = retryIO(description = "serverInfo", times = 5) {
rocketChatClientFactory.get(currentServer).me()
}
userHelper.user()?.let { user ->
view.setupSettingsView(
currentServer.avatarUrl(me.username ?: ""),
userHelper.displayName(user) ?: me.username ?: "",
me.status.toString(),
permissions.isAdministrationEnabled(),
analyticsTrackingInteractor.get(),
true,
serverInfo.version
)
}
} catch (exception: Exception) {
Timber.d(exception, "Error getting server info")
exception.message?.let {
view.showMessage(it)
}.ifNull {
view.showGenericErrorMessage()
}
}
}
}
fun enableAnalyticsTracking(isEnabled: Boolean) {
analyticsTrackingInteractor.save(isEnabled)
}
fun logout() {
setupConnectionInfo(currentServer)
super.logout(null) // TODO null?
}
fun deleteAccount(password: String) {
launchUI(strategy) {
view.showLoading()
try {
withContext(Dispatchers.Default) {
// REMARK: Backend API is only working with a lowercase hash.
// https://github.com/RocketChat/Rocket.Chat/issues/12573
retryIO {
rocketChatClientFactory.get(currentServer)
.deleteOwnAccount(password.gethash().toHex().toLowerCase())
}
setupConnectionInfo(currentServer)
logout(null)
}
} catch (exception: Exception) {
exception.message?.let {
view.showMessage(it)
}.ifNull {
view.showGenericErrorMessage()
}
} finally {
view.hideLoading()
}
}
}
fun toProfile() = navigator.toProfile()
fun toAdmin() = tokenRepository.get(currentServer)?.let {
navigator.toAdminPanel(currentServer.adminPanelUrl(), it.authToken)
}
fun toLicense(licenseUrl: String, licenseTitle: String) =
navigator.toLicense(licenseUrl, licenseTitle)
}
\ No newline at end of file
package chat.rocket.android.settings.presentation package chat.rocket.android.settings.presentation
interface SettingsView import chat.rocket.android.core.behaviours.LoadingView
import chat.rocket.android.core.behaviours.MessageView
import chat.rocket.android.server.presentation.TokenView
interface SettingsView : TokenView, LoadingView, MessageView {
/**
* Setups the settings view.
*
* @param avatar The user avatar.
* @param displayName The user display name.
* @param status The user status.
* @param isAdministrationEnabled True if the administration is enabled, false otherwise.
* @param isAnalyticsTrackingEnabled True if the analytics tracking is enabled, false otherwise.
* @param isDeleteAccountEnabled True if the delete account is enabled, false otherwise.
* @param serverVersion The version of the current logged in server.
*/
fun setupSettingsView(
avatar: String,
displayName: String,
status: String,
isAdministrationEnabled: Boolean,
isAnalyticsTrackingEnabled: Boolean,
isDeleteAccountEnabled: Boolean,
serverVersion: String
)
}
...@@ -7,35 +7,36 @@ import android.os.Bundle ...@@ -7,35 +7,36 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.AdapterView import android.widget.EditText
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import chat.rocket.android.BuildConfig
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.about.ui.AboutFragment
import chat.rocket.android.about.ui.TAG_ABOUT_FRAGMENT
import chat.rocket.android.analytics.AnalyticsManager import chat.rocket.android.analytics.AnalyticsManager
import chat.rocket.android.analytics.event.ScreenViewEvent import chat.rocket.android.analytics.event.ScreenViewEvent
import chat.rocket.android.helper.TextHelper.getDeviceAndAppInformation import chat.rocket.android.helper.TextHelper.getDeviceAndAppInformation
import chat.rocket.android.main.ui.MainActivity import chat.rocket.android.settings.presentation.SettingsPresenter
import chat.rocket.android.preferences.ui.PreferencesFragment
import chat.rocket.android.preferences.ui.TAG_PREFERENCES_FRAGMENT
import chat.rocket.android.settings.password.ui.PasswordActivity
import chat.rocket.android.settings.presentation.SettingsView import chat.rocket.android.settings.presentation.SettingsView
import chat.rocket.android.util.extensions.addFragmentBackStack
import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.extensions.showToast import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.webview.ui.webViewIntent import chat.rocket.android.util.invalidateFirebaseToken
import com.bumptech.glide.Glide
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.app_bar.*
import kotlinx.android.synthetic.main.fragment_settings.* import kotlinx.android.synthetic.main.fragment_settings.*
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_SETTINGS_FRAGMENT = "SettingsFragment" internal const val TAG_SETTINGS_FRAGMENT = "SettingsFragment"
class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListener { fun newInstance(): Fragment = SettingsFragment()
@Inject
lateinit var analyticsManager: AnalyticsManager class SettingsFragment : Fragment(), SettingsView {
@Inject lateinit var analyticsManager: AnalyticsManager
@Inject lateinit var presenter: SettingsPresenter
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
...@@ -51,79 +52,92 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen ...@@ -51,79 +52,92 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupToolbar() setupToolbar()
setupListView() presenter.setupView()
analyticsManager.logScreenView(ScreenViewEvent.Settings) analyticsManager.logScreenView(ScreenViewEvent.Settings)
} }
override fun onResume() { override fun setupSettingsView(
// FIXME - gambiarra ahead. will fix when moving to new androidx Navigation avatar: String,
(activity as? MainActivity)?.setupNavigationView() displayName: String,
super.onResume() status: String,
} isAdministrationEnabled: Boolean,
isAnalyticsTrackingEnabled: Boolean,
isDeleteAccountEnabled: Boolean,
serverVersion: String
) {
context?.let { Glide.with(it).load(avatar).into(image_avatar) }
override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { text_display_name.text = displayName
when (parent?.getItemAtPosition(position).toString()) {
resources.getStringArray(R.array.settings_actions)[0] -> { text_status.text = status
(activity as AppCompatActivity).addFragmentBackStack(
TAG_PREFERENCES_FRAGMENT,
R.id.fragment_container
) {
PreferencesFragment.newInstance()
}
}
resources.getStringArray(R.array.settings_actions)[1] -> profile_container.setOnClickListener { presenter.toProfile() }
activity?.startActivity(Intent(activity, PasswordActivity::class.java))
// TODO (https://github.com/RocketChat/Rocket.Chat.Android/pull/1918) text_contact_us.setOnClickListener { contactSupport() }
resources.getStringArray(R.array.settings_actions)[2] -> showToast("Coming soon")
resources.getStringArray(R.array.settings_actions)[3] -> shareApp() text_language.setOnClickListener {}
resources.getStringArray(R.array.settings_actions)[4] -> showAppOnStore() text_review_this_app.setOnClickListener { showAppOnStore() }
text_share_this_app.setOnClickListener { shareApp() }
text_license.setOnClickListener {
presenter.toLicense(getString(R.string.license_url), getString(R.string.title_licence))
}
resources.getStringArray(R.array.settings_actions)[5] -> contactSupport() text_app_version.text = getString(R.string.msg_app_version, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE)
resources.getStringArray(R.array.settings_actions)[6] -> activity?.startActivity( text_server_version.text = getString(R.string.msg_server_version, serverVersion)
context?.webViewIntent(
getString(R.string.license_url),
getString(R.string.title_licence)
)
)
resources.getStringArray(R.array.settings_actions)[7] -> { text_logout.setOnClickListener { showLogoutDialog()}
(activity as AppCompatActivity).addFragmentBackStack(
TAG_ABOUT_FRAGMENT, with(text_administration) {
R.id.fragment_container isVisible = isAdministrationEnabled
) { setOnClickListener { presenter.toAdmin() }
AboutFragment.newInstance() }
}
with(switch_crash_report) {
isChecked = isAnalyticsTrackingEnabled
isEnabled = BuildConfig.FLAVOR == "play"
setOnCheckedChangeListener { _, isChecked ->
presenter.enableAnalyticsTracking(isChecked)
} }
} }
}
private fun showAppOnStore() { with(text_delete_account) {
try { isVisible = isDeleteAccountEnabled
startActivity(Intent(Intent.ACTION_VIEW, getString(R.string.market_link).toUri())) setOnClickListener { showDeleteAccountDialog() }
} catch (error: ActivityNotFoundException) {
startActivity(Intent(Intent.ACTION_VIEW, getString(R.string.play_store_link).toUri()))
} }
} }
private fun setupListView() { override fun invalidateToken(token: String) = invalidateFirebaseToken(token)
settings_list.onItemClickListener = this
override fun showLoading() {
view_loading.isVisible = true
} }
private fun setupToolbar() { override fun hideLoading() {
(activity as AppCompatActivity?)?.supportActionBar?.title = getString(R.string.title_settings) view_loading.isVisible = false
} }
private fun shareApp() { override fun showMessage(resId: Int) {
with(Intent(Intent.ACTION_SEND)) { showToast(resId)
type = "text/plain" }
putExtra(Intent.EXTRA_SUBJECT, getString(R.string.msg_check_this_out))
putExtra(Intent.EXTRA_TEXT, getString(R.string.play_store_link)) override fun showMessage(message: String) {
startActivity(Intent.createChooser(this, getString(R.string.msg_share_using))) showToast(message)
}
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
private fun setupToolbar() {
with((activity as AppCompatActivity)) {
with(toolbar) {
setSupportActionBar(this)
title = getString(R.string.title_settings)
setNavigationIcon(R.drawable.ic_arrow_back_white_24dp)
setNavigationOnClickListener { activity?.onBackPressed() }
}
} }
} }
...@@ -142,7 +156,42 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen ...@@ -142,7 +156,42 @@ class SettingsFragment : Fragment(), SettingsView, AdapterView.OnItemClickListen
} }
} }
companion object { private fun showAppOnStore() {
fun newInstance() = SettingsFragment() try {
startActivity(Intent(Intent.ACTION_VIEW, getString(R.string.market_link).toUri()))
} catch (error: ActivityNotFoundException) {
startActivity(Intent(Intent.ACTION_VIEW, getString(R.string.play_store_link).toUri()))
}
}
private fun shareApp() {
with(Intent(Intent.ACTION_SEND)) {
type = "text/plain"
putExtra(Intent.EXTRA_SUBJECT, getString(R.string.msg_check_this_out))
putExtra(Intent.EXTRA_TEXT, getString(R.string.play_store_link))
startActivity(Intent.createChooser(this, getString(R.string.msg_share_using)))
}
}
private fun showLogoutDialog() {
context?.let {
val builder = AlertDialog.Builder(it)
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()
}
}
private fun showDeleteAccountDialog() {
context?.let {
AlertDialog.Builder(it)
.setView(LayoutInflater.from(it).inflate(R.layout.dialog_delete_account, null))
.setPositiveButton(R.string.msg_delete_account) { _, _ ->
presenter.deleteAccount(EditText(context).text.toString())
}.setNegativeButton(android.R.string.no) { dialog, _ -> dialog.cancel() }.create()
.show()
}
} }
} }
package chat.rocket.android.sortingandgrouping.di
import chat.rocket.android.dagger.scope.PerFragment
import chat.rocket.android.sortingandgrouping.presentation.SortingAndGroupingView
import chat.rocket.android.sortingandgrouping.ui.SortingAndGroupingBottomSheetFragment
import dagger.Module
import dagger.Provides
@Module
class SortingAndGroupingBottomSheetFragmentModule {
@Provides
@PerFragment
fun sortingAndGroupingView(frag: SortingAndGroupingBottomSheetFragment): SortingAndGroupingView =
frag
}
\ No newline at end of file
package chat.rocket.android.sortingandgrouping.di
import chat.rocket.android.dagger.scope.PerFragment
import chat.rocket.android.sortingandgrouping.ui.SortingAndGroupingBottomSheetFragment
import dagger.Module
import dagger.android.ContributesAndroidInjector
@Module
abstract class SortingAndGroupingBottomSheetFragmentProvider {
@ContributesAndroidInjector(modules = [SortingAndGroupingBottomSheetFragmentModule::class])
@PerFragment
abstract fun provideSortingAndGroupingBottomSheetFragment(): SortingAndGroupingBottomSheetFragment
}
\ No newline at end of file
package chat.rocket.android.sortingandgrouping.presentation
import chat.rocket.android.server.domain.SortingAndGroupingInteractor
import javax.inject.Inject
import javax.inject.Named
class SortingAndGroupingPresenter @Inject constructor(
private val view: SortingAndGroupingView,
private val sortingAndGroupingInteractor: SortingAndGroupingInteractor,
@Named("currentServer") private val currentServerUrl: String
) {
fun getSortingAndGroupingPreferences() {
with(sortingAndGroupingInteractor) {
view.showSortingAndGroupingPreferences(
getSortByName(currentServerUrl),
getUnreadOnTop(currentServerUrl),
getGroupByType(currentServerUrl),
getGroupByFavorites(currentServerUrl)
)
}
}
fun saveSortingAndGroupingPreferences(
isSortByName: Boolean,
isUnreadOnTop: Boolean,
isGroupByType: Boolean,
isGroupByFavorites: Boolean
) {
sortingAndGroupingInteractor.save(
currentServerUrl,
isSortByName,
isUnreadOnTop,
isGroupByType,
isGroupByFavorites
)
}
}
\ No newline at end of file
package chat.rocket.android.sortingandgrouping.presentation
interface SortingAndGroupingView {
/**
* Shows the sorting and grouping preferences for the current logged in server.
*
* @param isSortByName True if sorting by name, false otherwise.
* @param isUnreadOnTop True if grouping by unread on top, false otherwise.
* @param isGroupByType True if grouping by type , false otherwise.
* @param isGroupByFavorites True if grouping by favorites, false otherwise.
*/
fun showSortingAndGroupingPreferences(
isSortByName: Boolean,
isUnreadOnTop: Boolean,
isGroupByType: Boolean,
isGroupByFavorites: Boolean
)
}
\ No newline at end of file
package chat.rocket.android.sortingandgrouping.ui
import DrawableHelper
import android.content.DialogInterface
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.annotation.DrawableRes
import chat.rocket.android.R
import chat.rocket.android.chatrooms.ui.ChatRoomsFragment
import chat.rocket.android.chatrooms.ui.TAG_CHAT_ROOMS_FRAGMENT
import chat.rocket.android.sortingandgrouping.presentation.SortingAndGroupingPresenter
import chat.rocket.android.sortingandgrouping.presentation.SortingAndGroupingView
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.bottom_sheet_fragment_sort_by.*
import javax.inject.Inject
const val TAG = "SortingAndGroupingBottomSheetFragment"
class SortingAndGroupingBottomSheetFragment : BottomSheetDialogFragment(), SortingAndGroupingView {
@Inject
lateinit var presenter: SortingAndGroupingPresenter
private var isSortByName = false
private var isUnreadOnTop = false
private var isGroupByType = false
private var isGroupByFavorites = false
private val chatRoomFragment by lazy {
activity?.supportFragmentManager?.findFragmentByTag(TAG_CHAT_ROOMS_FRAGMENT) as ChatRoomsFragment
}
private val filterDrawable by lazy { R.drawable.ic_filter_20dp }
private val activityDrawable by lazy { R.drawable.ic_activity_20dp }
private val unreadOnTopDrawable by lazy { R.drawable.ic_unread_20dp }
private val groupByTypeDrawable by lazy { R.drawable.ic_group_by_type_20dp }
private val groupByFavoritesDrawable by lazy { R.drawable.ic_favorites_20dp }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AndroidSupportInjection.inject(this)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? =
inflater.inflate(R.layout.bottom_sheet_fragment_sort_by, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
presenter.getSortingAndGroupingPreferences()
setupListeners()
}
override fun onCancel(dialog: DialogInterface?) {
super.onCancel(dialog)
presenter.saveSortingAndGroupingPreferences(
isSortByName,
isUnreadOnTop,
isGroupByType,
isGroupByFavorites
)
}
override fun showSortingAndGroupingPreferences(
isSortByName: Boolean,
isUnreadOnTop: Boolean,
isGroupByType: Boolean,
isGroupByFavorites: Boolean
) {
this.isSortByName = isSortByName
this.isUnreadOnTop = isUnreadOnTop
this.isGroupByType = isGroupByType
this.isGroupByFavorites = isGroupByFavorites
if (isSortByName) {
changeSortByTitle(getString(R.string.msg_sort_by_name))
checkSelection(text_name, filterDrawable)
} else {
changeSortByTitle(getString(R.string.msg_sort_by_activity))
checkSelection(text_activity, activityDrawable)
}
if (isUnreadOnTop) checkSelection(text_unread_on_top, unreadOnTopDrawable)
if (isGroupByType) checkSelection(text_group_by_type, groupByTypeDrawable)
if (isGroupByFavorites) checkSelection(text_group_by_favorites, groupByFavoritesDrawable)
}
private fun setupListeners() {
text_name.setOnClickListener {
changeSortByTitle(getString(R.string.msg_sort_by_name))
checkSelection(text_name, filterDrawable)
uncheckSelection(text_activity, activityDrawable)
isSortByName = true
sortChatRoomsList()
}
text_activity.setOnClickListener {
changeSortByTitle(getString(R.string.msg_sort_by_activity))
checkSelection(text_activity, activityDrawable)
uncheckSelection(text_name, filterDrawable)
isSortByName = false
sortChatRoomsList()
}
text_unread_on_top.setOnClickListener {
isUnreadOnTop = if (isUnreadOnTop) {
uncheckSelection(text_unread_on_top, unreadOnTopDrawable)
false
} else {
checkSelection(text_unread_on_top, unreadOnTopDrawable)
true
}
sortChatRoomsList()
}
text_group_by_type.setOnClickListener {
isGroupByType = if (isGroupByType) {
uncheckSelection(text_group_by_type, groupByTypeDrawable)
false
} else {
checkSelection(text_group_by_type, groupByTypeDrawable)
true
}
sortChatRoomsList()
}
text_group_by_favorites.setOnClickListener {
isGroupByFavorites = if (isGroupByFavorites) {
uncheckSelection(text_group_by_favorites, groupByFavoritesDrawable)
false
} else {
checkSelection(text_group_by_favorites, groupByFavoritesDrawable)
true
}
sortChatRoomsList()
}
}
private fun changeSortByTitle(text: String) {
text_sort_by.text = getString(R.string.msg_sort_by, text.toLowerCase())
}
private fun checkSelection(textView: TextView, @DrawableRes leftDrawable: Int) {
context?.let {
DrawableHelper.compoundLeftAndRightDrawable(
textView,
DrawableHelper.getDrawableFromId(leftDrawable, it),
DrawableHelper.getDrawableFromId(R.drawable.ic_check, it)
)
}
}
private fun uncheckSelection(textView: TextView, @DrawableRes leftDrawable: Int) {
context?.let {
DrawableHelper.compoundLeftDrawable(
textView,
DrawableHelper.getDrawableFromId(leftDrawable, it)
)
}
}
private fun sortChatRoomsList() {
chatRoomFragment.sortChatRoomsList(
isSortByName,
isUnreadOnTop,
isGroupByType,
isGroupByFavorites
)
}
}
\ No newline at end of file
...@@ -19,7 +19,7 @@ suspend fun RocketChatClientFactory.registerPushToken( ...@@ -19,7 +19,7 @@ suspend fun RocketChatClientFactory.registerPushToken(
accounts.forEach { account -> accounts.forEach { account ->
try { try {
retryIO(description = "register push token: ${account.serverUrl}") { retryIO(description = "register push token: ${account.serverUrl}") {
create(account.serverUrl).registerPushToken(token) get(account.serverUrl).registerPushToken(token)
} }
} catch (ex: Exception) { } catch (ex: Exception) {
Timber.d(ex, "Error registering Push token for ${account.serverUrl}") Timber.d(ex, "Error registering Push token for ${account.serverUrl}")
......
...@@ -16,9 +16,17 @@ import dagger.android.support.DaggerFragment ...@@ -16,9 +16,17 @@ import dagger.android.support.DaggerFragment
import kotlinx.android.synthetic.main.fragment_admin_panel_web_view.* import kotlinx.android.synthetic.main.fragment_admin_panel_web_view.*
import javax.inject.Inject import javax.inject.Inject
internal const val TAG_ADMIN_PANEL_WEB_VIEW_FRAGMENT = "AdminPanelWebViewFragment"
private const val BUNDLE_WEB_PAGE_URL = "web_page_url" private const val BUNDLE_WEB_PAGE_URL = "web_page_url"
private const val BUNDLE_USER_TOKEN = "user_token" private const val BUNDLE_USER_TOKEN = "user_token"
fun newInstance(webPageUrl: String, userToken: String) = AdminPanelWebViewFragment().apply {
arguments = Bundle(2).apply {
putString(BUNDLE_WEB_PAGE_URL, webPageUrl)
putString(BUNDLE_USER_TOKEN, userToken)
}
}
class AdminPanelWebViewFragment : DaggerFragment() { class AdminPanelWebViewFragment : DaggerFragment() {
private lateinit var webPageUrl: String private lateinit var webPageUrl: String
private lateinit var userToken: String private lateinit var userToken: String
...@@ -30,7 +38,8 @@ class AdminPanelWebViewFragment : DaggerFragment() { ...@@ -30,7 +38,8 @@ class AdminPanelWebViewFragment : DaggerFragment() {
arguments?.run { arguments?.run {
webPageUrl = getString(BUNDLE_WEB_PAGE_URL, "") webPageUrl = getString(BUNDLE_WEB_PAGE_URL, "")
userToken = getString(BUNDLE_USER_TOKEN, "") userToken = getString(BUNDLE_USER_TOKEN, "")
} ?: requireNotNull(arguments) { "no arguments supplied when the fragment was instantiated" } }
?: requireNotNull(arguments) { "no arguments supplied when the fragment was instantiated" }
} }
override fun onCreateView( override fun onCreateView(
...@@ -49,7 +58,7 @@ class AdminPanelWebViewFragment : DaggerFragment() { ...@@ -49,7 +58,7 @@ class AdminPanelWebViewFragment : DaggerFragment() {
private fun setupToolbar() { private fun setupToolbar() {
(activity as AppCompatActivity?)?.supportActionBar?.title = (activity as AppCompatActivity?)?.supportActionBar?.title =
getString(R.string.title_admin_panel) getString(R.string.title_admin_panel)
} }
@SuppressLint("SetJavaScriptEnabled") @SuppressLint("SetJavaScriptEnabled")
...@@ -70,13 +79,4 @@ class AdminPanelWebViewFragment : DaggerFragment() { ...@@ -70,13 +79,4 @@ class AdminPanelWebViewFragment : DaggerFragment() {
} }
web_view.loadUrl(webPageUrl) web_view.loadUrl(webPageUrl)
} }
companion object {
fun newInstance(webPageUrl: String, userToken: String) = AdminPanelWebViewFragment().apply {
arguments = Bundle(2).apply {
putString(BUNDLE_WEB_PAGE_URL, webPageUrl)
putString(BUNDLE_USER_TOKEN, userToken)
}
}
}
} }
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="90"
android:centerColor="#30000000"
android:endColor="#00000000"
android:startColor="#C0000000"
android:type="linear" />
</shape>
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:fillColor="#00000000"
android:fillType="evenOdd"
android:pathData="M10,10m-9.25,0a9.25,9.25 0,1 1,18.5 0a9.25,9.25 0,1 1,-18.5 0"
android:strokeWidth="1.5"
android:strokeColor="#9EA2A8" />
<path
android:fillColor="#00000000"
android:fillType="evenOdd"
android:pathData="M10,4.004V10l4,4"
android:strokeWidth="1.5"
android:strokeColor="#9EA2A8" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="48"
android:viewportHeight="48">
<path
android:fillColor="#00000000"
android:fillType="evenOdd"
android:pathData="M4.5,0.5L43.5,0.5A4,4 0,0 1,47.5 4.5L47.5,43.5A4,4 0,0 1,43.5 47.5L4.5,47.5A4,4 0,0 1,0.5 43.5L0.5,4.5A4,4 0,0 1,4.5 0.5z"
android:strokeWidth="1"
android:strokeColor="#CBCED1" />
<path
android:fillColor="#00000000"
android:fillType="evenOdd"
android:pathData="M33.0625,23.5625L24.4375,23.5625L24.4375,14.9375C24.4375,14.6959 24.2416,14.5 24,14.5C23.7584,14.5 23.5625,14.6959 23.5625,14.9375L23.5625,23.5625L14.9375,23.5625C14.6959,23.5625 14.5,23.7584 14.5,24C14.5,24.2416 14.6959,24.4375 14.9375,24.4375L23.5625,24.4375L23.5625,33.0625C23.5625,33.3041 23.7584,33.5 24,33.5C24.2416,33.5 24.4375,33.3041 24.4375,33.0625L24.4375,24.4375L33.0625,24.4375C33.3041,24.4375 33.5,24.2416 33.5,24C33.5,23.7584 33.3041,23.5625 33.0625,23.5625Z"
android:strokeWidth="1"
android:strokeColor="#9EA2A8" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="8dp"
android:height="4dp"
android:viewportWidth="8"
android:viewportHeight="4">
<path
android:fillColor="#FFFFFF"
android:fillType="evenOdd"
android:pathData="M1.20711,0L6.79289,0C7.06904,0 7.29289,0.22386 7.29289,0.5C7.29289,0.63261 7.24021,0.75979 7.14645,0.85355L4.35355,3.64645C4.15829,3.84171 3.84171,3.84171 3.64645,3.64645L0.85355,0.85355C0.65829,0.65829 0.65829,0.34171 0.85355,0.14645C0.94732,0.05268 1.0745,0 1.20711,0Z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M20,2H4c-1.1,0 -2,0.9 -2,2v18l4,-4h14c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="17dp"
android:height="12dp"
android:viewportWidth="17"
android:viewportHeight="12">
<path
android:fillColor="#1D74F5"
android:fillType="nonZero"
android:pathData="M5.5875,9.7331L14.7078,0.6128C15.0463,0.2744 15.595,0.2744 15.9335,0.6128L15.9335,0.6128C16.2719,0.9513 16.2719,1.5 15.9335,1.8385L6.2225,11.5494C5.832,11.9399 5.1989,11.9399 4.8083,11.5494L0.6489,7.39C0.2905,7.0316 0.2905,6.4506 0.6489,6.0922L0.6489,6.0922C1.0072,5.7338 1.5883,5.7338 1.9466,6.0922L5.5875,9.7331Z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
...@@ -2,8 +2,9 @@ ...@@ -2,8 +2,9 @@
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:tint="#1D74F5" android:tint="#1D74F5"
android:viewportHeight="24.0" android:viewportWidth="24"
android:viewportWidth="24.0"> android:viewportHeight="24">
<path <path
android:fillColor="#FF1D74F5" android:fillColor="#FF1D74F5"
android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z" /> android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z" />
......
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="19">
<path
android:fillColor="#00000000"
android:fillType="evenOdd"
android:pathData="M14.882,16.72l-0.933,-5.437 3.95,-3.85 -5.458,-0.793L10,1.695 7.56,6.64 2.1,7.434l3.95,3.85 -0.933,5.435L10,14.153l4.882,2.566z"
android:strokeWidth="1.5"
android:strokeColor="#9EA2A8" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#00000000"
android:fillType="evenOdd"
android:pathData="M5,4L5,18"
android:strokeWidth="1.5"
android:strokeColor="#9EA2A8"
android:strokeLineCap="round" />
<path
android:fillColor="#00000000"
android:fillType="evenOdd"
android:pathData="M2,16L5,19"
android:strokeWidth="1.5"
android:strokeColor="#9EA2A8"
android:strokeLineCap="round" />
<path
android:fillColor="#00000000"
android:fillType="evenOdd"
android:pathData="M8,16L5,19"
android:strokeWidth="1.5"
android:strokeColor="#9EA2A8"
android:strokeLineCap="round" />
<path
android:fillColor="#9EA2A8"
android:fillType="evenOdd"
android:pathData="M17.4434,7.0605L16.3545,3.8916L15.1973,7.0605L17.4434,7.0605ZM15.8467,2.8271L16.9453,2.8271L19.5479,10L18.4834,10L17.7559,7.8516L14.9189,7.8516L14.1426,10L13.1465,10L15.8467,2.8271Z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
<path
android:fillColor="#9EA2A8"
android:fillType="evenOdd"
android:pathData="M13.2295,19.1943l4.3994,-5.5127l-4.0771,0l0,-0.8545l5.3271,0l0,0.835l-4.4238,5.4834l4.4238,0l0,0.8545l-5.6494,0z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#00000000"
android:fillType="evenOdd"
android:pathData="M5,4v14M12,5h10.88M12,10h8.88M12,15h5.88M2,16l3,3M8,16l-3,3"
android:strokeWidth="1.5"
android:strokeColor="#9EA2A8"
android:strokeLineCap="round" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M10.09,15.59L11.5,17l5,-5 -5,-5 -1.41,1.41L12.67,11H3v2h9.67l-2.58,2.59zM19,3H5c-1.11,0 -2,0.9 -2,2v4h2V5h14v14H5v-4H3v4c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M12.0455,10.4052C12.5308,8.6894 14.1082,7.4323 15.9794,7.4323C17.8505,7.4323 19.428,8.6894 19.9132,10.4052L22.04,10.4052C22.5923,10.4052 23.04,10.8529 23.04,11.4052L23.04,11.6348C23.04,12.1871 22.5923,12.6348 22.04,12.6348L19.9132,12.6348C19.428,14.3506 17.8505,15.6077 15.9794,15.6077C14.1082,15.6077 12.5308,14.3506 12.0455,12.6348L1,12.6348C0.4477,12.6348 0,12.1871 0,11.6348L0,11.4052C0,10.8529 0.4477,10.4052 1,10.4052L12.0455,10.4052ZM15.9794,13.3781C17.0055,13.3781 17.8374,12.5462 17.8374,11.52C17.8374,10.4938 17.0055,9.6619 15.9794,9.6619C14.9532,9.6619 14.1213,10.4938 14.1213,11.52C14.1213,12.5462 14.9532,13.3781 15.9794,13.3781ZM8.5471,14.8645C10.4182,14.8645 11.9957,16.1217 12.481,17.8374L22.04,17.8374C22.5923,17.8374 23.04,18.2851 23.04,18.8374L23.04,19.0671C23.04,19.6194 22.5923,20.0671 22.04,20.0671L12.481,20.0671C11.9957,21.7828 10.4182,23.04 8.5471,23.04C6.676,23.04 5.0985,21.7828 4.6132,20.0671L1,20.0671C0.4477,20.0671 0,19.6194 0,19.0671L0,18.8374C-0,18.2851 0.4477,17.8374 1,17.8374L4.6132,17.8374C5.0985,16.1217 6.676,14.8645 8.5471,14.8645ZM8.5471,20.8103C9.5733,20.8103 10.4052,19.9784 10.4052,18.9523C10.4052,17.9261 9.5733,17.0942 8.5471,17.0942C7.5209,17.0942 6.689,17.9261 6.689,18.9523C6.689,19.9784 7.5209,20.8103 8.5471,20.8103ZM7.0606,0C8.9318,0 10.5092,1.2572 10.9945,2.9729L22.04,2.9729C22.5923,2.9729 23.04,3.4206 23.04,3.9729L23.04,4.2026C23.04,4.7549 22.5923,5.2026 22.04,5.2026L10.9945,5.2026C10.5092,6.9183 8.9318,8.1755 7.0606,8.1755C5.1895,8.1755 3.612,6.9183 3.1268,5.2026L1,5.2026C0.4477,5.2026 0,4.7549 0,4.2026L0,3.9729C-0,3.4206 0.4477,2.9729 1,2.9729L3.1268,2.9729C3.612,1.2572 5.1895,0 7.0606,0ZM7.0606,5.9458C8.0868,5.9458 8.9187,5.1139 8.9187,4.0877C8.9187,3.0616 8.0868,2.2297 7.0606,2.2297C6.0345,2.2297 5.2026,3.0616 5.2026,4.0877C5.2026,5.1139 6.0345,5.9458 7.0606,5.9458Z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:fillColor="#FFFFFF"
android:fillType="evenOdd"
android:pathData="M16.523,11.0833C16.907,11.0833 17.218,11.3942 17.218,11.7782L17.218,16.6582C17.218,17.9513 16.169,19.0002 14.876,19.0002L3.343,19.0002C2.049,19.0002 1,17.9513 1,16.6582L1,5.1263C1,3.8333 2.049,2.7843 3.343,2.7843L8.149,2.7843C8.533,2.7843 8.845,3.0953 8.845,3.4792C8.845,3.8623 8.533,4.1743 8.149,4.1743L3.343,4.1743C2.816,4.1743 2.39,4.6003 2.39,5.1263L2.39,16.6582C2.39,17.1842 2.816,17.6103 3.343,17.6103L14.876,17.6103C15.401,17.6103 15.828,17.1842 15.828,16.6582L15.828,11.7782C15.828,11.3942 16.139,11.0833 16.523,11.0833ZM18.256,2.1318C19.25,3.1248 19.247,4.7428 18.256,5.7337L9.501,14.4877L5.5647,15.6828C5.0363,15.8432 4.4778,15.5449 4.3173,15.0164C4.2598,14.8269 4.2598,14.6246 4.3174,14.4352L5.513,10.5007L14.268,1.7468C15.263,0.7518 16.876,0.7508 17.87,1.7458L18.256,2.1318ZM17.273,4.7508C17.722,4.3028 17.723,3.5638 17.273,3.1147L16.887,2.7288C16.436,2.2768 15.703,2.2768 15.251,2.7298L14.599,3.3808L16.656,5.3678L17.273,4.7508ZM8.764,13.2587L15.673,6.3507L13.616,4.3637L6.742,11.2367L5.86,14.1407L8.764,13.2587Z"
android:strokeWidth="0.1"
android:strokeColor="#FFFFFF" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M18.976,9.783C15.808,6.408 12.812,4.75 10,4.75c-2.812,0 -5.808,1.658 -8.976,5.033C4.28,13.166 7.278,14.829 10,14.829c2.722,0 5.72,-1.663 8.976,-5.046z"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:fillType="evenOdd"
android:strokeColor="#9EA2A8"/>
<path
android:pathData="M7.965,11.783a2.75,2.75 0,0 0,3.915 -3.661l-3.915,3.66z"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:fillType="evenOdd"
android:strokeColor="#9EA2A8"/>
<path
android:pathData="M3.025,15.047L16.105,3.14"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:fillType="evenOdd"
android:strokeColor="#9EA2A8"
android:strokeLineCap="round"/>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/toolbar_layout"
layout="@layout/layout_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout_container"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar_layout">
<com.google.android.material.chip.ChipGroup
android:id="@+id/members_chips"
style="@style/Widget.MaterialComponents.Chip.Entry"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:visibility="gone"
app:chipSpacing="3dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</com.google.android.material.chip.ChipGroup>
<com.wang.avi.AVLoadingIndicatorView
android:id="@+id/view_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:indicatorColor="@color/colorPrimary"
app:indicatorName="BallPulseIndicator"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/text_search_member"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@android:color/transparent"
android:hint="@string/msg_search"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:paddingBottom="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/members_chips" />
<View
android:id="@+id/separator_1"
android:layout_width="match_parent"
android:layout_height="0.2dp"
android:background="@color/colorDividerMessageComposer"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/text_search_member" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:scrollbars="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/separator_1" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout" android:id="@+id/fragment_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".main.ui.MainActivity"> tools:context=".main.ui.MainActivity" />
\ No newline at end of file
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/layout_app_bar"
layout="@layout/app_bar" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<FrameLayout
android:id="@+id/navigation_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start">
<com.google.android.material.navigation.NavigationView
android:id="@+id/view_navigation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:headerLayout="@layout/nav_header" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/accounts_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/nav_header_height"
android:alpha="0"
android:background="@color/colorWhite"
android:elevation="20dp"
android:visibility="gone" />
</FrameLayout>
</androidx.drawerlayout.widget.DrawerLayout>
\ No newline at end of file
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/colorPrimary"> android:background="@color/colorPrimary"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<androidx.appcompat.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
......
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:navigationIcon="@drawable/ic_navigation_24dp"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<TextView
android:id="@+id/text_server_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableEnd="@drawable/ic_arrow_expand_20dp"
android:drawablePadding="10dp"
android:fontFamily="sans-serif-medium"
android:maxLines="1"
android:textColor="#FFFFFF"
android:textSize="20sp"
android:textStyle="normal"
tools:text="Server Name" />
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".servers.ui.ServersBottomSheetFragment">
<TextView
android:id="@+id/text_server"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="@string/msg_server"
android:textColor="#9EA2A8"
android:textSize="17sp"
android:textStyle="normal"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/view_divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:background="#1F000000"
app:layout_constraintTop_toBottomOf="@+id/text_server" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="16dp"
app:layout_constraintTop_toBottomOf="@+id/view_divider" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".sortingandgrouping.ui.SortingAndGroupingBottomSheetFragment">
<TextView
android:id="@+id/text_sort_by"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="@string/msg_sort_by"
android:textColor="#9EA2A8"
android:textSize="17sp"
android:textStyle="normal" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:background="#1F000000" />
<TextView
android:id="@+id/text_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableStart="@drawable/ic_filter_20dp"
android:drawablePadding="16dp"
android:paddingStart="16dp"
android:paddingTop="16dp"
android:paddingEnd="16dp"
android:paddingBottom="16dp"
android:text="@string/msg_sort_by_name"
android:textColor="#2F343D"
android:textSize="16sp"
android:textStyle="normal" />
<TextView
android:id="@+id/text_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableStart="@drawable/ic_activity_20dp"
android:drawablePadding="16dp"
android:paddingStart="16dp"
android:paddingTop="16dp"
android:paddingEnd="16dp"
android:paddingBottom="16dp"
android:text="@string/msg_sort_by_activity"
android:textColor="#2F343D"
android:textSize="16sp"
android:textStyle="normal" />
<View
android:id="@+id/view_divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:background="#1F000000" />
<TextView
android:id="@+id/text_unread_on_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableStart="@drawable/ic_unread_20dp"
android:drawablePadding="16dp"
android:paddingStart="16dp"
android:paddingTop="16dp"
android:paddingEnd="16dp"
android:paddingBottom="16dp"
android:text="@string/msg_group_by_unread_on_top"
android:textColor="#2F343D"
android:textSize="16sp"
android:textStyle="normal" />
<TextView
android:id="@+id/text_group_by_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableStart="@drawable/ic_group_by_type_20dp"
android:drawablePadding="16dp"
android:paddingStart="16dp"
android:paddingTop="16dp"
android:paddingEnd="16dp"
android:paddingBottom="16dp"
android:text="@string/msg_group_by_type"
android:textColor="#2F343D"
android:textSize="16sp"
android:textStyle="normal" />
<TextView
android:id="@+id/text_group_by_favorites"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableStart="@drawable/ic_favorites_20dp"
android:drawablePadding="16dp"
android:paddingStart="16dp"
android:paddingTop="16dp"
android:paddingEnd="16dp"
android:paddingBottom="16dp"
android:text="@string/msg_group_by_favorites"
android:textColor="#2F343D"
android:textSize="16sp"
android:textStyle="normal" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:padding="@dimen/screen_edge_left_and_right_margins"> android:padding="@dimen/screen_edge_left_and_right_margins">
......
...@@ -6,35 +6,40 @@ ...@@ -6,35 +6,40 @@
android:padding="24dp"> android:padding="24dp">
<RadioGroup <RadioGroup
android:id="@+id/radio_group_sort" android:id="@+id/radio_group_status"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<RadioButton <RadioButton
android:id="@+id/radio_sort_alphabetical" android:id="@+id/radio_button_online"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="8dp" android:padding="8dp"
android:text="@string/dialog_sort_by_alphabet" android:text="@string/msg_online"
android:textSize="18sp" /> android:textSize="18sp" />
<RadioButton <RadioButton
android:id="@+id/radio_sort_activity" android:id="@+id/radio_button_away"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="8dp" android:padding="8dp"
android:text="@string/dialog_sort_by_activity" android:text="@string/msg_away"
android:textSize="18sp" /> android:textSize="18sp" />
</RadioGroup>
<CheckBox <RadioButton
android:id="@+id/checkbox_group_by_type" android:id="@+id/radio_button_busy"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="6dp" android:padding="8dp"
android:padding="8dp" android:text="@string/msg_busy"
android:text="@string/dialog_group_by_type" android:textSize="18sp" />
android:textSize="18sp" />
<!--TODO Add checkbox for "Group favourites after sdk support"--> <RadioButton
android:id="@+id/radio_button_invisible"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="@string/msg_invisible"
android:textSize="18sp" />
</RadioGroup>
</LinearLayout> </LinearLayout>
\ No newline at end of file
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="chat.rocket.android.about.ui.AboutFragment">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="50dp"
android:layout_gravity="center">
<ImageView
android:id="@+id/image_app_name"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:src="@drawable/ic_app_name"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<ImageView
android:layout_width="160dp"
android:layout_height="160dp"
android:adjustViewBounds="true"
android:scaleX="1.5"
android:scaleY="1.5"
android:src="@drawable/ic_launcher_foreground"
app:layout_constraintBottom_toTopOf="@id/image_app_name"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_version_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Version alpha2.0.1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/image_app_name"
android:layout_marginTop="16dp"
android:textColor="@color/colorSecondaryText"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"/>
<TextView
android:id="@+id/text_build_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Build # 2000"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_version_name"
android:layout_marginTop="8dp"
android:textColor="@color/colorSecondaryText" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".chatrooms.ui.ChatRoomsFragment"> tools:context=".chatrooms.ui.ChatRoomsFragment">
<include
android:id="@+id/layout_app_bar_chat_room"
layout="@layout/app_bar_chat_rooms"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_sort_by"
android:layout_width="match_parent"
android:layout_height="42dp"
android:background="#54585E"
android:drawableEnd="@drawable/ic_group_by_type_20dp"
android:fontFamily="sans-serif-medium"
android:gravity="center_vertical"
android:paddingStart="@dimen/screen_edge_left_and_right_margins"
android:paddingEnd="@dimen/screen_edge_left_and_right_margins"
android:text="@string/msg_sort_by"
android:textColor="#CBCED1"
android:textSize="14sp"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/layout_app_bar_chat_room" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view" android:id="@+id/recycler_view"
android:layout_below="@+id/text_connection_status"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_sort_by" />
<com.wang.avi.AVLoadingIndicatorView <com.wang.avi.AVLoadingIndicatorView
android:id="@+id/view_loading" android:id="@+id/view_loading"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone" android:visibility="gone"
app:indicatorColor="@color/colorBlack" app:indicatorColor="@color/colorBlack"
app:indicatorName="BallPulseIndicator" /> app:indicatorName="BallPulseIndicator"
app:layout_constraintBottom_toBottomOf="parent"
<TextView app:layout_constraintEnd_toEndOf="parent"
android:id="@+id/text_no_data_to_display" app:layout_constraintStart_toStartOf="parent"
style="@style/TextAppearance.AppCompat.Subhead" app:layout_constraintTop_toBottomOf="@+id/text_sort_by"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/msg_no_data_to_display"
android:visibility="gone"
tools:visibility="visible" /> tools:visibility="visible" />
<TextView </androidx.constraintlayout.widget.ConstraintLayout>
android:id="@+id/text_connection_status"
android:layout_width="match_parent"
android:layout_height="32dp"
android:alpha="0"
android:background="@color/colorPrimary"
android:elevation="4dp"
android:gravity="center"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textColor="@color/colorWhite"
android:visibility="gone"
tools:alpha="1"
tools:text="connected"
tools:visibility="visible" />
<TextView
android:id="@+id/text_no_result_found"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="56dp"
android:text="@string/msg_no_search_found"
android:textSize="20sp"
android:visibility="gone"
tools:visibility="visible" />
</RelativeLayout>
...@@ -4,10 +4,13 @@ ...@@ -4,10 +4,13 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_margin="16dp"
android:focusableInTouchMode="true"
tools:context="createchannel.ui.CreateChannelFragment"> tools:context="createchannel.ui.CreateChannelFragment">
<include
android:id="@+id/layout_app_bar"
layout="@layout/app_bar"
app:layout_constraintTop_toTopOf="parent" />
<com.wang.avi.AVLoadingIndicatorView <com.wang.avi.AVLoadingIndicatorView
android:id="@+id/view_loading" android:id="@+id/view_loading"
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -18,23 +21,26 @@ ...@@ -18,23 +21,26 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toBottomOf="@+id/layout_app_bar"
tools:visibility="visible" /> tools:visibility="visible" />
<TextView <TextView
android:id="@+id/text_channel_type" android:id="@+id/text_channel_type"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:text="@string/msg_public_channel" android:text="@string/msg_public_channel"
android:textColor="@color/colorPrimaryText" android:textColor="@color/colorPrimaryText"
android:textSize="16sp" android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toBottomOf="@+id/layout_app_bar" />
<TextView <TextView
android:id="@+id/text_channel_type_description" android:id="@+id/text_channel_type_description"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="@string/msg_public_channel_description" android:text="@string/msg_public_channel_description"
android:textColor="@color/colorSecondaryText" android:textColor="@color/colorSecondaryText"
android:textSize="12sp" android:textSize="12sp"
...@@ -45,6 +51,7 @@ ...@@ -45,6 +51,7 @@
android:id="@+id/switch_channel_type" android:id="@+id/switch_channel_type"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
app:layout_constraintBottom_toBottomOf="@+id/text_channel_type_description" app:layout_constraintBottom_toBottomOf="@+id/text_channel_type_description"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/text_channel_type" /> app:layout_constraintTop_toTopOf="@+id/text_channel_type" />
...@@ -53,6 +60,8 @@ ...@@ -53,6 +60,8 @@
android:id="@+id/text_read_only" android:id="@+id/text_read_only"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:text="@string/msg_ready_only_channel" android:text="@string/msg_ready_only_channel"
android:textColor="@color/colorPrimaryText" android:textColor="@color/colorPrimaryText"
...@@ -64,6 +73,8 @@ ...@@ -64,6 +73,8 @@
android:id="@+id/text_read_only_description" android:id="@+id/text_read_only_description"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="@string/msg_ready_only_channel_description" android:text="@string/msg_ready_only_channel_description"
android:textColor="@color/colorSecondaryText" android:textColor="@color/colorSecondaryText"
android:textSize="12sp" android:textSize="12sp"
...@@ -74,6 +85,8 @@ ...@@ -74,6 +85,8 @@
android:id="@+id/switch_read_only" android:id="@+id/switch_read_only"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
app:layout_constraintBottom_toBottomOf="@+id/text_read_only_description" app:layout_constraintBottom_toBottomOf="@+id/text_read_only_description"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/text_read_only" /> app:layout_constraintTop_toTopOf="@+id/text_read_only" />
...@@ -81,7 +94,9 @@ ...@@ -81,7 +94,9 @@
<ImageView <ImageView
android:id="@+id/image_channel_icon" android:id="@+id/image_channel_icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="22dp" android:layout_marginTop="22dp"
android:src="@drawable/ic_hashtag_black_12dp" android:src="@drawable/ic_hashtag_black_12dp"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
...@@ -91,6 +106,8 @@ ...@@ -91,6 +106,8 @@
android:id="@+id/text_channel_name" android:id="@+id/text_channel_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:backgroundTint="@color/colorDim" android:backgroundTint="@color/colorDim"
android:hint="@string/msg_channel_name" android:hint="@string/msg_channel_name"
android:inputType="text" android:inputType="text"
...@@ -107,6 +124,7 @@ ...@@ -107,6 +124,7 @@
android:id="@+id/image_invite_member" android:id="@+id/image_invite_member"
android:layout_width="14dp" android:layout_width="14dp"
android:layout_height="14dp" android:layout_height="14dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:src="@drawable/ic_at_black_20dp" android:src="@drawable/ic_at_black_20dp"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
...@@ -116,6 +134,8 @@ ...@@ -116,6 +134,8 @@
android:id="@+id/text_invite_members" android:id="@+id/text_invite_members"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:backgroundTint="@color/colorDim" android:backgroundTint="@color/colorDim"
android:hint="@string/msg_invite_members" android:hint="@string/msg_invite_members"
android:inputType="text" android:inputType="text"
......
...@@ -8,9 +8,15 @@ ...@@ -8,9 +8,15 @@
android:focusableInTouchMode="true" android:focusableInTouchMode="true"
tools:context=".profile.ui.ProfileFragment"> tools:context=".profile.ui.ProfileFragment">
<include
android:id="@+id/layout_app_bar"
layout="@layout/app_bar"
app:layout_constraintTop_toTopOf="parent" />
<ScrollView <ScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:layout_below="@+id/layout_app_bar">
<LinearLayout <LinearLayout
android:id="@+id/profile_container" android:id="@+id/profile_container"
...@@ -29,12 +35,24 @@ ...@@ -29,12 +35,24 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="32dp" /> android:layout_marginTop="32dp" />
<TextView
android:id="@+id/text_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="@string/status"
android:textColor="#DE000000"
android:textSize="18sp"
android:textStyle="normal" />
<EditText <EditText
android:id="@+id/text_name" android:id="@+id/text_name"
style="@style/Profile.EditText" style="@style/Profile.EditText"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"
android:layout_marginTop="32dp" android:layout_marginTop="16dp"
android:drawableStart="@drawable/ic_person_black_20dp" android:drawableStart="@drawable/ic_person_black_20dp"
android:hint="@string/msg_name" android:hint="@string/msg_name"
android:inputType="textCapWords" /> android:inputType="textCapWords" />
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".settings.ui.SettingsFragment"> tools:context=".settings.ui.SettingsFragment">
<ListView <include
android:id="@+id/settings_list" android:id="@+id/layout_app_bar"
layout="@layout/app_bar"
app:layout_constraintTop_toTopOf="parent" />
<ScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:entries="@array/settings_actions" /> android:layout_below="@+id/layout_app_bar"
</RelativeLayout> app:layout_constraintTop_toBottomOf="@+id/layout_app_bar">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/profile_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorLightGrey"
android:foreground="?selectableItemBackground"
android:paddingStart="16dp"
android:paddingTop="5dp"
android:paddingEnd="16dp"
android:paddingBottom="5dp"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/image_avatar"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/bg_border_user_details_avatar"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@tools:sample/avatars[6]" />
<TextView
android:id="@+id/text_display_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:fontFamily="sans-serif-medium"
android:textColor="#DE000000"
android:textSize="14sp"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/image_avatar"
app:layout_constraintTop_toTopOf="@+id/image_avatar"
tools:text="user.name" />
<TextView
android:id="@+id/text_status"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:fontFamily="sans-serif"
android:textColor="#99000000"
android:textSize="14sp"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/image_avatar"
app:layout_constraintTop_toBottomOf="@+id/text_display_name"
tools:text="visible" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/text_contact_us"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:background="@color/colorLightGrey"
android:fontFamily="sans-serif-medium"
android:foreground="?selectableItemBackground"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:text="@string/msg_contact_us"
android:textColor="#DE000000"
android:textSize="16sp"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/profile_container" />
<TextView
android:id="@+id/text_language"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/colorLightGrey"
android:fontFamily="sans-serif-medium"
android:foreground="?selectableItemBackground"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:text="@string/msg_language"
android:textColor="#DE000000"
android:textSize="16sp"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_contact_us" />
<TextView
android:id="@+id/text_review_this_app"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/colorLightGrey"
android:fontFamily="sans-serif-medium"
android:foreground="?selectableItemBackground"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:text="@string/msg_review_this_app"
android:textColor="#DE000000"
android:textSize="16sp"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_language" />
<TextView
android:id="@+id/text_share_this_app"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/colorLightGrey"
android:fontFamily="sans-serif-medium"
android:foreground="?selectableItemBackground"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:text="@string/msg_share_this_app"
android:textColor="#DE000000"
android:textSize="16sp"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_review_this_app" />
<TextView
android:id="@+id/text_administration"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:background="@color/colorLightGrey"
android:fontFamily="sans-serif-medium"
android:foreground="?selectableItemBackground"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:text="@string/msg_administration"
android:textColor="#DE000000"
android:textSize="16sp"
android:textStyle="normal"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_share_this_app"
tools:visibility="visible" />
<TextView
android:id="@+id/text_license"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:background="@color/colorLightGrey"
android:fontFamily="sans-serif-medium"
android:foreground="?selectableItemBackground"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:text="@string/msg_licence"
android:textColor="#DE000000"
android:textSize="16sp"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_administration" />
<TextView
android:id="@+id/text_app_version"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/colorLightGrey"
android:fontFamily="sans-serif-medium"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:text="@string/msg_app_version"
android:textColor="#DE000000"
android:textSize="16sp"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_license" />
<TextView
android:id="@+id/text_server_version"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/colorLightGrey"
android:fontFamily="sans-serif-medium"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:text="@string/msg_server_version"
android:textColor="#DE000000"
android:textSize="16sp"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_app_version" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/send_analytics_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:background="@color/colorLightGrey"
android:paddingStart="16dp"
android:paddingTop="5dp"
android:paddingEnd="16dp"
android:paddingBottom="5dp"
app:layout_constraintTop_toBottomOf="@+id/text_server_version">
<TextView
android:id="@+id/text_send_crash_report"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:text="@string/msg_send_analytics"
android:textColor="#DE000000"
android:textSize="16sp"
android:textStyle="normal"
app:layout_constraintEnd_toStartOf="@id/switch_analytics_tracking"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Switch
android:id="@+id/switch_crash_report"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/text_send_crash_report" />
<TextView
android:id="@+id/text_send_crash_report_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:text="@string/msg_send_analytics_tracking"
android:textColor="#99000000"
android:textSize="14sp"
android:textStyle="normal"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_send_crash_report" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/text_logout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:fontFamily="sans-serif-medium"
android:foreground="?selectableItemBackground"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:text="@string/msg_logout_from_rocket_chat"
android:textColor="@color/colorRed"
android:textSize="16sp"
android:textStyle="normal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/send_analytics_container" />
<TextView
android:id="@+id/text_delete_account"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:foreground="?selectableItemBackground"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:text="@string/msg_delete_account"
android:textColor="@color/colorRed"
android:textSize="16sp"
android:textStyle="normal"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_logout"
tools:visibility="visible" />
<com.wang.avi.AVLoadingIndicatorView
android:id="@+id/view_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:indicatorColor="@color/colorBlack"
app:indicatorName="BallPulseIndicator"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?selectableItemBackground" android:background="?selectableItemBackground"
android:orientation="vertical"
android:padding="16dp"> android:padding="16dp">
<ImageView
android:id="@+id/server_logo"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_add_24dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:layout_width="0dp" android:id="@+id/text_add_new_server"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:drawableStart="@drawable/ic_add_new_server_48dp"
android:text="@string/action_add_account" android:drawablePadding="12dp"
android:textAppearance="@style/TextAppearance.AppCompat.Body2" android:fontFamily="sans-serif"
app:layout_constraintBottom_toBottomOf="parent" android:gravity="center"
app:layout_constraintEnd_toEndOf="parent" android:text="@string/msg_add_new_server"
app:layout_constraintStart_toEndOf="@id/server_logo" android:textColor="#9ea2a8"
app:layout_constraintTop_toTopOf="parent" /> android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/recycler_view" />
</androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="?android:dividerHorizontal"
android:orientation="vertical"
android:showDividers="end">
<TextView
android:id="@+id/text_online"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:paddingEnd="16dp"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:drawablePadding="10dp"
android:drawableStart="@drawable/ic_status_online_12dp"
android:text="@string/action_online"
android:background="?selectableItemBackground"/>
<TextView
android:id="@+id/text_away"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:paddingEnd="16dp"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:drawablePadding="10dp"
android:drawableStart="@drawable/ic_status_away_12dp"
android:text="@string/action_away"
android:background="?selectableItemBackground"/>
<TextView
android:id="@+id/text_busy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:paddingEnd="16dp"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:drawablePadding="10dp"
android:drawableStart="@drawable/ic_status_busy_12dp"
android:text="@string/action_busy"
android:background="?selectableItemBackground"/>
<TextView
android:id="@+id/text_invisible"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:paddingEnd="16dp"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:drawablePadding="10dp"
android:drawableStart="@drawable/ic_status_invisible_12dp"
android:text="@string/action_invisible"
android:background="?selectableItemBackground"/>
</LinearLayout>
\ No newline at end of file
...@@ -10,8 +10,7 @@ ...@@ -10,8 +10,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="16dp" android:padding="16dp"
android:paddingEnd="@dimen/screen_edge_left_and_right_padding"
android:paddingStart="@dimen/screen_edge_left_and_right_padding" android:paddingStart="@dimen/screen_edge_left_and_right_padding"
android:text="@string/chatroom_header" /> android:paddingEnd="@dimen/screen_edge_left_and_right_padding" />
</LinearLayout> </LinearLayout>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/attachment_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:paddingStart="@dimen/screen_edge_left_and_right_padding"
android:paddingTop="@dimen/message_item_top_and_bottom_padding"
android:paddingEnd="@dimen/screen_edge_left_and_right_padding"
android:paddingBottom="@dimen/message_item_top_and_bottom_padding">
<View
android:id="@+id/quote_bar"
android:layout_width="4dp"
android:layout_height="0dp"
android:layout_marginStart="56dp"
android:background="@drawable/quote_vertical_gray_bar"
app:layout_constraintBottom_toTopOf="@+id/text_view_more"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_sender"
style="@style/Sender.Name.TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:textColor="@color/colorPrimary"
app:layout_constraintStart_toEndOf="@+id/quote_bar"
app:layout_constraintTop_toTopOf="parent"
tools:text="Ronald Perkins" />
<TextView
android:id="@+id/text_message_time"
style="@style/ChatList.Timestamp.TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
app:layout_constraintBottom_toBottomOf="@+id/text_sender"
app:layout_constraintStart_toEndOf="@+id/text_sender"
app:layout_constraintTop_toTopOf="@+id/text_sender"
tools:text="11:45 PM" />
<TextView
android:id="@+id/text_content"
style="@style/Message.Quote.TextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/text_view_more"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/text_sender"
app:layout_constraintTop_toBottomOf="@+id/text_sender"
tools:text="This is a multiline chat message from Bertie that will take more than just one line of text. I have sure that everything is amazing!" />
<TextView
android:id="@+id/text_view_more"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/darkGray"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="@+id/text_content"
app:layout_constraintStart_toStartOf="@+id/quote_bar"
app:layout_constraintTop_toBottomOf="@+id/text_content"
tools:text="Visualizar mais" />
<include
layout="@layout/layout_reactions"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="@+id/quote_bar"
app:layout_constraintTop_toBottomOf="@+id/text_view_more" />
</androidx.constraintlayout.widget.ConstraintLayout>
...@@ -4,43 +4,58 @@ ...@@ -4,43 +4,58 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingEnd="16dp" android:background="?selectableItemBackground"
android:paddingStart="16dp" android:paddingStart="16dp"
android:paddingTop="16dp" android:paddingTop="16dp"
android:background="?selectableItemBackground"> android:paddingEnd="16dp">
<com.facebook.drawee.view.SimpleDraweeView <ImageView
android:id="@+id/server_logo" android:id="@+id/image_server"
android:layout_width="40dp" android:layout_width="48dp"
android:layout_height="40dp" android:layout_height="48dp"
app:actualImageScaleType="centerInside"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent"
tools:src="@tools:sample/avatars" />
<TextView <TextView
android:id="@+id/text_server_url" android:id="@+id/text_server_name"
android:layout_width="0dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="12dp"
android:ellipsize="end" android:layout_marginEnd="12dp"
android:fontFamily="sans-serif-medium"
android:maxLines="1" android:maxLines="1"
android:textStyle="bold" android:textColor="#DE000000"
app:layout_constraintEnd_toEndOf="parent" android:textSize="16sp"
app:layout_constraintStart_toEndOf="@id/server_logo" android:textStyle="normal"
app:layout_constraintTop_toTopOf="@id/server_logo" app:layout_constraintStart_toEndOf="@+id/image_server"
tools:text="https://open.rocket.chat" /> app:layout_constraintTop_toTopOf="@+id/image_server"
tools:text="Hyper Ledger" />
<TextView <TextView
android:id="@+id/text_username" android:id="@+id/text_server_url"
android:layout_width="0dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="12dp"
android:ellipsize="end" android:layout_marginEnd="12dp"
android:fontFamily="sans-serif"
android:maxLines="1" android:maxLines="1"
app:layout_constraintBottom_toBottomOf="@id/server_logo" android:textColor="#99000000"
android:textSize="14sp"
android:textStyle="normal"
app:layout_constraintStart_toEndOf="@+id/image_server"
app:layout_constraintTop_toBottomOf="@+id/text_server_name"
tools:text="chat.hyperledger.org" />
<ImageView
android:id="@+id/image_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_check"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@+id/image_server"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/server_logo" app:layout_constraintTop_toTopOf="@+id/image_server"
tools:text="Lucio Maciel" /> tools:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/server_logo"
android:layout_width="0dp"
android:layout_height="0dp"
android:foreground="@drawable/black_gradient"
app:actualImageScaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@tools:sample/backgrounds/scenic" />
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/image_avatar"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/bg_empty_user_avatar"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:roundedCornerRadius="3dp"
tools:src="@tools:sample/avatars" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/account_container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="?selectableItemBackground"
android:elevation="2dp"
android:paddingStart="12dp"
android:paddingTop="4dp"
android:paddingEnd="12dp"
android:paddingBottom="4dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/image_avatar">
<ImageView
android:id="@+id/image_user_status"
android:layout_width="12dp"
android:layout_height="12dp"
app:layout_constraintBottom_toTopOf="@+id/text_user_name"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/text_user_name"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_user_name"
style="@style/Sender.Name.TextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:textColor="@color/colorWhite"
app:layout_constraintBottom_toBottomOf="@+id/image_user_status"
app:layout_constraintEnd_toStartOf="@+id/image_account_expand"
app:layout_constraintStart_toEndOf="@+id/image_user_status"
app:layout_constraintTop_toTopOf="@+id/image_user_status"
tools:text="Lucio Maciel" />
<TextView
android:id="@+id/text_server_url"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:ellipsize="end"
android:maxLines="1"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textColor="@color/colorWhite"
app:layout_constraintEnd_toStartOf="@+id/image_account_expand"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_user_name"
tools:text="https://open.rocket.chat" />
<ImageView
android:id="@+id/image_account_expand"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_expand_more_black_24dp"
android:tint="@color/colorWhite"
app:layout_constraintBottom_toBottomOf="@+id/text_server_url"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto">
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="AppCompatResource"> <item
android:id="@+id/action_new_channel"
android:icon="@drawable/ic_new_channel_24dp"
android:title="@string/action_new_channel"
app:showAsAction="ifRoom" />
<item <item
android:id="@+id/action_search" android:id="@+id/action_search"
...@@ -10,11 +14,4 @@ ...@@ -10,11 +14,4 @@
android:title="@string/action_search" android:title="@string/action_search"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView" /> app:showAsAction="ifRoom|collapseActionView" />
<item
android:id="@+id/action_sort"
android:icon="@drawable/ic_sort"
android:title="@string/msg_sort"
app:showAsAction="ifRoom" />
</menu> </menu>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_delete_account"
android:title="@string/action_delete_account"
app:showAsAction="never" />
</menu>
\ No newline at end of file
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">تسجيل الدخول إلى خادمك</string> <string name="title_sign_in_your_server">تسجيل الدخول إلى خادمك</string>
<string name="title_log_in">تسجيل الدخول</string> <string name="title_log_in">تسجيل الدخول</string>
<string name="title_share_the_app">انشر البرنامج</string>
<string name="title_register_username">اسم المستخدم</string> <string name="title_register_username">اسم المستخدم</string>
<string name="title_reset_password">إعادة تعيين كلمة السر</string> <string name="title_reset_password">إعادة تعيين كلمة السر</string>
<string name="title_sign_up">سجل</string> <string name="title_sign_up">سجل</string>
...@@ -21,7 +20,6 @@ ...@@ -21,7 +20,6 @@
<string name="title_admin_panel">لوحة الإدارة</string> <string name="title_admin_panel">لوحة الإدارة</string>
<string name="title_password">تغيير كلمة السر</string> <string name="title_password">تغيير كلمة السر</string>
<string name="title_update_profile">تحديث الملف الشخصي</string> <string name="title_update_profile">تحديث الملف الشخصي</string>
<string name="title_about">عنا</string>
<string name="title_create_channel">إنشاء قناة</string> <string name="title_create_channel">إنشاء قناة</string>
<string name="title_licence">الترخيص</string> <string name="title_licence">الترخيص</string>
<string name="title_are_you_sure">هل أنت متأكد؟</string> <string name="title_are_you_sure">هل أنت متأكد؟</string>
...@@ -35,6 +33,7 @@ ...@@ -35,6 +33,7 @@
<string name="action_use_this_username">استخدم هذا الاسم</string> <string name="action_use_this_username">استخدم هذا الاسم</string>
<string name="action_terms_of_service">شروط الخدمة</string> <string name="action_terms_of_service">شروط الخدمة</string>
<string name="action_privacy_policy">شروط الخدمة</string> <string name="action_privacy_policy">شروط الخدمة</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">بحث</string> <string name="action_search">بحث</string>
<string name="action_update">تحديث</string> <string name="action_update">تحديث</string>
<string name="action_settings">الإعدادات</string> <string name="action_settings">الإعدادات</string>
...@@ -44,11 +43,10 @@ ...@@ -44,11 +43,10 @@
<string name="action_attach_a_files">إضافة ملف</string> <string name="action_attach_a_files">إضافة ملف</string>
<string name="action_confirm_password">تأكيد تغيير كلمة السر</string> <string name="action_confirm_password">تأكيد تغيير كلمة السر</string>
<string name="action_join_chat">إنضم للمحادثة</string> <string name="action_join_chat">إنضم للمحادثة</string>
<string name="action_add_account">إضافة حساب</string> <string name="msg_online">متصل</string>
<string name="action_online">متصل</string> <string name="msg_away">بعيد</string>
<string name="action_away">بعيد</string> <string name="msg_busy">مشغول</string>
<string name="action_busy">مشغول</string> <string name="msg_invisible">مخفي</string>
<string name="action_invisible">مخفي</string>
<string name="action_drawing">رسم</string> <string name="action_drawing">رسم</string>
<string name="action_save_to_gallery">حفظ في المعرض</string> <string name="action_save_to_gallery">حفظ في المعرض</string>
<string name="action_select_photo_from_gallery">اختيار صورة من المعرض</string> <string name="action_select_photo_from_gallery">اختيار صورة من المعرض</string>
...@@ -59,21 +57,23 @@ ...@@ -59,21 +57,23 @@
<string name="action_create_server">إنشاء خادم جديد</string> <string name="action_create_server">إنشاء خادم جديد</string>
<string name="action_register">تسجيل</string> <string name="action_register">تسجيل</string>
<string name="action_confirm">تأكيد</string> <string name="action_confirm">تأكيد</string>
<string name="action_delete_account">حذف حساب</string>
<string name="action_favorite">Favorite</string> <!-- TODO Translate --> <string name="action_favorite">Favorite</string> <!-- TODO Translate -->
<string name="action_remove_favorite">Remove favorite</string> <!-- TODO Translate --> <string name="action_remove_favorite">Remove favorite</string> <!-- TODO Translate -->
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">التفضيلات</item> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">تغيير كلمة السر</item> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">نغيير اللغة</item> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">نشر البرنامج</item> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">قيمنا</item> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">اتصل بنا</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">الترخيص</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">عنا</item> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">نأسف حدث خطأ ما حاول مرة أخرى</string> <string name="msg_generic_error">نأسف حدث خطأ ما حاول مرة أخرى</string>
...@@ -182,6 +182,8 @@ ...@@ -182,6 +182,8 @@
<item quantity="two">%1$s reacted with %2$s</item> <item quantity="two">%1$s reacted with %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Credentials saved successfully</string> <!-- TODO Translate --> <string name="msg_credentials_saved_successfully">Credentials saved successfully</string> <!-- TODO Translate -->
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">خاص</string> <string name="msg_private_channel">خاص</string>
...@@ -314,14 +316,13 @@ ...@@ -314,14 +316,13 @@
<string name="msg_no_recent_emoji">لا يوجد ايموجيز </string> <string name="msg_no_recent_emoji">لا يوجد ايموجيز </string>
<string name="alert_title_default_skin_tone">نغمة الجلد الافتراضية</string> <string name="alert_title_default_skin_tone">نغمة الجلد الافتراضية</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">ترتيب</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">ترتيب حسب</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">أبجدي</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">النشاط</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">تجميع حسب النوع</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">تجميع المفصلات</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">العناوين</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favorites</string> <!-- TODO Translate --> <string name="header_favorite">Favorites</string> <!-- TODO Translate -->
...@@ -342,7 +343,6 @@ ...@@ -342,7 +343,6 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">المنظقة الزمنية</string> <string name="timezone">المنظقة الزمنية</string>
<string name="status" translatable="false">Status</string>
<!-- Report --> <!-- Report -->
<string name="submit">تأكيد</string> <string name="submit">تأكيد</string>
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">Anmelden am Server</string> <string name="title_sign_in_your_server">Anmelden am Server</string>
<string name="title_log_in">Anmelden</string> <string name="title_log_in">Anmelden</string>
<string name="title_share_the_app">App teilen</string>
<string name="title_register_username">Registriere Benutzernamen</string> <string name="title_register_username">Registriere Benutzernamen</string>
<string name="title_reset_password">Passwort zurücksetzen</string> <string name="title_reset_password">Passwort zurücksetzen</string>
<string name="title_sign_up">registrieren</string> <string name="title_sign_up">registrieren</string>
...@@ -14,17 +13,13 @@ ...@@ -14,17 +13,13 @@
<string name="title_members">Benutzer</string> <string name="title_members">Benutzer</string>
<string name="title_counted_members">Benutzer (%d)</string> <string name="title_counted_members">Benutzer (%d)</string>
<string name="title_settings">Einstellungen</string> <string name="title_settings">Einstellungen</string>
<string name="title_preferences">Eigenschaften</string> <string name="title_preferences">Eigenschaften</string>
<string name="title_change_password">Ändere Passwort</string> <string name="title_change_password">Ändere Passwort</string>
<string name="title_rate_us">Bewerten Sie uns</string> <string name="title_rate_us">Bewerten Sie uns</string>
<string name="title_admin_panel">Administrationsmenü</string> <string name="title_admin_panel">Administrationsmenü</string>
<string name="title_password">Ändere Passwort</string> <string name="title_password">Ändere Passwort</string>
<string name="title_update_profile">Update Profil</string> <string name="title_update_profile">Update Profil</string>
<string name="title_about">Über</string>
<string name="title_create_channel">Erstelle Raum</string> <string name="title_create_channel">Erstelle Raum</string>
<string name="title_are_you_sure">Sind Sie sicher?</string> <string name="title_are_you_sure">Sind Sie sicher?</string>
<string name="title_channel_details">Channel-Details</string> <string name="title_channel_details">Channel-Details</string>
<string name="title_topic">Thema</string> <string name="title_topic">Thema</string>
...@@ -37,6 +32,7 @@ ...@@ -37,6 +32,7 @@
<string name="action_use_this_username">Benutze den Benutzernamen</string> <string name="action_use_this_username">Benutze den Benutzernamen</string>
<string name="action_terms_of_service">Nutzungsbedingungen</string> <string name="action_terms_of_service">Nutzungsbedingungen</string>
<string name="action_privacy_policy">Datenschutz</string> <string name="action_privacy_policy">Datenschutz</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">Suche</string> <string name="action_search">Suche</string>
<string name="action_update">Updaten</string> <string name="action_update">Updaten</string>
<string name="action_settings">Einstellungen</string> <string name="action_settings">Einstellungen</string>
...@@ -46,11 +42,10 @@ ...@@ -46,11 +42,10 @@
<string name="action_attach_a_files">Eine Datei anhängen</string> <string name="action_attach_a_files">Eine Datei anhängen</string>
<string name="action_confirm_password">Bestätige Passwort Änderung</string> <string name="action_confirm_password">Bestätige Passwort Änderung</string>
<string name="action_join_chat">Trete Chat bei</string> <string name="action_join_chat">Trete Chat bei</string>
<string name="action_add_account">Erstelle Account</string> <string name="msg_online">Online</string>
<string name="action_online">Online</string> <string name="msg_away">Abwesend</string>
<string name="action_away">Abwesend</string> <string name="msg_busy">Beschäftigt</string>
<string name="action_busy">Beschäftigt</string> <string name="msg_invisible">Unsichtbar</string>
<string name="action_invisible">Unsichtbar</string>
<string name="action_drawing">Zeichnung</string> <string name="action_drawing">Zeichnung</string>
<string name="action_save_to_gallery">Sichern in Galerie</string> <string name="action_save_to_gallery">Sichern in Galerie</string>
<string name="action_select_photo_from_gallery">Foto aus der Galerie auswählen</string> <string name="action_select_photo_from_gallery">Foto aus der Galerie auswählen</string>
...@@ -61,21 +56,23 @@ ...@@ -61,21 +56,23 @@
<string name="action_create_server">Einen eigenen Server erstellen</string> <string name="action_create_server">Einen eigenen Server erstellen</string>
<string name="action_register">Registrieren</string> <string name="action_register">Registrieren</string>
<string name="action_confirm">Bestätigen</string> <string name="action_confirm">Bestätigen</string>
<string name="action_delete_account">Konto löschen</string> <string name="action_favorite">Favoriten</string>
<string name="action_favorite">Favoriten</string> <string name="action_remove_favorite">Favoriten entfernen</string>
<string name="action_remove_favorite">Favoriten entfernen</string>
<!-- Settings messages-->
<!-- Settings List --> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<string-array name="settings_actions"> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_preferences">Eigenschaften</item> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="item_password">Passwort ändern</item> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="change_language">Sprache ändern</item> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_share_app">Link zur App teilen</item> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_rate_us">Bewerten Sie uns</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_contact_us">Kontaktieren Sie uns</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_licence">Lizenz</item> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<item name="item_about">Über</item> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
</string-array> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">Entschuldigung, ein Fehler ist aufgetreten, bitte versuchen Sie es noch einmal.</string> <string name="msg_generic_error">Entschuldigung, ein Fehler ist aufgetreten, bitte versuchen Sie es noch einmal.</string>
...@@ -114,9 +111,7 @@ ...@@ -114,9 +111,7 @@
<string name="msg_content_description_log_in_using_gitlab">Login mit Gitlab</string> <string name="msg_content_description_log_in_using_gitlab">Login mit Gitlab</string>
<string name="msg_content_description_log_in_using_wordpress">Login mit WordPress</string> <string name="msg_content_description_log_in_using_wordpress">Login mit WordPress</string>
<string name="msg_content_description_send_message">Sende Nachricht</string> <string name="msg_content_description_send_message">Sende Nachricht</string>
<string name="msg_content_description_show_more_login_options">Zeige mehr Login-Optionen</string> <string name="msg_content_description_show_more_login_options">Zeige mehr Login-Optionen</string>
<string name="msg_content_description_show_attachment_options">Zeige Anhang Optionen</string> <string name="msg_content_description_show_attachment_options">Zeige Anhang Optionen</string>
<string name="msg_you">Du</string> <string name="msg_you">Du</string>
<string name="msg_unknown">Unbekannt</string> <string name="msg_unknown">Unbekannt</string>
...@@ -178,7 +173,8 @@ ...@@ -178,7 +173,8 @@
<item quantity="other">%1$s reagierte mit %2$s</item> <item quantity="other">%1$s reagierte mit %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Login-Daten erfolgreich gespeichert</string> <string name="msg_credentials_saved_successfully">Login-Daten erfolgreich gespeichert</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Privat</string> <string name="msg_private_channel">Privat</string>
...@@ -315,14 +311,13 @@ ...@@ -315,14 +311,13 @@
<string name="msg_no_recent_emoji">Keine letzten Emojis</string> <string name="msg_no_recent_emoji">Keine letzten Emojis</string>
<string name="alert_title_default_skin_tone">Standard Hautton</string> <string name="alert_title_default_skin_tone">Standard Hautton</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">Sortiere</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">Sortieren nach</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">Alphabetisch</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">Aktivität</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">Räume nach Typ</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">Räume nach Favoriten</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">Kopf</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favoriten</string> <string name="header_favorite">Favoriten</string>
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">Inicia sesión en tu servidor</string> <string name="title_sign_in_your_server">Inicia sesión en tu servidor</string>
<string name="title_log_in">Iniciar sesión</string> <string name="title_log_in">Iniciar sesión</string>
<string name="title_share_the_app">Compartir aplicación</string>
<string name="title_register_username">Registrar nombre de usuario</string> <string name="title_register_username">Registrar nombre de usuario</string>
<string name="title_reset_password">Restablecer la contraseña</string> <string name="title_reset_password">Restablecer la contraseña</string>
<string name="title_sign_up">Regístrate</string> <string name="title_sign_up">Regístrate</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">Admin panel</string> <!-- TODO Add translation --> <string name="title_admin_panel">Admin panel</string> <!-- TODO Add translation -->
<string name="title_password">Cambia la contraseña</string> <string name="title_password">Cambia la contraseña</string>
<string name="title_update_profile">Actualización del perfil</string> <string name="title_update_profile">Actualización del perfil</string>
<string name="title_about">Acerca de</string>
<string name="title_create_channel">Crear canal</string> <string name="title_create_channel">Crear canal</string>
<string name="title_licence">Licence</string> <!-- TODO Add translation --> <string name="title_licence">Licence</string> <!-- TODO Add translation -->
<string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation --> <string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation -->
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">Usa este nombre de usuario</string> <string name="action_use_this_username">Usa este nombre de usuario</string>
<string name="action_terms_of_service">Términos de Servicio</string> <string name="action_terms_of_service">Términos de Servicio</string>
<string name="action_privacy_policy">Política de Privacidad</string> <string name="action_privacy_policy">Política de Privacidad</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">Buscar</string> <string name="action_search">Buscar</string>
<string name="action_update">Actualizar</string> <string name="action_update">Actualizar</string>
<string name="action_settings">Configuraciones</string> <string name="action_settings">Configuraciones</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">Attach a file</string> <!-- TODO Add translation --> <string name="action_attach_a_files">Attach a file</string> <!-- TODO Add translation -->
<string name="action_confirm_password">Confirmar cambio de contraseña</string> <string name="action_confirm_password">Confirmar cambio de contraseña</string>
<string name="action_join_chat">Unirse al chat</string> <string name="action_join_chat">Unirse al chat</string>
<string name="action_add_account">Añadir cuenta</string> <string name="msg_online">Conectado(s)</string>
<string name="action_online">Conectado(s)</string> <string name="msg_away">Ausente</string>
<string name="action_away">Ausente</string> <string name="msg_busy">Ocupado</string>
<string name="action_busy">Ocupado</string> <string name="msg_invisible">Invisible</string>
<string name="action_invisible">Invisible</string>
<string name="action_drawing">Dibujo</string> <string name="action_drawing">Dibujo</string>
<string name="action_save_to_gallery">Guardar en la galería</string> <string name="action_save_to_gallery">Guardar en la galería</string>
<string name="action_select_photo_from_gallery">Select photo from gallery</string> <!-- TODO Add translation --> <string name="action_select_photo_from_gallery">Select photo from gallery</string> <!-- TODO Add translation -->
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">Create a new server</string> <!-- TODO Add translation --> <string name="action_create_server">Create a new server</string> <!-- TODO Add translation -->
<string name="action_register">Register</string> <!-- TODO Add translation --> <string name="action_register">Register</string> <!-- TODO Add translation -->
<string name="action_confirm">Confirm</string> <!-- TODO Add translation --> <string name="action_confirm">Confirm</string> <!-- TODO Add translation -->
<string name="action_delete_account">Delete account</string> <!-- TODO Add translation -->
<string name="action_favorite">Favorite</string> <!-- TODO Add translation --> <string name="action_favorite">Favorite</string> <!-- TODO Add translation -->
<string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation --> <string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">Preferences</item> <!-- TODO Add translation --> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">Change password</item> <!-- TODO Add translation --> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">Change language</item> <!-- TODO Add translation --> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">Share app</item> <!-- TODO Add translation --> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">Rate us</item> <!-- TODO Add translation --> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">Contact us</item> <!-- TODO Add translation --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">Licence</item> <!-- TODO Add translation --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">About</item> <!-- TODO Add translation --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">Lo sentimos, ha ocurrido un error, por favor intente de nuevo</string> <string name="msg_generic_error">Lo sentimos, ha ocurrido un error, por favor intente de nuevo</string>
...@@ -162,6 +162,8 @@ ...@@ -162,6 +162,8 @@
<string name="msg_continue_with_wordpress">Continue with <b>WordPress</b></string> <!-- TODO Add translation --> <string name="msg_continue_with_wordpress">Continue with <b>WordPress</b></string> <!-- TODO Add translation -->
<string name="msg_two_factor_authentication">Two-factor Authentication</string> <!-- TODO Add translation --> <string name="msg_two_factor_authentication">Two-factor Authentication</string> <!-- TODO Add translation -->
<string name="msg__your_2fa_code">What’s your 2FA code?</string> <!-- TODO Add translation --> <string name="msg__your_2fa_code">What’s your 2FA code?</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Privado</string> <string name="msg_private_channel">Privado</string>
...@@ -306,14 +308,13 @@ ...@@ -306,14 +308,13 @@
<string name="msg_no_recent_emoji">Sin emojis recientes</string> <string name="msg_no_recent_emoji">Sin emojis recientes</string>
<string name="alert_title_default_skin_tone">Tono de piel predeterminado</string> <string name="alert_title_default_skin_tone">Tono de piel predeterminado</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">Ordenar</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">Ordenar por</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">Alfabético</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">Actividad</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">Agrupar por tipo</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">Agrupar favoritos</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">Cabezazo</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">به سرور خود متصل شوید</string> <string name="title_sign_in_your_server">به سرور خود متصل شوید</string>
<string name="title_log_in">ورود</string> <string name="title_log_in">ورود</string>
<string name="title_share_the_app">به اشتراک‌گذاری اپلیکیشن</string>
<string name="title_register_username">ثبت شناسه‌ی کاربری</string> <string name="title_register_username">ثبت شناسه‌ی کاربری</string>
<string name="title_reset_password">تعویض گذرواژه</string> <string name="title_reset_password">تعویض گذرواژه</string>
<string name="title_sign_up">ثبت‌‌نام کنید</string> <string name="title_sign_up">ثبت‌‌نام کنید</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">Admin panel</string> <!-- TODO Add translation --> <string name="title_admin_panel">Admin panel</string> <!-- TODO Add translation -->
<string name="title_password">تغییر گذرواژه</string> <string name="title_password">تغییر گذرواژه</string>
<string name="title_update_profile">به روزرسانی نمایه</string> <string name="title_update_profile">به روزرسانی نمایه</string>
<string name="title_about">درباره</string>
<string name="title_create_channel">ایجاد کانال</string> <string name="title_create_channel">ایجاد کانال</string>
<string name="title_licence">مجوز</string> <string name="title_licence">مجوز</string>
<string name="title_are_you_sure">آیا مطمئن هستید؟</string> <string name="title_are_you_sure">آیا مطمئن هستید؟</string>
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">از این شناسه‌ی کاربری استفاده کنید</string> <string name="action_use_this_username">از این شناسه‌ی کاربری استفاده کنید</string>
<string name="action_terms_of_service">شرایط خدمات رسانی</string> <string name="action_terms_of_service">شرایط خدمات رسانی</string>
<string name="action_privacy_policy">سیاست حفظ جریم خصوصی</string> <string name="action_privacy_policy">سیاست حفظ جریم خصوصی</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">جست‌وجو</string> <string name="action_search">جست‌وجو</string>
<string name="action_update">به روزرسانی</string> <string name="action_update">به روزرسانی</string>
<string name="action_settings">تنظیمات</string> <string name="action_settings">تنظیمات</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">ضمیمه کردن پرونده</string> <string name="action_attach_a_files">ضمیمه کردن پرونده</string>
<string name="action_confirm_password">موافقت با تغییر گذرواژه</string> <string name="action_confirm_password">موافقت با تغییر گذرواژه</string>
<string name="action_join_chat">به گفت‌وگو بپیوندید</string> <string name="action_join_chat">به گفت‌وگو بپیوندید</string>
<string name="action_add_account">اضافه کردن حساب کاربری</string> <string name="msg_online">آنلاین</string>
<string name="action_online">آنلاین</string> <string name="msg_away">Away</string> <!-- TODO Add translation -->
<string name="action_away">Away</string> <!-- TODO Add translation --> <string name="msg_busy">مشغول</string>
<string name="action_busy">مشغول</string> <string name="msg_invisible">نامرئی</string>
<string name="action_invisible">نامرئی</string>
<string name="action_drawing">کشیدن</string> <string name="action_drawing">کشیدن</string>
<string name="action_save_to_gallery">ذخیره در آلبوم</string> <string name="action_save_to_gallery">ذخیره در آلبوم</string>
<string name="action_select_photo_from_gallery">انتخاب عکس از آلبوم</string> <string name="action_select_photo_from_gallery">انتخاب عکس از آلبوم</string>
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">ایجاد سرور جدید</string> <string name="action_create_server">ایجاد سرور جدید</string>
<string name="action_register">ثبت‌نام</string> <string name="action_register">ثبت‌نام</string>
<string name="action_confirm">تایید</string> <string name="action_confirm">تایید</string>
<string name="action_delete_account">حذف حساب کاربری</string>
<string name="action_favorite">Favorite</string> <!-- TODO Add translation --> <string name="action_favorite">Favorite</string> <!-- TODO Add translation -->
<string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation --> <string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">ترجیحات</item> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">تغییر گذرواژه</item> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="item_share_app">به اشتراک‌گذاری اپلیکیشن</item> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="change_language">Change language</item> <!-- TODO Add translation --> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">به ما امتیاز دهید</item> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">تماس با ما</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">مجوز</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">درباره</item> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">متاسفانه مشکلی رخ داد، لطفا دوباره تلاش کنید</string> <string name="msg_generic_error">متاسفانه مشکلی رخ داد، لطفا دوباره تلاش کنید</string>
...@@ -177,6 +177,8 @@ ...@@ -177,6 +177,8 @@
<item quantity="other">%1$s reacted with %2$s</item> <item quantity="other">%1$s reacted with %2$s</item>
</plurals> <!-- TODO Add translation --> </plurals> <!-- TODO Add translation -->
<string name="msg_credentials_saved_successfully">اختیارها با موفقیت ذخیره شد</string> <string name="msg_credentials_saved_successfully">اختیارها با موفقیت ذخیره شد</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">خصوصی</string> <string name="msg_private_channel">خصوصی</string>
...@@ -309,14 +311,13 @@ ...@@ -309,14 +311,13 @@
<string name="msg_no_recent_emoji">هیچ ایموجی اخیری موجود نیست</string> <string name="msg_no_recent_emoji">هیچ ایموجی اخیری موجود نیست</string>
<string name="alert_title_default_skin_tone">مدل پوسته‌ی پیش‌فرض</string> <string name="alert_title_default_skin_tone">مدل پوسته‌ی پیش‌فرض</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">دسته بندی</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">دسته بندی بر اساس</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">الفبا</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">فعالیت</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">گروه کردن بر اساس نوع</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">گروه کردن موردعلاقه‌ها</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">سرپیام</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">Connectez-vous sur votre serveur</string> <string name="title_sign_in_your_server">Connectez-vous sur votre serveur</string>
<string name="title_log_in">S\'identifier</string> <string name="title_log_in">S\'identifier</string>
<string name="title_share_the_app">Partager l\'application</string>
<string name="title_register_username">Enregistrer le nom d\'utilisateur</string> <string name="title_register_username">Enregistrer le nom d\'utilisateur</string>
<string name="title_reset_password">Réinitialiser mot de passe</string> <string name="title_reset_password">Réinitialiser mot de passe</string>
<string name="title_sign_up">S\'inscrire</string> <string name="title_sign_up">S\'inscrire</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">l\' administration</string> <string name="title_admin_panel">l\' administration</string>
<string name="title_password">Changer le mot de passe</string> <string name="title_password">Changer le mot de passe</string>
<string name="title_update_profile">Mettre à jour le profil</string> <string name="title_update_profile">Mettre à jour le profil</string>
<string name="title_about">À propos</string>
<string name="title_create_channel">Créer salon</string> <string name="title_create_channel">Créer salon</string>
<string name="title_licence">les permis</string> <string name="title_licence">les permis</string>
<string name="title_are_you_sure">Êtes-vous sûr?</string> <string name="title_are_you_sure">Êtes-vous sûr?</string>
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">Utilisez ce nom d\'utilisateur</string> <string name="action_use_this_username">Utilisez ce nom d\'utilisateur</string>
<string name="action_terms_of_service">Conditions d\'utilisation</string> <string name="action_terms_of_service">Conditions d\'utilisation</string>
<string name="action_privacy_policy">Politique de confidentialité</string> <string name="action_privacy_policy">Politique de confidentialité</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">Chercher</string> <string name="action_search">Chercher</string>
<string name="action_update">Mettre à jour</string> <string name="action_update">Mettre à jour</string>
<string name="action_settings">Paramètres</string> <string name="action_settings">Paramètres</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">Joindre un fichier</string> <string name="action_attach_a_files">Joindre un fichier</string>
<string name="action_confirm_password">Confirmer le mot de passe</string> <string name="action_confirm_password">Confirmer le mot de passe</string>
<string name="action_join_chat">Rejoignez le chat</string> <string name="action_join_chat">Rejoignez le chat</string>
<string name="action_add_account">Ajouter un compte</string> <string name="msg_online">En ligne</string>
<string name="action_online">En ligne</string> <string name="msg_away">Loin</string>
<string name="action_away">Loin</string> <string name="msg_busy">Occupé</string>
<string name="action_busy">Occupé</string> <string name="msg_invisible">Invisible</string>
<string name="action_invisible">Invisible</string>
<string name="action_drawing">Dessin</string> <string name="action_drawing">Dessin</string>
<string name="action_save_to_gallery">Sauvegarder vers la gallerie</string> <string name="action_save_to_gallery">Sauvegarder vers la gallerie</string>
<string name="action_select_photo_from_gallery">Sélectionner depuis la gallerie</string> <string name="action_select_photo_from_gallery">Sélectionner depuis la gallerie</string>
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">Créer un nouveau serveur</string> <string name="action_create_server">Créer un nouveau serveur</string>
<string name="action_register">registre</string> <string name="action_register">registre</string>
<string name="action_confirm">Confirmer</string> <string name="action_confirm">Confirmer</string>
<string name="action_delete_account">Effacer le compte</string>
<string name="action_favorite">Favorite</string> <!-- TODO Add translation --> <string name="action_favorite">Favorite</string> <!-- TODO Add translation -->
<string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation --> <string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">Préférences</item> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">Changer le mot de passe</item> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">Changer de langue</item> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">Partager l\'application</item> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">Évaluez nous</item> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">Contactez nous</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">les permis</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">Sur</item> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">Désolé, une erreur s\'est produite. Veuillez réessayer</string> <string name="msg_generic_error">Désolé, une erreur s\'est produite. Veuillez réessayer</string>
...@@ -181,6 +181,8 @@ ...@@ -181,6 +181,8 @@
<item quantity="other">%1$s a réagi avec %2$s</item> <item quantity="other">%1$s a réagi avec %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Certificats sauvegardés</string> <string name="msg_credentials_saved_successfully">Certificats sauvegardés</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Privé</string> <string name="msg_private_channel">Privé</string>
...@@ -307,14 +309,13 @@ ...@@ -307,14 +309,13 @@
<string name="msg_no_recent_emoji">Aucun emoji récent</string> <string name="msg_no_recent_emoji">Aucun emoji récent</string>
<string name="alert_title_default_skin_tone">Tonalité de peau par défaut</string> <string name="alert_title_default_skin_tone">Tonalité de peau par défaut</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">Trier</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">Trier par</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">Alphabétique</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">Activité</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">Grouper par type</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">Grouper favoris</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">Entête</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favoris</string> <string name="header_favorite">Favoris</string>
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">अपने सर्वर में साइन इन करें</string> <string name="title_sign_in_your_server">अपने सर्वर में साइन इन करें</string>
<string name="title_log_in">लॉग इन करें</string> <string name="title_log_in">लॉग इन करें</string>
<string name="title_share_the_app">ऐप शेयर करे</string>
<string name="title_register_username">रजिस्टर उपयोगकर्ता नाम</string> <string name="title_register_username">रजिस्टर उपयोगकर्ता नाम</string>
<string name="title_reset_password">पासवर्ड रीसेट करें</string> <string name="title_reset_password">पासवर्ड रीसेट करें</string>
<string name="title_sign_up">साइन अप करें</string> <string name="title_sign_up">साइन अप करें</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">एडमिन पैनल</string> <string name="title_admin_panel">एडमिन पैनल</string>
<string name="title_password">पासवर्ड बदलें</string> <string name="title_password">पासवर्ड बदलें</string>
<string name="title_update_profile">प्रोफ़ाइल अपडेट करें</string> <string name="title_update_profile">प्रोफ़ाइल अपडेट करें</string>
<string name="title_about">परिचय</string>
<string name="title_create_channel">चैनल बनाएं</string> <string name="title_create_channel">चैनल बनाएं</string>
<string name="title_licence">लाइसेंस</string> <string name="title_licence">लाइसेंस</string>
<string name="title_are_you_sure">क्या आपको यकीन है?</string> <string name="title_are_you_sure">क्या आपको यकीन है?</string>
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">इस उपयोगकर्ता नाम का उपयोग करें</string> <string name="action_use_this_username">इस उपयोगकर्ता नाम का उपयोग करें</string>
<string name="action_terms_of_service">सेवा की शर्तें</string> <string name="action_terms_of_service">सेवा की शर्तें</string>
<string name="action_privacy_policy">गोपनीयता नीति</string> <string name="action_privacy_policy">गोपनीयता नीति</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">खोजें</string> <string name="action_search">खोजें</string>
<string name="action_update">अद्यतन करें</string> <string name="action_update">अद्यतन करें</string>
<string name="action_settings">सेटिंग्स</string> <string name="action_settings">सेटिंग्स</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">एक फ़ाइल जोडो</string> <string name="action_attach_a_files">एक फ़ाइल जोडो</string>
<string name="action_confirm_password">पासवर्ड परिवर्तन की पुष्टि करें</string> <string name="action_confirm_password">पासवर्ड परिवर्तन की पुष्टि करें</string>
<string name="action_join_chat">चैट में शामिल हों</string> <string name="action_join_chat">चैट में शामिल हों</string>
<string name="action_add_account">खाता जोड़ो</string> <string name="msg_online">ऑनलाइन</string>
<string name="action_online">ऑनलाइन</string> <string name="msg_away">दूर</string>
<string name="action_away">दूर</string> <string name="msg_busy">व्यस्त</string>
<string name="action_busy">व्यस्त</string> <string name="msg_invisible">अदृश्य</string>
<string name="action_invisible">अदृश्य</string>
<string name="action_save_to_gallery">गैलरी में सहेजें</string> <string name="action_save_to_gallery">गैलरी में सहेजें</string>
<string name="action_drawing">चित्रकारी</string> <string name="action_drawing">चित्रकारी</string>
<string name="action_select_photo_from_gallery">गैलरी से फोटो का चयन करें</string> <string name="action_select_photo_from_gallery">गैलरी से फोटो का चयन करें</string>
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">नया सर्वर बनाएं</string> <string name="action_create_server">नया सर्वर बनाएं</string>
<string name="action_register">रजिस्टर</string> <string name="action_register">रजिस्टर</string>
<string name="action_confirm">पुष्टि करें</string> <string name="action_confirm">पुष्टि करें</string>
<string name="action_delete_account">खाता हटा दो</string>
<string name="action_favorite">Favorite</string> <!-- TODO Add translation --> <string name="action_favorite">Favorite</string> <!-- TODO Add translation -->
<string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation --> <string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">पसंद</item> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">पासवर्ड बदलें</item> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">भाषा बदलें</item> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">ऐप शेयर करें</item> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">हमें रेटिंग दें</item> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">हमसे संपर्क करें</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">लाइसेंस</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">के बारे में</item> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">क्षमा करें, एक त्रुटि हुई है, कृपया पुनः प्रयास करें</string> <string name="msg_generic_error">क्षमा करें, एक त्रुटि हुई है, कृपया पुनः प्रयास करें</string>
...@@ -196,6 +196,8 @@ ...@@ -196,6 +196,8 @@
<item quantity="many">%1$s ने %2$s के साथ प्रतिक्रिया व्यक्त की</item> <item quantity="many">%1$s ने %2$s के साथ प्रतिक्रिया व्यक्त की</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">प्रमाण पत्र सफलतापूर्वक सहेजे गए</string> <string name="msg_credentials_saved_successfully">प्रमाण पत्र सफलतापूर्वक सहेजे गए</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Preferences messages --> <!-- Preferences messages -->
<string name="msg_analytics_tracking">एनालिटिक्स ट्रैकिंग</string> <string name="msg_analytics_tracking">एनालिटिक्स ट्रैकिंग</string>
...@@ -310,14 +312,13 @@ ...@@ -310,14 +312,13 @@
<string name="msg_no_recent_emoji"> कोई नया इमोजी नहीं</string> <string name="msg_no_recent_emoji"> कोई नया इमोजी नहीं</string>
<string name="alert_title_default_skin_tone">डिफ़ॉल्ट त्वचा टोन</string> <string name="alert_title_default_skin_tone">डिफ़ॉल्ट त्वचा टोन</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">क्रम</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">द्वारा सॉर्ट करें</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">वर्णानुक्रम</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">गतिविधि</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">प्रकार के आधार पर समूह</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">पसंदीदा समूह</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">हैडर</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">पसंदीदा</string> <string name="header_favorite">पसंदीदा</string>
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">Accedi al tuo server</string> <string name="title_sign_in_your_server">Accedi al tuo server</string>
<string name="title_log_in">Accesso</string> <string name="title_log_in">Accesso</string>
<string name="title_share_the_app">Condividi la App</string>
<string name="title_register_username">Registra nome utente</string> <string name="title_register_username">Registra nome utente</string>
<string name="title_reset_password">Annullare password</string> <string name="title_reset_password">Annullare password</string>
<string name="title_sign_up">Iscrizione</string> <string name="title_sign_up">Iscrizione</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">Pannello di Amministrazione</string> <string name="title_admin_panel">Pannello di Amministrazione</string>
<string name="title_password">Password</string> <string name="title_password">Password</string>
<string name="title_update_profile">Aggiorna Profilo</string> <string name="title_update_profile">Aggiorna Profilo</string>
<string name="title_about">Informazioni</string>
<string name="title_create_channel">Crea Canale</string> <string name="title_create_channel">Crea Canale</string>
<string name="title_licence">licenza</string> <string name="title_licence">licenza</string>
<string name="title_are_you_sure">Sei sicuro che vuoi uscire ?</string> <string name="title_are_you_sure">Sei sicuro che vuoi uscire ?</string>
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">Usa questo nome utente</string> <string name="action_use_this_username">Usa questo nome utente</string>
<string name="action_terms_of_service">Termini di Servizio</string> <string name="action_terms_of_service">Termini di Servizio</string>
<string name="action_privacy_policy">Politica sulla Riservatezza</string> <string name="action_privacy_policy">Politica sulla Riservatezza</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">Cerca</string> <string name="action_search">Cerca</string>
<string name="action_update">Aggiorna</string> <string name="action_update">Aggiorna</string>
<string name="action_settings">Parametri</string> <string name="action_settings">Parametri</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">Ceangail comhad</string> <string name="action_attach_a_files">Ceangail comhad</string>
<string name="action_confirm_password">Conferma Cambio Password</string> <string name="action_confirm_password">Conferma Cambio Password</string>
<string name="action_join_chat">Iscriviti alla stanza</string> <string name="action_join_chat">Iscriviti alla stanza</string>
<string name="action_add_account">Aggiungi utente</string> <string name="msg_online">In linea</string>
<string name="action_online">In linea</string> <string name="msg_away">Lontano</string>
<string name="action_away">Lontano</string> <string name="msg_busy">Occupato</string>
<string name="action_busy">Occupato</string> <string name="msg_invisible">Invisibile</string>
<string name="action_invisible">Invisibile</string>
<string name="action_drawing">Disegno</string> <string name="action_drawing">Disegno</string>
<string name="action_save_to_gallery">Salva in galleria</string> <string name="action_save_to_gallery">Salva in galleria</string>
<string name="action_select_photo_from_gallery">Seleziona foto dalla galleria</string> <string name="action_select_photo_from_gallery">Seleziona foto dalla galleria</string>
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">Crea un nuovo server</string> <string name="action_create_server">Crea un nuovo server</string>
<string name="action_register">Registra</string> <string name="action_register">Registra</string>
<string name="action_confirm">Conferma</string> <string name="action_confirm">Conferma</string>
<string name="action_delete_account">Elimina utente</string>
<string name="action_favorite">Favorite</string> <!-- TODO Add translation --> <string name="action_favorite">Favorite</string> <!-- TODO Add translation -->
<string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation --> <string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">Preferenze</item> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">Cambia password</item> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">Cambia lingua</item> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">Condividi app</item> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">Votaci</item> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">Contattaci</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">Licenza</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">Di</item> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">Mi dispiace, si è verificato un errore, per favore riprova</string> <string name="msg_generic_error">Mi dispiace, si è verificato un errore, per favore riprova</string>
...@@ -174,6 +174,8 @@ ...@@ -174,6 +174,8 @@
<item quantity="other">%1$s ha reagito con %2$s</item> <item quantity="other">%1$s ha reagito con %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Credenziali salvate con successo</string> <string name="msg_credentials_saved_successfully">Credenziali salvate con successo</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Privato</string> <string name="msg_private_channel">Privato</string>
...@@ -306,14 +308,13 @@ ...@@ -306,14 +308,13 @@
<string name="msg_no_recent_emoji">No recent emojis</string> <string name="msg_no_recent_emoji">No recent emojis</string>
<string name="alert_title_default_skin_tone">Default skin tone</string> <string name="alert_title_default_skin_tone">Default skin tone</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">Ordinare</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">Ordinare per</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">Alfabeto</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">Attività</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">Raggruppa per tipo</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">Raggruppa preferiti</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">Intestazione</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">サーバーに接続</string> <string name="title_sign_in_your_server">サーバーに接続</string>
<string name="title_log_in">ログイン</string> <string name="title_log_in">ログイン</string>
<string name="title_share_the_app">アプリを共有する</string>
<string name="title_register_username">ユーザー名を登録する</string> <string name="title_register_username">ユーザー名を登録する</string>
<string name="title_reset_password">パスワードリセット</string> <string name="title_reset_password">パスワードリセット</string>
<string name="title_sign_up">サインアップ</string> <string name="title_sign_up">サインアップ</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">管理パネル</string> <string name="title_admin_panel">管理パネル</string>
<string name="title_password">パスワードの変更</string> <string name="title_password">パスワードの変更</string>
<string name="title_update_profile">プロフィールの更新</string> <string name="title_update_profile">プロフィールの更新</string>
<string name="title_about">About</string><!-- TODO Add translation -->
<string name="title_licence">Licence</string> <!-- TODO Add translation --> <string name="title_licence">Licence</string> <!-- TODO Add translation -->
<string name="title_create_channel">新しいチャネルを作成</string> <string name="title_create_channel">新しいチャネルを作成</string>
<string name="title_are_you_sure">本気ですか?</string> <string name="title_are_you_sure">本気ですか?</string>
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">このユーザー名を使用する</string> <string name="action_use_this_username">このユーザー名を使用する</string>
<string name="action_terms_of_service">サービス利用規約</string> <string name="action_terms_of_service">サービス利用規約</string>
<string name="action_privacy_policy">プライバシーポリシー</string> <string name="action_privacy_policy">プライバシーポリシー</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">検索</string> <string name="action_search">検索</string>
<string name="action_update">更新</string> <string name="action_update">更新</string>
<string name="action_settings">設定</string> <string name="action_settings">設定</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">Attach a file</string> <!-- TODO Add translation --> <string name="action_attach_a_files">Attach a file</string> <!-- TODO Add translation -->
<string name="action_confirm_password">変更したパスワードの確認</string> <string name="action_confirm_password">変更したパスワードの確認</string>
<string name="action_join_chat">チャットに参加</string> <string name="action_join_chat">チャットに参加</string>
<string name="action_add_account">サーバーの追加</string> <string name="msg_online">オンライン</string>
<string name="action_online">オンライン</string> <string name="msg_away">離席中</string>
<string name="action_away">離席中</string> <string name="msg_busy">取り込み中</string>
<string name="action_busy">取り込み中</string> <string name="msg_invisible">状態を隠す</string>
<string name="action_invisible">状態を隠す</string>
<string name="action_drawing">絵を描く</string> <string name="action_drawing">絵を描く</string>
<string name="action_save_to_gallery">ギャラリーに保存</string> <string name="action_save_to_gallery">ギャラリーに保存</string>
<string name="action_select_photo_from_gallery">ギャラリーの写真を選択</string> <string name="action_select_photo_from_gallery">ギャラリーの写真を選択</string>
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">新規サーバーを作成</string> <string name="action_create_server">新規サーバーを作成</string>
<string name="action_register">登録</string> <string name="action_register">登録</string>
<string name="action_confirm">確認</string> <string name="action_confirm">確認</string>
<string name="action_delete_account">アカウントを削除する</string>
<string name="action_favorite">Favorite</string> <!-- TODO Add translation --> <string name="action_favorite">Favorite</string> <!-- TODO Add translation -->
<string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation --> <string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">Preferences</item> <!-- TODO Add translation --> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">Change password</item> <!-- TODO Add translation --> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">Change language </item><!-- TODO Add translation --> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">Share app</item> <!-- TODO Add translation --> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">Rate us</item> <!-- TODO Add translation --> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">Contact us</item> <!-- TODO Add translation --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">Licence</item> <!-- TODO Add translation --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">About</item> <!-- TODO Add translation --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">エラーが発生しました。もう一度お試しください。</string> <string name="msg_generic_error">エラーが発生しました。もう一度お試しください。</string>
...@@ -177,6 +177,8 @@ ...@@ -177,6 +177,8 @@
<item quantity="other">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation --> <item quantity="other">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation -->
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">資格情報を正常に保存しました</string> <string name="msg_credentials_saved_successfully">資格情報を正常に保存しました</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">プライベート</string> <string name="msg_private_channel">プライベート</string>
...@@ -309,15 +311,13 @@ ...@@ -309,15 +311,13 @@
<string name="msg_no_recent_emoji">最近の絵文字はありません</string> <string name="msg_no_recent_emoji">最近の絵文字はありません</string>
<string name="alert_title_default_skin_tone">デフォルトスキントークン</string> <string name="alert_title_default_skin_tone">デフォルトスキントークン</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">ソート</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">ソート</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">アルファベット順</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">アクティビティ順</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">グループ別</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">お気に入りのグループ</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">ヘッダ</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">Faça login no seu servidor</string> <string name="title_sign_in_your_server">Faça login no seu servidor</string>
<string name="title_log_in">Entrar</string> <string name="title_log_in">Entrar</string>
<string name="title_share_the_app">Compartilhe o aplicativo</string>
<string name="title_register_username">Registre o nome de usuário</string> <string name="title_register_username">Registre o nome de usuário</string>
<string name="title_reset_password">Redefinir senha</string> <string name="title_reset_password">Redefinir senha</string>
<string name="title_sign_up">Inscreva-se</string> <string name="title_sign_up">Inscreva-se</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">Painel administrativo</string> <string name="title_admin_panel">Painel administrativo</string>
<string name="title_password">Alterar senha</string> <string name="title_password">Alterar senha</string>
<string name="title_update_profile">Editar perfil</string> <string name="title_update_profile">Editar perfil</string>
<string name="title_about">Sobre</string>
<string name="title_create_channel">Criar chat</string> <string name="title_create_channel">Criar chat</string>
<string name="title_licence">Licença</string> <string name="title_licence">Licença</string>
<string name="title_are_you_sure">Você tem certeza?</string> <string name="title_are_you_sure">Você tem certeza?</string>
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">Usar este nome de usuário</string> <string name="action_use_this_username">Usar este nome de usuário</string>
<string name="action_terms_of_service">Termos de Serviço</string> <string name="action_terms_of_service">Termos de Serviço</string>
<string name="action_privacy_policy">Política de Privacidade</string> <string name="action_privacy_policy">Política de Privacidade</string>
<string name="action_new_channel">Novo canal</string>
<string name="action_search">Pesquisar</string> <string name="action_search">Pesquisar</string>
<string name="action_update">Atualizar</string> <string name="action_update">Atualizar</string>
<string name="action_settings">Configurações</string> <string name="action_settings">Configurações</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">Anexar um arquivo</string> <string name="action_attach_a_files">Anexar um arquivo</string>
<string name="action_confirm_password">Confirme a nova senha</string> <string name="action_confirm_password">Confirme a nova senha</string>
<string name="action_join_chat">Entrar no Chat</string> <string name="action_join_chat">Entrar no Chat</string>
<string name="action_add_account">Adicionar conta</string> <string name="msg_online">Online</string>
<string name="action_online">Online</string> <string name="msg_away">Ausente</string>
<string name="action_away">Ausente</string> <string name="msg_busy">Ocupado</string>
<string name="action_busy">Ocupado</string> <string name="msg_invisible">Invisível</string>
<string name="action_invisible">Invisível</string>
<string name="action_drawing">Desenhando</string> <string name="action_drawing">Desenhando</string>
<string name="action_save_to_gallery">Salvar na galeria</string> <string name="action_save_to_gallery">Salvar na galeria</string>
<string name="action_select_photo_from_gallery">Escolher foto da galeria</string> <string name="action_select_photo_from_gallery">Escolher foto da galeria</string>
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">Criar um novo servidor</string> <string name="action_create_server">Criar um novo servidor</string>
<string name="action_register">Registrar</string> <string name="action_register">Registrar</string>
<string name="action_confirm">Confirmar</string> <string name="action_confirm">Confirmar</string>
<string name="action_delete_account">Deletar conta</string>
<string name="action_favorite">Favoritar</string> <string name="action_favorite">Favoritar</string>
<string name="action_remove_favorite">Remover favorito</string> <string name="action_remove_favorite">Remover favorito</string>
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">Preferências</item> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">Alterar senha</item> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">Alterar idioma</item> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">Compartilhar app</item> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">Classifique-nos</item> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">Contate-nos</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">Licença</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">Sobre</item> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">Desculpe, ocorreu um erro, tente novamente</string> <string name="msg_generic_error">Desculpe, ocorreu um erro, tente novamente</string>
...@@ -177,12 +177,13 @@ ...@@ -177,12 +177,13 @@
<string name="msg_no_description">Nenhuma descrição</string> <string name="msg_no_description">Nenhuma descrição</string>
<string name="msg_unable_to_update_password">Não foi possível atualizar a senha. Mensagem de erro: %1$s</string> <string name="msg_unable_to_update_password">Não foi possível atualizar a senha. Mensagem de erro: %1$s</string>
<string name="msg_password_updated_successfully">Senha alterada com sucesso</string> <string name="msg_password_updated_successfully">Senha alterada com sucesso</string>
<string name="msg_sort">Ordenar</string>
<plurals name="msg_reacted_with_"> <plurals name="msg_reacted_with_">
<item quantity="one">%1$s reagiu com %2$s</item> <item quantity="one">%1$s reagiu com %2$s</item>
<item quantity="other">%1$s reagiram com %2$s</item> <item quantity="other">%1$s reagiram com %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Credenciais salvas com sucesso</string> <string name="msg_credentials_saved_successfully">Credenciais salvas com sucesso</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Privado</string> <string name="msg_private_channel">Privado</string>
...@@ -309,13 +310,13 @@ ...@@ -309,13 +310,13 @@
<string name="msg_no_recent_emoji">Nenhum emoji recente</string> <string name="msg_no_recent_emoji">Nenhum emoji recente</string>
<string name="alert_title_default_skin_tone">Tom de pele padrão</string> <string name="alert_title_default_skin_tone">Tom de pele padrão</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="dialog_sort_title">Ordenar por</string> <string name="msg_sort_by">Ordenar por %1$s</string>
<string name="dialog_sort_by_alphabet">Alfabeticamente</string> <string name="msg_sort_by_activity">Atividade</string>
<string name="dialog_sort_by_activity">Atividade</string> <string name="msg_sort_by_name">Nome</string>
<string name="dialog_group_by_type">Agrupar por tipo</string> <string name="msg_group_by_unread_on_top">Não lidas no topo</string>
<string name="dialog_group_favourites">Grupos favoritos</string> <string name="msg_group_by_type">Agrupar por tipo</string>
<string name="chatroom_header">Cabeçalho</string> <string name="msg_group_by_favorites">Agrupar por favoritos</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favoritos</string> <string name="header_favorite">Favoritos</string>
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">Entre no seu servidor</string> <string name="title_sign_in_your_server">Entre no seu servidor</string>
<string name="title_log_in">Entrar</string> <string name="title_log_in">Entrar</string>
<string name="title_share_the_app">Partilhe a Aplicação</string>
<string name="title_register_username">Registe um utilizador</string> <string name="title_register_username">Registe um utilizador</string>
<string name="title_reset_password">Reponha a palavra-passe</string> <string name="title_reset_password">Reponha a palavra-passe</string>
<string name="title_sign_up">Inscreva-se</string> <string name="title_sign_up">Inscreva-se</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">Painel de Administração</string> <string name="title_admin_panel">Painel de Administração</string>
<string name="title_password">Alterar palavra-passe</string> <string name="title_password">Alterar palavra-passe</string>
<string name="title_update_profile">Actualizar perfil</string> <string name="title_update_profile">Actualizar perfil</string>
<string name="title_about">Acerca</string>
<string name="title_create_channel">Criar Canal</string> <string name="title_create_channel">Criar Canal</string>
<string name="title_licence">Licença</string> <string name="title_licence">Licença</string>
<string name="title_are_you_sure">Tem a certeza?</string> <string name="title_are_you_sure">Tem a certeza?</string>
...@@ -35,6 +33,7 @@ ...@@ -35,6 +33,7 @@
<string name="action_terms_of_service">Termos do Serviço</string> <string name="action_terms_of_service">Termos do Serviço</string>
<string name="action_privacy_policy">Política de Privacidade</string> <string name="action_privacy_policy">Política de Privacidade</string>
<string name="action_search">Pesquisar</string> <string name="action_search">Pesquisar</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_update">Actualizar</string> <string name="action_update">Actualizar</string>
<string name="action_settings">Definições</string> <string name="action_settings">Definições</string>
<string name="action_create_channel">Criar canal</string> <string name="action_create_channel">Criar canal</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">Enviar um ficheiro</string> <string name="action_attach_a_files">Enviar um ficheiro</string>
<string name="action_confirm_password">Confirme a alteração da palavra-passe</string> <string name="action_confirm_password">Confirme a alteração da palavra-passe</string>
<string name="action_join_chat">Entre no chat</string> <string name="action_join_chat">Entre no chat</string>
<string name="action_add_account">Adicionar conta</string> <string name="msg_online">Online</string>
<string name="action_online">Online</string> <string name="msg_away">Ausente</string>
<string name="action_away">Ausente</string> <string name="msg_busy">Ocupado</string>
<string name="action_busy">Ocupado</string> <string name="msg_invisible">Invisível</string>
<string name="action_invisible">Invisível</string>
<string name="action_drawing">A desenhar</string> <string name="action_drawing">A desenhar</string>
<string name="action_save_to_gallery">Guardar na galeria</string> <string name="action_save_to_gallery">Guardar na galeria</string>
<string name="action_select_photo_from_gallery">Selecione a foto da galeria</string> <string name="action_select_photo_from_gallery">Selecione a foto da galeria</string>
...@@ -58,19 +56,21 @@ ...@@ -58,19 +56,21 @@
<string name="action_create_server">Crie um novo servidor</string> <string name="action_create_server">Crie um novo servidor</string>
<string name="action_register">Registar</string> <string name="action_register">Registar</string>
<string name="action_confirm">Confirmar</string> <string name="action_confirm">Confirmar</string>
<string name="action_delete_account">Apagar conta</string>
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">Preferências</item> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">Alterar palavra-passe</item> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">Alterar idioma</item> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">Partilhe a aplicação</item> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">Avalie-nos</item> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">Contacte-nos</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">Licença</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">Acerca</item> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">Lamentamos, ocorreu um erro, tente novamente</string> <string name="msg_generic_error">Lamentamos, ocorreu um erro, tente novamente</string>
...@@ -173,6 +173,8 @@ ...@@ -173,6 +173,8 @@
<item quantity="one">%1$s reagiu com %2$s</item> <item quantity="one">%1$s reagiu com %2$s</item>
<item quantity="other">%1$s reagiram com %2$s</item> <item quantity="other">%1$s reagiram com %2$s</item>
</plurals> </plurals>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Privado</string> <string name="msg_private_channel">Privado</string>
...@@ -306,14 +308,13 @@ ...@@ -306,14 +308,13 @@
<string name="msg_no_recent_emoji">Nenhum emojis recente</string> <string name="msg_no_recent_emoji">Nenhum emojis recente</string>
<string name="alert_title_default_skin_tone">Tom de pele padrão</string> <string name="alert_title_default_skin_tone">Tom de pele padrão</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">Ordenar</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">Ordenar por</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">Alfabeticamente</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">Actividade</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">Agrupar por tipo</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">Agrupar favoritos</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">Cabeçalho</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favoritos</string> <string name="header_favorite">Favoritos</string>
...@@ -336,7 +337,7 @@ ...@@ -336,7 +337,7 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">Fuso Horário</string> <string name="timezone">Fuso Horário</string>
<string name="status">Estado</string> <string name="status">Estado: %1$s</string>
<!-- Report --> <!-- Report -->
<string name="submit">Enviar</string> <string name="submit">Enviar</string>
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">Ваш сервер</string> <string name="title_sign_in_your_server">Ваш сервер</string>
<string name="title_log_in">Войти</string> <string name="title_log_in">Войти</string>
<string name="title_share_the_app">добавить приложение</string>
<string name="title_register_username">Зарегистрировать имя</string> <string name="title_register_username">Зарегистрировать имя</string>
<string name="title_reset_password">Сброс пароля</string> <string name="title_reset_password">Сброс пароля</string>
<string name="title_sign_up">Зарегистрироваться</string> <string name="title_sign_up">Зарегистрироваться</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">Панель админа</string> <string name="title_admin_panel">Панель админа</string>
<string name="title_password">Изменить пароль</string> <string name="title_password">Изменить пароль</string>
<string name="title_update_profile">Обновить профиль</string> <string name="title_update_profile">Обновить профиль</string>
<string name="title_about">О программе</string>
<string name="title_create_channel">Создать новый канал</string> <string name="title_create_channel">Создать новый канал</string>
<string name="title_channel_details">О канале</string> <string name="title_channel_details">О канале</string>
<string name="title_topic">Тема</string> <string name="title_topic">Тема</string>
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">Использовать это имя</string> <string name="action_use_this_username">Использовать это имя</string>
<string name="action_terms_of_service">Условия использования</string> <string name="action_terms_of_service">Условия использования</string>
<string name="action_privacy_policy">Политика конфиденциальности</string> <string name="action_privacy_policy">Политика конфиденциальности</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">Поиск</string> <string name="action_search">Поиск</string>
<string name="action_update">Обновить</string> <string name="action_update">Обновить</string>
<string name="action_settings">Настройки</string> <string name="action_settings">Настройки</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">Прикрепить файл</string> <string name="action_attach_a_files">Прикрепить файл</string>
<string name="action_confirm_password">Подтверждение изменения пароля</string> <string name="action_confirm_password">Подтверждение изменения пароля</string>
<string name="action_join_chat">Присоединиться к чату</string> <string name="action_join_chat">Присоединиться к чату</string>
<string name="action_add_account">Добавить аккаунт</string> <string name="msg_online">Онлайн</string>
<string name="action_online">Онлайн</string> <string name="msg_away">Отошел</string>
<string name="action_away">Отошел</string> <string name="msg_busy">Занят</string>
<string name="action_busy">Занят</string> <string name="msg_invisible">Невидимый</string>
<string name="action_invisible">Невидимый</string>
<string name="action_drawing">Рисунок</string> <string name="action_drawing">Рисунок</string>
<string name="action_save_to_gallery">Сохранить в галерею</string> <string name="action_save_to_gallery">Сохранить в галерею</string>
<string name="action_select_photo_from_gallery">Выбрать из галереи</string> <string name="action_select_photo_from_gallery">Выбрать из галереи</string>
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">Создать новый сервер</string> <string name="action_create_server">Создать новый сервер</string>
<string name="action_register">Зарегистрировать</string> <string name="action_register">Зарегистрировать</string>
<string name="action_confirm">Подтвердить</string> <string name="action_confirm">Подтвердить</string>
<string name="action_delete_account">Удалить аккаунт</string>
<string name="action_favorite">В избранное</string> <string name="action_favorite">В избранное</string>
<string name="action_remove_favorite">Удалить из избранного</string> <string name="action_remove_favorite">Удалить из избранного</string>
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">Персональные</item> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">Изменить пароль</item> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">Изменить язык</item> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">Поделиться приложением</item> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">Оцените нас</item> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">Связаться с нами</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">Лицензия</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">О программе</item> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">Произошла ошибка, повторите попытку.</string> <string name="msg_generic_error">Произошла ошибка, повторите попытку.</string>
...@@ -180,6 +180,8 @@ ...@@ -180,6 +180,8 @@
<item quantity="many">%1$s реагируют с %2$s</item> <item quantity="many">%1$s реагируют с %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Учетные данные успешно сохранены</string> <string name="msg_credentials_saved_successfully">Учетные данные успешно сохранены</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Приватный</string> <string name="msg_private_channel">Приватный</string>
...@@ -306,14 +308,13 @@ ...@@ -306,14 +308,13 @@
<string name="msg_no_recent_emoji">Пусто</string> <string name="msg_no_recent_emoji">Пусто</string>
<string name="alert_title_default_skin_tone">Тон кожи по умолчанию</string> <string name="alert_title_default_skin_tone">Тон кожи по умолчанию</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">Сортировать</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">Сортировать по</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">По алфавиту</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">По активности</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">Группировать по типу</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">Группировать избранное</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">Заголовок</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Избранные</string> <string name="header_favorite">Избранные</string>
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">Sunucunuza Bağlantı Kurun</string> <string name="title_sign_in_your_server">Sunucunuza Bağlantı Kurun</string>
<string name="title_log_in">Giriş Yapın</string> <string name="title_log_in">Giriş Yapın</string>
<string name="title_share_the_app">uygulamayı Paylaş</string>
<string name="title_register_username">Kullanıcı Adıyla Kaydolun</string> <string name="title_register_username">Kullanıcı Adıyla Kaydolun</string>
<string name="title_reset_password">Şifre Sıfırlama</string> <string name="title_reset_password">Şifre Sıfırlama</string>
<string name="title_sign_up">Kayıt Olun</string> <string name="title_sign_up">Kayıt Olun</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">Yönetici Paneli</string> <string name="title_admin_panel">Yönetici Paneli</string>
<string name="title_password">Şifrenizi Değiştirin</string> <string name="title_password">Şifrenizi Değiştirin</string>
<string name="title_update_profile">Profilinizi Düzenleyin</string> <string name="title_update_profile">Profilinizi Düzenleyin</string>
<string name="title_about">Hakkında</string>
<string name="title_create_channel">Yeni Kanal Oluştur</string> <string name="title_create_channel">Yeni Kanal Oluştur</string>
<string name="title_licence">Licence</string> <!-- TODO Add translation --> <string name="title_licence">Licence</string> <!-- TODO Add translation -->
<string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation --> <string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation -->
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">Bu kullanıcı adını kullan</string> <string name="action_use_this_username">Bu kullanıcı adını kullan</string>
<string name="action_terms_of_service">Kullanım Şartları</string> <string name="action_terms_of_service">Kullanım Şartları</string>
<string name="action_privacy_policy">Gizlilik Sözleşmesi</string> <string name="action_privacy_policy">Gizlilik Sözleşmesi</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">Ara</string> <string name="action_search">Ara</string>
<string name="action_update">Güncelle</string> <string name="action_update">Güncelle</string>
<string name="action_settings">Ayarlar</string> <string name="action_settings">Ayarlar</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">Attach a file</string> <!-- TODO Add translation --> <string name="action_attach_a_files">Attach a file</string> <!-- TODO Add translation -->
<string name="action_confirm_password">Şifre Değişikliğini Onaylayın</string> <string name="action_confirm_password">Şifre Değişikliğini Onaylayın</string>
<string name="action_join_chat">Sohbete Bağlan</string> <string name="action_join_chat">Sohbete Bağlan</string>
<string name="action_add_account">Hesap Ekle</string> <string name="msg_online">Çevrimiçi</string>
<string name="action_online">Çevrimiçi</string> <string name="msg_away">Uzakta</string>
<string name="action_away">Uzakta</string> <string name="msg_busy">Meşgul</string>
<string name="action_busy">Meşgul</string> <string name="msg_invisible">Görünmez</string>
<string name="action_invisible">Görünmez</string>
<string name="action_drawing">Çizim</string> <string name="action_drawing">Çizim</string>
<string name="action_save_to_gallery">Galeriye kaydet</string> <string name="action_save_to_gallery">Galeriye kaydet</string>
<string name="action_select_photo_from_gallery">Galeriden resim seç</string> <string name="action_select_photo_from_gallery">Galeriden resim seç</string>
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">Create a new server</string> <!-- TODO Add translation --> <string name="action_create_server">Create a new server</string> <!-- TODO Add translation -->
<string name="action_register">Register</string> <!-- TODO Add translation --> <string name="action_register">Register</string> <!-- TODO Add translation -->
<string name="action_confirm">Confirm</string> <!-- TODO Add translation --> <string name="action_confirm">Confirm</string> <!-- TODO Add translation -->
<string name="action_delete_account">Delete account</string> <!-- TODO Add translation -->
<string name="action_favorite">Favorite</string> <!-- TODO Add translation --> <string name="action_favorite">Favorite</string> <!-- TODO Add translation -->
<string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation --> <string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">Preferences</item> <!-- TODO Add translation --> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">Change password</item> <!-- TODO Add translation --> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">Change language</item> <!-- TODO Add translation --> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">Share app</item> <!-- TODO Add translation --> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">Rate us</item> <!-- TODO Add translation --> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">Contact us</item> <!-- TODO Add translation --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">Licence</item> <!-- TODO Add translation --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">About</item> <!-- TODO Add translation --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">Üzgünüz! bir hata oluştu. Lütfen daha sonra tekrar deneyiniz.</string> <string name="msg_generic_error">Üzgünüz! bir hata oluştu. Lütfen daha sonra tekrar deneyiniz.</string>
...@@ -195,6 +195,8 @@ ...@@ -195,6 +195,8 @@
<item quantity="other">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation --> <item quantity="other">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation -->
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Kimlik bilgileri başarıyla kaydedildi</string> <string name="msg_credentials_saved_successfully">Kimlik bilgileri başarıyla kaydedildi</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Preferences messages --> <!-- Preferences messages -->
<string name="msg_analytics_tracking">İstatistik takibi</string> <string name="msg_analytics_tracking">İstatistik takibi</string>
...@@ -310,14 +312,13 @@ ...@@ -310,14 +312,13 @@
<string name="msg_no_recent_emoji">Son kullanılan emoji bulunmamaktadır</string> <string name="msg_no_recent_emoji">Son kullanılan emoji bulunmamaktadır</string>
<string name="alert_title_default_skin_tone">Varsayılan tasarım tonu</string> <string name="alert_title_default_skin_tone">Varsayılan tasarım tonu</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">Sırala</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">Sırala</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">Alfabetik</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">Aktiviteye Göre</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">Türüne göre grupla</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">Favorileri grupla</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">Başlık</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">Ваш сервер</string> <string name="title_sign_in_your_server">Ваш сервер</string>
<string name="title_log_in">Увійти</string> <string name="title_log_in">Увійти</string>
<string name="title_share_the_app">поділитися прикладом</string>
<string name="title_register_username">Зареєструвати ім\'я</string> <string name="title_register_username">Зареєструвати ім\'я</string>
<string name="title_reset_password">Відновлення паролю</string> <string name="title_reset_password">Відновлення паролю</string>
<string name="title_sign_up">Зареєструватися</string> <string name="title_sign_up">Зареєструватися</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">Панель адміністратора</string> <string name="title_admin_panel">Панель адміністратора</string>
<string name="title_password">Змінити пароль</string> <string name="title_password">Змінити пароль</string>
<string name="title_update_profile">Оновити профіль</string> <string name="title_update_profile">Оновити профіль</string>
<string name="title_about">"Про програму"</string>
<string name="title_create_channel">Створити новий канал</string> <string name="title_create_channel">Створити новий канал</string>
<string name="title_licence">Licence</string> <!-- TODO Add translation --> <string name="title_licence">Licence</string> <!-- TODO Add translation -->
<string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation --> <string name="title_are_you_sure">Are you sure?</string> <!-- TODO Add translation -->
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">Використати це ім\'я</string> <string name="action_use_this_username">Використати це ім\'я</string>
<string name="action_terms_of_service">Умови використання</string> <string name="action_terms_of_service">Умови використання</string>
<string name="action_privacy_policy">Політика конфіденційності</string> <string name="action_privacy_policy">Політика конфіденційності</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">Пошук</string> <string name="action_search">Пошук</string>
<string name="action_update">Оновити</string> <string name="action_update">Оновити</string>
<string name="action_settings">Налаштування</string> <string name="action_settings">Налаштування</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">Attach a file</string> <!-- TODO Add translation --> <string name="action_attach_a_files">Attach a file</string> <!-- TODO Add translation -->
<string name="action_confirm_password">Підтвердження зміни пароля</string> <string name="action_confirm_password">Підтвердження зміни пароля</string>
<string name="action_join_chat">Приєднатися до чату</string> <string name="action_join_chat">Приєднатися до чату</string>
<string name="action_add_account">Додати аккаунт</string> <string name="msg_online">Онлайн</string>
<string name="action_online">Онлайн</string> <string name="msg_away">Відійшов</string>
<string name="action_away">Відійшов</string> <string name="msg_busy">Зайнятий</string>
<string name="action_busy">Зайнятий</string> <string name="msg_invisible">Невидимий</string>
<string name="action_invisible">Невидимий</string>
<string name="action_drawing">Малюнок</string> <string name="action_drawing">Малюнок</string>
<string name="action_save_to_gallery">Зберегти до галереї</string> <string name="action_save_to_gallery">Зберегти до галереї</string>
<string name="action_select_photo_from_gallery">Вибрати з галереї</string> <string name="action_select_photo_from_gallery">Вибрати з галереї</string>
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">Create a new server</string> <!-- TODO Add translation --> <string name="action_create_server">Create a new server</string> <!-- TODO Add translation -->
<string name="action_register">Register</string> <!-- TODO Add translation --> <string name="action_register">Register</string> <!-- TODO Add translation -->
<string name="action_confirm">Confirm</string> <!-- TODO Add translation --> <string name="action_confirm">Confirm</string> <!-- TODO Add translation -->
<string name="action_delete_account">Delete account</string> <!-- TODO Add translation -->
<string name="action_favorite">Favorite</string> <!-- TODO Add translation --> <string name="action_favorite">Favorite</string> <!-- TODO Add translation -->
<string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation --> <string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">Preferences</item> <!-- TODO Add translation --> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">Change password</item> <!-- TODO Add translation --> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">Change language</item> <!-- TODO Add translation --> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">Share app</item> <!-- TODO Add translation --> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">Rate us</item> <!-- TODO Add translation --> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">Contact us</item> <!-- TODO Add translation --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">Licence</item> <!-- TODO Add translation --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">About</item> <!-- TODO Add translation --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">Сталася помилка, спробуйте ще раз.</string> <string name="msg_generic_error">Сталася помилка, спробуйте ще раз.</string>
...@@ -179,6 +179,8 @@ ...@@ -179,6 +179,8 @@
<item quantity="many">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation --> <item quantity="many">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation -->
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Облікові дані було успішно збережено</string> <string name="msg_credentials_saved_successfully">Облікові дані було успішно збережено</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Приватний</string> <string name="msg_private_channel">Приватний</string>
...@@ -305,14 +307,13 @@ ...@@ -305,14 +307,13 @@
<string name="msg_no_recent_emoji">Пусто</string> <string name="msg_no_recent_emoji">Пусто</string>
<string name="alert_title_default_skin_tone">Тон шкіри за замовчуванням</string> <string name="alert_title_default_skin_tone">Тон шкіри за замовчуванням</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">Сортувати</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">Сортувати за</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">За алфавітом</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">За активністю</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">Групувати за типом</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">Групувати обране</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">Заголовок</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">登录您的服务器</string> <string name="title_sign_in_your_server">登录您的服务器</string>
<string name="title_log_in">登录</string> <string name="title_log_in">登录</string>
<string name="title_share_the_app">分享App</string>
<string name="title_register_username">注册用户</string> <string name="title_register_username">注册用户</string>
<string name="title_reset_password">重置密码</string> <string name="title_reset_password">重置密码</string>
<string name="title_sign_up">登录</string> <string name="title_sign_up">登录</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">管理面板</string> <string name="title_admin_panel">管理面板</string>
<string name="title_password">修改密码</string> <string name="title_password">修改密码</string>
<string name="title_update_profile">更新资料</string> <string name="title_update_profile">更新资料</string>
<string name="title_about">关于</string>
<string name="title_create_channel">新建频道</string> <string name="title_create_channel">新建频道</string>
<string name="title_licence">许可证</string> <string name="title_licence">许可证</string>
<string name="title_are_you_sure">你确定?</string> <string name="title_are_you_sure">你确定?</string>
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">使用这个用户名</string> <string name="action_use_this_username">使用这个用户名</string>
<string name="action_terms_of_service">服务条款</string> <string name="action_terms_of_service">服务条款</string>
<string name="action_privacy_policy">隐私政策</string> <string name="action_privacy_policy">隐私政策</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">搜索</string> <string name="action_search">搜索</string>
<string name="action_update">更新</string> <string name="action_update">更新</string>
<string name="action_settings">设置</string> <string name="action_settings">设置</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">添加附件</string> <string name="action_attach_a_files">添加附件</string>
<string name="action_confirm_password">确认修改密码</string> <string name="action_confirm_password">确认修改密码</string>
<string name="action_join_chat">加入聊天</string> <string name="action_join_chat">加入聊天</string>
<string name="action_add_account">添加账户</string> <string name="msg_online">在线</string>
<string name="action_online">在线</string> <string name="msg_away">离开</string>
<string name="action_away">离开</string> <string name="msg_busy">忙碌</string>
<string name="action_busy">忙碌</string> <string name="msg_invisible">隐身</string>
<string name="action_invisible">隐身</string>
<string name="action_drawing">绘画</string> <string name="action_drawing">绘画</string>
<string name="action_save_to_gallery">保存到图库</string> <string name="action_save_to_gallery">保存到图库</string>
<string name="action_select_photo_from_gallery">从图库选照片</string> <string name="action_select_photo_from_gallery">从图库选照片</string>
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">新建一个新服务器</string> <string name="action_create_server">新建一个新服务器</string>
<string name="action_register">注册</string> <string name="action_register">注册</string>
<string name="action_confirm">确定</string> <string name="action_confirm">确定</string>
<string name="action_delete_account">删除账户</string>
<string name="action_favorite">Favorite</string> <!-- TODO Add translation --> <string name="action_favorite">Favorite</string> <!-- TODO Add translation -->
<string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation --> <string name="action_remove_favorite">Remove favorite</string> <!-- TODO Add translation -->
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">首选项</item> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">修改密码</item> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">更改语言</item> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">分享app</item> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">给我们打分</item> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">联系我们</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">许可证</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">关于</item> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">对不起发生了错误,请重试</string> <string name="msg_generic_error">对不起发生了错误,请重试</string>
...@@ -174,6 +174,8 @@ ...@@ -174,6 +174,8 @@
<item quantity="other">%1$s 使用了 %2$s</item> <item quantity="other">%1$s 使用了 %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">凭证成功保存</string> <string name="msg_credentials_saved_successfully">凭证成功保存</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">隐私</string> <string name="msg_private_channel">隐私</string>
...@@ -306,14 +308,13 @@ ...@@ -306,14 +308,13 @@
<string name="msg_no_recent_emoji">没有最近的emojis</string> <string name="msg_no_recent_emoji">没有最近的emojis</string>
<string name="alert_title_default_skin_tone">默认皮肤颜色</string> <string name="alert_title_default_skin_tone">默认皮肤颜色</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">排序</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">排序按</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">字母</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">活跃</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">按类型分组</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">收藏分组</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">头部</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
...@@ -336,7 +337,7 @@ ...@@ -336,7 +337,7 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">时区</string> <string name="timezone">时区</string>
<string name="status" translatable="false">状态</string> <string name="status" translatable="false">状态: %1$s</string>
<!-- Report --> <!-- Report -->
<string name="submit">提交</string> <string name="submit">提交</string>
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">登入您的伺服器</string> <string name="title_sign_in_your_server">登入您的伺服器</string>
<string name="title_log_in">登入</string> <string name="title_log_in">登入</string>
<string name="title_share_the_app">分享App</string>
<string name="title_register_username">註冊使用者</string> <string name="title_register_username">註冊使用者</string>
<string name="title_reset_password">重置密碼</string> <string name="title_reset_password">重置密碼</string>
<string name="title_sign_up">登入</string> <string name="title_sign_up">登入</string>
...@@ -20,7 +19,6 @@ ...@@ -20,7 +19,6 @@
<string name="title_admin_panel">管理面板</string> <string name="title_admin_panel">管理面板</string>
<string name="title_password">修改密碼</string> <string name="title_password">修改密碼</string>
<string name="title_update_profile">更新資料</string> <string name="title_update_profile">更新資料</string>
<string name="title_about">關於</string>
<string name="title_create_channel">建立新頻道</string> <string name="title_create_channel">建立新頻道</string>
<string name="title_licence">許可</string> <string name="title_licence">許可</string>
<string name="title_are_you_sure">確定嗎?</string> <string name="title_are_you_sure">確定嗎?</string>
...@@ -34,6 +32,7 @@ ...@@ -34,6 +32,7 @@
<string name="action_use_this_username">使用這個名稱</string> <string name="action_use_this_username">使用這個名稱</string>
<string name="action_terms_of_service">服務條款</string> <string name="action_terms_of_service">服務條款</string>
<string name="action_privacy_policy">隱私政策</string> <string name="action_privacy_policy">隱私政策</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate -->
<string name="action_search">搜尋</string> <string name="action_search">搜尋</string>
<string name="action_update">更新</string> <string name="action_update">更新</string>
<string name="action_settings">設定</string> <string name="action_settings">設定</string>
...@@ -43,11 +42,10 @@ ...@@ -43,11 +42,10 @@
<string name="action_attach_a_files">添加檔案</string> <string name="action_attach_a_files">添加檔案</string>
<string name="action_confirm_password">確認修改密碼</string> <string name="action_confirm_password">確認修改密碼</string>
<string name="action_join_chat">加入聊天</string> <string name="action_join_chat">加入聊天</string>
<string name="action_add_account">新增帳戶</string> <string name="msg_online">線上</string>
<string name="action_online">線上</string> <string name="msg_away">離線</string>
<string name="action_away">離線</string> <string name="msg_busy">忙碌</string>
<string name="action_busy">忙碌</string> <string name="msg_invisible">隱藏</string>
<string name="action_invisible">隱藏</string>
<string name="action_drawing">畫畫中...</string> <string name="action_drawing">畫畫中...</string>
<string name="action_save_to_gallery">保存到相簿</string> <string name="action_save_to_gallery">保存到相簿</string>
<string name="action_select_photo_from_gallery">從相簿中選取照片</string> <string name="action_select_photo_from_gallery">從相簿中選取照片</string>
...@@ -58,21 +56,23 @@ ...@@ -58,21 +56,23 @@
<string name="action_create_server">建立一個新的伺服器</string> <string name="action_create_server">建立一個新的伺服器</string>
<string name="action_register">註冊</string> <string name="action_register">註冊</string>
<string name="action_confirm">確定</string> <string name="action_confirm">確定</string>
<string name="action_delete_account">刪除帳戶</string>
<string name="action_favorite">加入蒐藏</string> <string name="action_favorite">加入蒐藏</string>
<string name="action_remove_favorite">從蒐藏中移除</string> <string name="action_remove_favorite">從蒐藏中移除</string>
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
<item name="item_preferences">首选项</item> <string name="msg_language">Language</string> <!-- TODO Translate -->
<item name="item_password">修改密碼</item> <string name="msg_review_this_app">Review this app</string> <!-- TODO Translate -->
<item name="change_language">更換語言</item> <string name="msg_share_this_app">Share this app</string> <!-- TODO Translate -->
<item name="item_share_app">分享這個App</item> <string name="msg_administration">Administration</string> <!-- TODO Translate -->
<item name="item_rate_us">給我們一個評價</item> <string name="msg_licence">Licence</string> <!-- TODO Translate -->
<item name="item_contact_us">聯絡我們</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">許可證</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">關於</item> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate -->
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">發生了錯誤,請稍後試試</string> <string name="msg_generic_error">發生了錯誤,請稍後試試</string>
...@@ -174,6 +174,8 @@ ...@@ -174,6 +174,8 @@
<item quantity="other">%1$s 使用了 %2$s</item> <item quantity="other">%1$s 使用了 %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">憑證保存成功</string> <string name="msg_credentials_saved_successfully">憑證保存成功</string>
<string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">隱私</string> <string name="msg_private_channel">隱私</string>
...@@ -306,14 +308,13 @@ ...@@ -306,14 +308,13 @@
<string name="msg_no_recent_emoji">最近沒有使用emojis</string> <string name="msg_no_recent_emoji">最近沒有使用emojis</string>
<string name="alert_title_default_skin_tone">預設主題顏色</string> <string name="alert_title_default_skin_tone">預設主題顏色</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">排序</string> <string name="msg_sort_by">Sort by %1$s</string> <!-- TODO Translate -->
<string name="dialog_sort_title">根據開頭排序</string> <string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate -->
<string name="dialog_sort_by_alphabet">根據字母排序</string> <string name="msg_sort_by_name">Name</string> <!-- TODO Translate -->
<string name="dialog_sort_by_activity">根據活躍度排序</string> <string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate -->
<string name="dialog_group_by_type">根據類型分組</string> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="dialog_group_favourites">根據蒐藏分组</string> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<string name="chatroom_header">聊天室頭貼</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
...@@ -336,7 +337,7 @@ ...@@ -336,7 +337,7 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">時區</string> <string name="timezone">時區</string>
<string name="status" translatable="false">狀態</string> <string name="status" translatable="false">狀態: %1$s</string>
<!-- Report --> <!-- Report -->
<string name="submit">提交</string> <string name="submit">提交</string>
......
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="menu_section_one" type="id"/>
<item name="menu_section_two" type="id"/>
<item name="menu_section_three" type="id"/>
<item name="menu_action_chats" type="id"/>
<item name="menu_action_create_channel" type="id"/>
<item name="menu_action_profile" type="id"/>
<item name="menu_action_settings" type="id"/>
<item name="menu_action_admin_panel" type="id"/>
<item name="menu_action_logout" type="id"/>
</resources>
\ No newline at end of file
...@@ -15,7 +15,6 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -15,7 +15,6 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<!-- Titles --> <!-- Titles -->
<string name="title_sign_in_your_server">Sign in to your server</string> <string name="title_sign_in_your_server">Sign in to your server</string>
<string name="title_log_in">Login</string> <string name="title_log_in">Login</string>
<string name="title_share_the_app">Share App</string>
<string name="title_register_username">Register username</string> <string name="title_register_username">Register username</string>
<string name="title_reset_password">Reset password</string> <string name="title_reset_password">Reset password</string>
<string name="title_sign_up">Sign up</string> <string name="title_sign_up">Sign up</string>
...@@ -32,7 +31,6 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -32,7 +31,6 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="title_admin_panel">Admin panel</string> <string name="title_admin_panel">Admin panel</string>
<string name="title_password">Change Password</string> <string name="title_password">Change Password</string>
<string name="title_update_profile">Update profile</string> <string name="title_update_profile">Update profile</string>
<string name="title_about">About</string>
<string name="title_create_channel">Create Channel</string> <string name="title_create_channel">Create Channel</string>
<string name="title_licence">Licence</string> <string name="title_licence">Licence</string>
<string name="title_are_you_sure">Are you sure?</string> <string name="title_are_you_sure">Are you sure?</string>
...@@ -46,6 +44,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -46,6 +44,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="action_use_this_username">Use this username</string> <string name="action_use_this_username">Use this username</string>
<string name="action_terms_of_service">Terms of Service</string> <string name="action_terms_of_service">Terms of Service</string>
<string name="action_privacy_policy">Privacy Policy</string> <string name="action_privacy_policy">Privacy Policy</string>
<string name="action_new_channel">New channel</string>
<string name="action_search">Search</string> <string name="action_search">Search</string>
<string name="action_update">Update</string> <string name="action_update">Update</string>
<string name="action_settings">Settings</string> <string name="action_settings">Settings</string>
...@@ -55,11 +54,10 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -55,11 +54,10 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="action_attach_a_files">Attach a file</string> <string name="action_attach_a_files">Attach a file</string>
<string name="action_confirm_password">Confirm Password Change</string> <string name="action_confirm_password">Confirm Password Change</string>
<string name="action_join_chat">Join Chat</string> <string name="action_join_chat">Join Chat</string>
<string name="action_add_account">Add account</string> <string name="msg_online">Online</string>
<string name="action_online">Online</string> <string name="msg_away">Away</string>
<string name="action_away">Away</string> <string name="msg_busy">Busy</string>
<string name="action_busy">Busy</string> <string name="msg_invisible">Invisible</string>
<string name="action_invisible">Invisible</string>
<string name="action_drawing">Drawing</string> <string name="action_drawing">Drawing</string>
<string name="action_save_to_gallery">Save to gallery</string> <string name="action_save_to_gallery">Save to gallery</string>
<string name="action_select_photo_from_gallery">Select photo from gallery</string> <string name="action_select_photo_from_gallery">Select photo from gallery</string>
...@@ -70,21 +68,23 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -70,21 +68,23 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="action_create_server">Create a new server</string> <string name="action_create_server">Create a new server</string>
<string name="action_register">Register</string> <string name="action_register">Register</string>
<string name="action_confirm">Confirm</string> <string name="action_confirm">Confirm</string>
<string name="action_delete_account">Delete account</string>
<string name="action_favorite">Favorite</string> <string name="action_favorite">Favorite</string>
<string name="action_remove_favorite">Remove favorite</string> <string name="action_remove_favorite">Remove favorite</string>
<!-- Settings List --> <!-- Settings messages-->
<string-array name="settings_actions"> <string name="msg_contact_us">Contact us</string>
<item name="item_preferences">Preferences</item> <string name="msg_language">Language</string>
<item name="item_password">Change password</item> <string name="msg_review_this_app">Review this app</string>
<item name="change_language">Change language</item> <string name="msg_share_this_app">Share this app</string>
<item name="item_share_app">Share app</item> <string name="msg_administration">Administration</string>
<item name="item_rate_us">Rate us</item> <string name="msg_licence">Licence</string>
<item name="item_contact_us">Contact us</item> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<item name="item_licence">Licence</item> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<item name="item_about">About</item> <string name="msg_send_analytics">Send analytics</string>
</string-array> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string>
<string name="msg_delete_account">Delete account</string>
<string name="msg_change_status">Change status</string>
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">Sorry, an error has occurred, please try again</string> <string name="msg_generic_error">Sorry, an error has occurred, please try again</string>
...@@ -190,6 +190,8 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -190,6 +190,8 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<item quantity="other">%1$s reacted with %2$s</item> <item quantity="other">%1$s reacted with %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Credentials saved successfully</string> <string name="msg_credentials_saved_successfully">Credentials saved successfully</string>
<string name="msg_server">Server</string>
<string name="msg_add_new_server">Add New Server</string>
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Private</string> <string name="msg_private_channel">Private</string>
...@@ -211,8 +213,8 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -211,8 +213,8 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<!-- Preferences messages --> <!-- Preferences messages -->
<string name="msg_analytics_tracking">Analytics tracking</string> <string name="msg_analytics_tracking">Analytics tracking</string>
<string name="msg_send_analytics_tracking">Send anonymous statics to help improving this app</string> <string name="msg_send_analytics_tracking">Send anonymous statistics to help improve this app</string>
<string name="msg_do_not_send_analytics_tracking">Do not send anonymous statics to help improving this app</string> <string name="msg_do_not_send_analytics_tracking">Do not send anonymous statistics to help improve this app</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Not applicable since it is a FOSS version</string> <string name="msg_not_applicable_since_it_is_a_foss_version">Not applicable since it is a FOSS version</string>
<!-- System messages --> <!-- System messages -->
...@@ -322,14 +324,13 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -322,14 +324,13 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="msg_no_recent_emoji">No recent emojis</string> <string name="msg_no_recent_emoji">No recent emojis</string>
<string name="alert_title_default_skin_tone">Default skin tone</string> <string name="alert_title_default_skin_tone">Default skin tone</string>
<!-- Sorting and grouping--> <!-- Sort and group -->
<string name="msg_sort">Sort</string> <string name="msg_sort_by">Sort by %1$s</string>
<string name="dialog_sort_title">Sort by</string> <string name="msg_sort_by_activity">Activity</string>
<string name="dialog_sort_by_alphabet">Alphabetical</string> <string name="msg_sort_by_name">Name</string>
<string name="dialog_sort_by_activity">Activity</string> <string name="msg_group_by_unread_on_top">Unread on top</string>
<string name="dialog_group_by_type">Group by type</string> <string name="msg_group_by_type">Group by type</string>
<string name="dialog_group_favourites">Group favourites</string> <string name="msg_group_by_favorites">Group by favorites</string>
<string name="chatroom_header">Header</string>
<!--ChatRooms Headers--> <!--ChatRooms Headers-->
<string name="header_favorite">Favorites</string> <string name="header_favorite">Favorites</string>
...@@ -352,7 +353,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -352,7 +353,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<!-- User Details --> <!-- User Details -->
<string name="timezone">Timezone</string> <string name="timezone">Timezone</string>
<string name="status" translatable="false">Status</string> <string name="status" translatable="false">Status: %1$s</string>
<!-- Report --> <!-- Report -->
<string name="submit">Submit</string> <string name="submit">Submit</string>
......
...@@ -35,7 +35,7 @@ class AnswersAnalytics : Analytics { ...@@ -35,7 +35,7 @@ class AnswersAnalytics : Analytics {
override fun logMessageSent(event: SubscriptionTypeEvent, serverUrl: String) = override fun logMessageSent(event: SubscriptionTypeEvent, serverUrl: String) =
Answers.getInstance() Answers.getInstance()
.logCustom( .logCustom(
CustomEvent("message_actionsent") CustomEvent("message_sent")
.putCustomAttribute("subscription_type", event.subscriptionTypeName) .putCustomAttribute("subscription_type", event.subscriptionTypeName)
.putCustomAttribute("server", serverUrl) .putCustomAttribute("server", serverUrl)
) )
......
...@@ -56,7 +56,7 @@ ext { ...@@ -56,7 +56,7 @@ ext {
glide : '4.8.0', glide : '4.8.0',
glideTransformations : '4.0.0', glideTransformations : '4.0.0',
jitsi : '1.21.0', // TODO Avoid using + (https://github.com/jitsi/jitsi-meet/issues/3987) jitsi : '1.21.0',
// For testing // For testing
junit : '4.12', junit : '4.12',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment