From c9bb1e91acdf242a2ba5246fe2d0951298f30655 Mon Sep 17 00:00:00 2001 From: pancor Date: Wed, 21 Mar 2018 20:32:16 +0100 Subject: [PATCH 001/124] adds const --- .../java/chat/rocket/android/infrastructure/LocalRepository.kt | 1 + app/src/main/res/values/defaults.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/chat/rocket/android/infrastructure/LocalRepository.kt b/app/src/main/java/chat/rocket/android/infrastructure/LocalRepository.kt index bdb22563eb..3cdd19a485 100644 --- a/app/src/main/java/chat/rocket/android/infrastructure/LocalRepository.kt +++ b/app/src/main/java/chat/rocket/android/infrastructure/LocalRepository.kt @@ -7,6 +7,7 @@ interface LocalRepository { const val TOKEN_KEY = "token_" const val SETTINGS_KEY = "settings_" const val USERNAME_KEY = "my_username" + const val UNFINISHED_MSG_KEY = "unfinished_msg_" } fun save(key: String, value: String?) diff --git a/app/src/main/res/values/defaults.xml b/app/src/main/res/values/defaults.xml index 70bf22d946..ae06c32498 100644 --- a/app/src/main/res/values/defaults.xml +++ b/app/src/main/res/values/defaults.xml @@ -1,5 +1,5 @@ - https:// + http:// open.rocket.chat \ No newline at end of file From 7f80a50b66f2c2449862f581c236a317684989e3 Mon Sep 17 00:00:00 2001 From: pancor Date: Wed, 21 Mar 2018 21:00:29 +0100 Subject: [PATCH 002/124] add save/get functions --- .../presentation/ChatRoomPresenter.kt | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt index a3a9cbd919..f1e8d6382f 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt @@ -5,6 +5,7 @@ import chat.rocket.android.R import chat.rocket.android.chatroom.domain.UriInteractor import chat.rocket.android.chatroom.viewmodel.ViewModelMapper import chat.rocket.android.core.lifecycle.CancelStrategy +import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.server.domain.* import chat.rocket.android.server.infraestructure.ConnectionManagerFactory import chat.rocket.android.server.infraestructure.state @@ -35,7 +36,8 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, private val uriInteractor: UriInteractor, private val messagesRepository: MessagesRepository, factory: ConnectionManagerFactory, - private val mapper: ViewModelMapper) { + private val mapper: ViewModelMapper, + private val localRepository: LocalRepository) { private val currentServer = serverInteractor.get()!! private val manager = factory.create(currentServer) private val client = manager.client @@ -149,7 +151,7 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, view.showMessage(ex.message!!) // TODO Remove. Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber. } - } + } } private fun subscribeState() { @@ -358,4 +360,30 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, } } } + + /** + * Save unfinished message, when user left chat room without sending a message. + * + * @param chatRoomId Chat room Id. + * @param unfinishedMessage The unfinished message to save. + */ + fun saveUnfinishedMessage(chatRoomId: String, unfinishedMessage: String) { + if (unfinishedMessage.isNotBlank()) { + val key = LocalRepository.UNFINISHED_MSG_KEY + chatRoomId + localRepository.save(key, unfinishedMessage) + } + } + + /** + * Get unfinished message from local repository, when user left chat room without + * sending a message and now the user is back. + * + * @param chatRoomId Chat room Id. + * + * @return Returns the unfinished message. + */ + fun getUnfinishedMessage(chatRoomId: String): String { + val key = LocalRepository.UNFINISHED_MSG_KEY + chatRoomId + return localRepository.get(key) ?: "" + } } From f9ab2126a67592e4a299751f8fcb2a30b325b422 Mon Sep 17 00:00:00 2001 From: pancor Date: Thu, 22 Mar 2018 16:31:56 +0100 Subject: [PATCH 003/124] add show soft keyboard at activity start functionality --- .../rocket/android/chatroom/ui/ChatRoomFragment.kt | 10 ++++++++++ .../chat/rocket/android/helper/KeyboardHelper.kt | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt index 30fce9285b..cd651fd674 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt @@ -115,6 +115,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardPopup.Listener { } override fun onDestroyView() { + presenter.saveUnfinishedMessage(chatRoomId, text_message.text.toString()) presenter.unsubscribeMessages(chatRoomId) handler.removeCallbacksAndMessages(null) unsubscribeTextMessage() @@ -350,6 +351,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardPopup.Listener { button_show_attachment_options.alpha = 1f button_show_attachment_options.setVisible(true) + getUnfinishedMessage() subscribeTextMessage() emojiKeyboardPopup = EmojiKeyboardPopup(activity!!, activity!!.findViewById(R.id.fragment_container)) emojiKeyboardPopup.listener = this @@ -410,6 +412,14 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardPopup.Listener { } } + private fun getUnfinishedMessage() { + val unfinishedMessage = presenter.getUnfinishedMessage(chatRoomId) + if (unfinishedMessage.isNotBlank() && activity != null) { + text_message.setText(unfinishedMessage) + KeyboardHelper.showSoftKeyboardOnActivityStart(activity!!, text_message) + } + } + private fun openEmojiKeyboardPopup() { if (!emojiKeyboardPopup.isShowing()) { // If keyboard is visible, simply show the popup diff --git a/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt b/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt index 2f6b23a265..ae43d47ac9 100644 --- a/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt +++ b/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.content.Context import android.graphics.Rect import android.view.View +import android.view.WindowManager import android.view.inputmethod.InputMethodManager @@ -50,4 +51,15 @@ object KeyboardHelper { inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.SHOW_IMPLICIT) } } + + /** + * Show the soft keyboard for the given view at the start of activity or fragment. + * + * @param view View to receive input focus. + */ + fun showSoftKeyboardOnActivityStart(activity: Activity, view: View) { + if (view.requestFocus()) { + activity.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) + } + } } \ No newline at end of file From 68932d742b120323b398831be1f2c04b68a6044d Mon Sep 17 00:00:00 2001 From: pancor Date: Fri, 23 Mar 2018 18:26:45 +0100 Subject: [PATCH 004/124] refactor code and add clear message possibility --- .../android/chatroom/presentation/ChatRoomPresenter.kt | 9 ++++++--- .../chat/rocket/android/chatroom/ui/ChatRoomFragment.kt | 8 +++++++- .../java/chat/rocket/android/helper/KeyboardHelper.kt | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt index f1e8d6382f..f4f40b5824 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt @@ -362,15 +362,18 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, } /** - * Save unfinished message, when user left chat room without sending a message. + * Save unfinished message, when user left chat room without sending a message. It also clears + * saved message from local repository when unfinishedMessage is blank. * * @param chatRoomId Chat room Id. * @param unfinishedMessage The unfinished message to save. */ fun saveUnfinishedMessage(chatRoomId: String, unfinishedMessage: String) { + val key = LocalRepository.UNFINISHED_MSG_KEY + chatRoomId if (unfinishedMessage.isNotBlank()) { - val key = LocalRepository.UNFINISHED_MSG_KEY + chatRoomId localRepository.save(key, unfinishedMessage) + } else { + localRepository.clear(key) } } @@ -386,4 +389,4 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, val key = LocalRepository.UNFINISHED_MSG_KEY + chatRoomId return localRepository.get(key) ?: "" } -} +} \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt index cd651fd674..4104a41220 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt @@ -5,6 +5,7 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent +import android.content.res.Configuration import android.net.Uri import android.os.Bundle import android.os.Handler @@ -416,7 +417,12 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardPopup.Listener { val unfinishedMessage = presenter.getUnfinishedMessage(chatRoomId) if (unfinishedMessage.isNotBlank() && activity != null) { text_message.setText(unfinishedMessage) - KeyboardHelper.showSoftKeyboardOnActivityStart(activity!!, text_message) + val orientation = resources.configuration.orientation + if (orientation == Configuration.ORIENTATION_PORTRAIT) { + KeyboardHelper.showSoftKeyboardOnActivityStart(activity!!, text_message) + } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + text_message.requestFocus() + } } } diff --git a/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt b/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt index ae43d47ac9..a2dbfda7e4 100644 --- a/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt +++ b/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt @@ -59,7 +59,7 @@ object KeyboardHelper { */ fun showSoftKeyboardOnActivityStart(activity: Activity, view: View) { if (view.requestFocus()) { - activity.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) + activity.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) } } } \ No newline at end of file From 76c20bcb38ac0e31a0fb42d26fb830d2affb4fc7 Mon Sep 17 00:00:00 2001 From: pancor Date: Fri, 23 Mar 2018 18:28:19 +0100 Subject: [PATCH 005/124] add https --- app/src/main/res/values/defaults.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/defaults.xml b/app/src/main/res/values/defaults.xml index ae06c32498..70bf22d946 100644 --- a/app/src/main/res/values/defaults.xml +++ b/app/src/main/res/values/defaults.xml @@ -1,5 +1,5 @@ - http:// + https:// open.rocket.chat \ No newline at end of file From 844d6e4fd131f13183ca995a0c958f280b77b6f4 Mon Sep 17 00:00:00 2001 From: Pancor Date: Fri, 23 Mar 2018 19:12:57 +0100 Subject: [PATCH 006/124] add missing bracket --- .../java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt index a345d120ec..6611403975 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt @@ -516,6 +516,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR text_message.requestFocus() } } + } private fun setupSuggestionsView() { suggestions_view.anchorTo(text_message) @@ -613,4 +614,4 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR private fun setupToolbar(toolbarTitle: String) { (activity as ChatRoomActivity).setupToolbarTitle(toolbarTitle) } -} \ No newline at end of file +} From 516f941d2a09abeb94c556d6d3bb0abc05aadf1c Mon Sep 17 00:00:00 2001 From: Pancor Date: Tue, 3 Apr 2018 12:29:22 +0200 Subject: [PATCH 007/124] add support for muliserver --- .../presentation/ChatRoomPresenter.kt | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt index 7960ad30a4..e8643d1133 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt @@ -49,8 +49,7 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, private val roomsRepository: RoomRepository, private val localRepository: LocalRepository, factory: ConnectionManagerFactory, - private val mapper: ViewModelMapper, - private val localRepository: LocalRepository) { + private val mapper: ViewModelMapper) { private val currentServer = serverInteractor.get()!! private val manager = factory.create(currentServer) private val client = manager.client @@ -85,8 +84,8 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, ex.message?.let { view.showMessage(it) }.ifNull { - view.showGenericErrorMessage() - } + view.showGenericErrorMessage() + } } finally { view.hideLoading() } @@ -112,8 +111,8 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, ex.message?.let { view.showMessage(it) }.ifNull { - view.showGenericErrorMessage() - } + view.showGenericErrorMessage() + } } finally { view.enableSendMessageButton() } @@ -148,8 +147,8 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, ex.message?.let { view.showMessage(it) }.ifNull { - view.showGenericErrorMessage() - } + view.showGenericErrorMessage() + } } finally { view.hideLoading() } @@ -164,7 +163,7 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, view.showMessage(ex.message!!) // TODO Remove. Timber.e(ex) // FIXME: Right now we are only catching the exception with Timber. } - } + } } private fun subscribeState() { @@ -563,7 +562,7 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, * @param unfinishedMessage The unfinished message to save. */ fun saveUnfinishedMessage(chatRoomId: String, unfinishedMessage: String) { - val key = LocalRepository.UNFINISHED_MSG_KEY + chatRoomId + val key = "${currentServer}_${LocalRepository.UNFINISHED_MSG_KEY}$chatRoomId" if (unfinishedMessage.isNotBlank()) { localRepository.save(key, unfinishedMessage) } else { @@ -580,7 +579,7 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, * @return Returns the unfinished message. */ fun getUnfinishedMessage(chatRoomId: String): String { - val key = LocalRepository.UNFINISHED_MSG_KEY + chatRoomId + val key = "${currentServer}_${LocalRepository.UNFINISHED_MSG_KEY}$chatRoomId" return localRepository.get(key) ?: "" } -} \ No newline at end of file +} From d4c36744114bf4c0f0f8a6d29a98014fcee79df9 Mon Sep 17 00:00:00 2001 From: Pancor Date: Tue, 3 Apr 2018 12:32:54 +0200 Subject: [PATCH 008/124] code refactor --- .../chat/rocket/android/chatroom/ui/ChatRoomFragment.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt index 6611403975..b634ded356 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt @@ -507,13 +507,13 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR private fun getUnfinishedMessage() { val unfinishedMessage = presenter.getUnfinishedMessage(chatRoomId) - if (unfinishedMessage.isNotBlank() && activity != null) { + if (unfinishedMessage.isNotBlank()) { text_message.setText(unfinishedMessage) val orientation = resources.configuration.orientation if (orientation == Configuration.ORIENTATION_PORTRAIT) { - KeyboardHelper.showSoftKeyboardOnActivityStart(activity!!, text_message) - } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) { - text_message.requestFocus() + KeyboardHelper.showSoftKeyboard(text_message) + } else { + //TODO show keyboard in full screen mode when landscape orientation } } } From 840e9e14e978e73ff7f8fcbc732db5a73fb1f364 Mon Sep 17 00:00:00 2001 From: Pancor Date: Tue, 3 Apr 2018 12:34:04 +0200 Subject: [PATCH 009/124] remove unused function --- .../chat/rocket/android/helper/KeyboardHelper.kt | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt b/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt index a2dbfda7e4..47ea607229 100644 --- a/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt +++ b/app/src/main/java/chat/rocket/android/helper/KeyboardHelper.kt @@ -51,15 +51,4 @@ object KeyboardHelper { inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.SHOW_IMPLICIT) } } - - /** - * Show the soft keyboard for the given view at the start of activity or fragment. - * - * @param view View to receive input focus. - */ - fun showSoftKeyboardOnActivityStart(activity: Activity, view: View) { - if (view.requestFocus()) { - activity.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) - } - } -} \ No newline at end of file +} From c16c4b0b838cb00f641bb43b87e3d132e4e67849 Mon Sep 17 00:00:00 2001 From: Pancor Date: Tue, 3 Apr 2018 12:39:09 +0200 Subject: [PATCH 010/124] remove stateAlwaysHidden --- app/src/main/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7449131e2f..4678f478eb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -52,7 +52,7 @@ - \ No newline at end of file + From bd2591dfaa5d2abb925fe8ecd884ef317ad115c2 Mon Sep 17 00:00:00 2001 From: divyanshu Date: Tue, 17 Jul 2018 21:55:45 +0530 Subject: [PATCH 011/124] onboarding screen --- .../onboarding/OnBoardingFragment.kt | 23 + .../ui/AuthenticationActivity.kt | 4 +- .../drawable/ic_chevron_right_black_24dp.xml | 9 + .../res/drawable/ic_connect_server_30dp.xml | 18 + app/src/main/res/drawable/ic_onboarding.xml | 664 ++++++++++++++++++ app/src/main/res/drawable/ic_rocket_chat.xml | 30 + app/src/main/res/drawable/rounded_border.xml | 6 + .../res/drawable/rounded_color_accent.xml | 2 +- .../main/res/layout/fragment_on_boarding.xml | 187 +++++ app/src/main/res/values/colors.xml | 2 +- build.gradle | 2 +- 11 files changed, 943 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/chat/rocket/android/authentication/onboarding/OnBoardingFragment.kt create mode 100644 app/src/main/res/drawable/ic_chevron_right_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_connect_server_30dp.xml create mode 100644 app/src/main/res/drawable/ic_onboarding.xml create mode 100644 app/src/main/res/drawable/ic_rocket_chat.xml create mode 100644 app/src/main/res/drawable/rounded_border.xml create mode 100644 app/src/main/res/layout/fragment_on_boarding.xml diff --git a/app/src/main/java/chat/rocket/android/authentication/onboarding/OnBoardingFragment.kt b/app/src/main/java/chat/rocket/android/authentication/onboarding/OnBoardingFragment.kt new file mode 100644 index 0000000000..1492c44fdf --- /dev/null +++ b/app/src/main/java/chat/rocket/android/authentication/onboarding/OnBoardingFragment.kt @@ -0,0 +1,23 @@ +package chat.rocket.android.authentication.onboarding + + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import chat.rocket.android.R + +class OnBoardingFragment : Fragment() { + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_on_boarding, container, false) + } + + companion object { + fun newInstance() = OnBoardingFragment() + } + + +} diff --git a/app/src/main/java/chat/rocket/android/authentication/ui/AuthenticationActivity.kt b/app/src/main/java/chat/rocket/android/authentication/ui/AuthenticationActivity.kt index 7f6cbe9fad..7ff59a81da 100644 --- a/app/src/main/java/chat/rocket/android/authentication/ui/AuthenticationActivity.kt +++ b/app/src/main/java/chat/rocket/android/authentication/ui/AuthenticationActivity.kt @@ -8,6 +8,7 @@ import androidx.appcompat.app.AppCompatActivity import chat.rocket.android.R import chat.rocket.android.authentication.domain.model.LoginDeepLinkInfo import chat.rocket.android.authentication.domain.model.getLoginDeepLinkInfo +import chat.rocket.android.authentication.onboarding.OnBoardingFragment import chat.rocket.android.authentication.presentation.AuthenticationPresenter import chat.rocket.android.authentication.server.ui.ServerFragment import chat.rocket.android.util.extensions.addFragment @@ -67,7 +68,8 @@ class AuthenticationActivity : AppCompatActivity(), HasSupportFragmentInjector { fun showServerInput(deepLinkInfo: LoginDeepLinkInfo?) { addFragment("ServerFragment", R.id.fragment_container, allowStateLoss = true) { - ServerFragment.newInstance(deepLinkInfo) +// ServerFragment.newInstance(deepLinkInfo) + OnBoardingFragment.newInstance() } } } diff --git a/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml b/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml new file mode 100644 index 0000000000..24835127dd --- /dev/null +++ b/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_connect_server_30dp.xml b/app/src/main/res/drawable/ic_connect_server_30dp.xml new file mode 100644 index 0000000000..b6f5d172f5 --- /dev/null +++ b/app/src/main/res/drawable/ic_connect_server_30dp.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_onboarding.xml b/app/src/main/res/drawable/ic_onboarding.xml new file mode 100644 index 0000000000..c566c0a5bb --- /dev/null +++ b/app/src/main/res/drawable/ic_onboarding.xml @@ -0,0 +1,664 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_rocket_chat.xml b/app/src/main/res/drawable/ic_rocket_chat.xml new file mode 100644 index 0000000000..8aa40f779e --- /dev/null +++ b/app/src/main/res/drawable/ic_rocket_chat.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rounded_border.xml b/app/src/main/res/drawable/rounded_border.xml new file mode 100644 index 0000000000..cb286b65fa --- /dev/null +++ b/app/src/main/res/drawable/rounded_border.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rounded_color_accent.xml b/app/src/main/res/drawable/rounded_color_accent.xml index a38dc56c05..5547ebd2d6 100644 --- a/app/src/main/res/drawable/rounded_color_accent.xml +++ b/app/src/main/res/drawable/rounded_color_accent.xml @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_on_boarding.xml b/app/src/main/res/layout/fragment_on_boarding.xml new file mode 100644 index 0000000000..0104fb1341 --- /dev/null +++ b/app/src/main/res/layout/fragment_on_boarding.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a3bac4be4a..beffd054ac 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -4,7 +4,7 @@ #FF303030 #FF212121 - #FF1976D2 + #1d74f5 #DE000000 diff --git a/build.gradle b/build.gradle index 57f492798c..d7d17de486 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.2.0-beta02' + classpath 'com.android.tools.build:gradle:3.2.0-beta04' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}" classpath "org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}" classpath 'com.google.gms:google-services:3.2.0' From e2d80203fdadd2d74124fca80e49e1ae73d80bb9 Mon Sep 17 00:00:00 2001 From: divyanshu Date: Wed, 18 Jul 2018 09:56:28 +0530 Subject: [PATCH 012/124] connect server screen --- .../onboarding/OnBoardingFragment.kt | 20 +- .../server/ui/ServerFragment.kt | 8 +- .../ui/AuthenticationActivity.kt | 2 +- app/src/main/res/drawable/ic_onboarding.xml | 925 ++++++++++-------- app/src/main/res/drawable/ic_server.xml | 69 ++ .../style_edit_text_authentication.xml | 2 +- .../layout/fragment_authentication_server.xml | 129 ++- .../main/res/layout/fragment_on_boarding.xml | 8 +- app/src/main/res/layout/spinner_list.xml | 11 + 9 files changed, 714 insertions(+), 460 deletions(-) create mode 100644 app/src/main/res/drawable/ic_server.xml create mode 100644 app/src/main/res/layout/spinner_list.xml diff --git a/app/src/main/java/chat/rocket/android/authentication/onboarding/OnBoardingFragment.kt b/app/src/main/java/chat/rocket/android/authentication/onboarding/OnBoardingFragment.kt index 1492c44fdf..0ae163db05 100644 --- a/app/src/main/java/chat/rocket/android/authentication/onboarding/OnBoardingFragment.kt +++ b/app/src/main/java/chat/rocket/android/authentication/onboarding/OnBoardingFragment.kt @@ -7,12 +7,28 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import chat.rocket.android.R +import chat.rocket.android.authentication.domain.model.getLoginDeepLinkInfo +import chat.rocket.android.authentication.server.ui.ServerFragment +import chat.rocket.android.authentication.ui.AuthenticationActivity +import chat.rocket.android.util.extensions.addFragment +import chat.rocket.android.util.extensions.addFragmentBackStack +import chat.rocket.android.util.extensions.inflate +import kotlinx.android.synthetic.main.fragment_on_boarding.* class OnBoardingFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_on_boarding, container, false) + savedInstanceState: Bundle?): View? = container?.inflate(R.layout.fragment_on_boarding) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + button_connect_server.setOnClickListener { + val deepLinkInfo = activity?.intent?.getLoginDeepLinkInfo() + (activity as AuthenticationActivity).addFragmentBackStack("ServerFragment", R.id.fragment_container) { + ServerFragment.newInstance(deepLinkInfo) + } + } } companion object { diff --git a/app/src/main/java/chat/rocket/android/authentication/server/ui/ServerFragment.kt b/app/src/main/java/chat/rocket/android/authentication/server/ui/ServerFragment.kt index 5f5618b4d1..466bc329ab 100644 --- a/app/src/main/java/chat/rocket/android/authentication/server/ui/ServerFragment.kt +++ b/app/src/main/java/chat/rocket/android/authentication/server/ui/ServerFragment.kt @@ -28,7 +28,7 @@ class ServerFragment : Fragment(), ServerView { lateinit var presenter: ServerPresenter private var deepLinkInfo: LoginDeepLinkInfo? = null private val layoutListener = ViewTreeObserver.OnGlobalLayoutListener { - text_server_url.isCursorVisible = KeyboardHelper.isSoftKeyboardShown(relative_layout.rootView) + text_server_url.isCursorVisible = KeyboardHelper.isSoftKeyboardShown(constraint_layout.rootView) } companion object { @@ -56,7 +56,7 @@ class ServerFragment : Fragment(), ServerView { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - relative_layout.viewTreeObserver.addOnGlobalLayoutListener(layoutListener) + constraint_layout.viewTreeObserver.addOnGlobalLayoutListener(layoutListener) setupOnClickListener() deepLinkInfo?.let { @@ -66,7 +66,7 @@ class ServerFragment : Fragment(), ServerView { } text_server_protocol.adapter = ArrayAdapter(activity, - android.R.layout.simple_dropdown_item_1line, arrayOf("https://", "http://")) + R.layout.spinner_list, arrayOf("https://", "http://")) text_server_protocol.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { when(position) { @@ -104,7 +104,7 @@ class ServerFragment : Fragment(), ServerView { override fun onDestroyView() { super.onDestroyView() - relative_layout.viewTreeObserver.removeOnGlobalLayoutListener(layoutListener) + constraint_layout.viewTreeObserver.removeOnGlobalLayoutListener(layoutListener) } override fun showInvalidServerUrlMessage() = showMessage(getString(R.string.msg_invalid_server_url)) diff --git a/app/src/main/java/chat/rocket/android/authentication/ui/AuthenticationActivity.kt b/app/src/main/java/chat/rocket/android/authentication/ui/AuthenticationActivity.kt index 7ff59a81da..daaa6b2f90 100644 --- a/app/src/main/java/chat/rocket/android/authentication/ui/AuthenticationActivity.kt +++ b/app/src/main/java/chat/rocket/android/authentication/ui/AuthenticationActivity.kt @@ -67,7 +67,7 @@ class AuthenticationActivity : AppCompatActivity(), HasSupportFragmentInjector { } fun showServerInput(deepLinkInfo: LoginDeepLinkInfo?) { - addFragment("ServerFragment", R.id.fragment_container, allowStateLoss = true) { + addFragment("OnBoardingFragment", R.id.fragment_container, allowStateLoss = true) { // ServerFragment.newInstance(deepLinkInfo) OnBoardingFragment.newInstance() } diff --git a/app/src/main/res/drawable/ic_onboarding.xml b/app/src/main/res/drawable/ic_onboarding.xml index c566c0a5bb..5b048825aa 100644 --- a/app/src/main/res/drawable/ic_onboarding.xml +++ b/app/src/main/res/drawable/ic_onboarding.xml @@ -1,664 +1,773 @@ - + - + android:pathData="M140.189,16.897C134.348,15.539 128.266,14.821 122.018,14.821C111.572,14.82 101.37,16.858 91.924,20.689C91.651,20.137 91.33,19.61 90.967,19.114C100.7,15.126 111.23,13 122.018,13C129.004,13 135.787,13.878 142.265,15.529C141.556,15.957 140.864,16.413 140.189,16.897ZM188.915,50.846C189.13,50.046 189.313,49.238 189.464,48.424C198.627,61.659 204,77.711 204,94.997C204,140.217 167.218,177 122,177C76.782,177 40,140.211 40,94.997C40,93.872 40.022,92.751 40.067,91.634C40.734,91.98 41.232,92.69 41.839,93.146C41.839,93.765 41.839,94.384 41.839,95.003C41.839,139.215 77.807,175.185 122.018,175.185C166.229,175.185 202.197,139.215 202.197,95.003C202.197,78.7 197.307,63.517 188.915,50.846ZM80.722,26.288C80.714,26.293 80.705,26.298 80.696,26.303C80.281,25.939 79.831,25.502 79.362,24.984C79.365,24.982 79.368,24.98 79.372,24.978C79.848,25.475 80.305,25.912 80.722,26.288ZM75.927,29.412C69.829,33.704 64.297,38.871 59.532,44.818L57.213,44.818C62.398,38.11 68.524,32.331 75.329,27.61C75.478,28.225 75.678,28.828 75.927,29.412Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + + android:strokeLineCap="round" /> + + android:strokeLineCap="round" /> + + + + android:strokeLineCap="round" /> + + + + + + android:pathData="M205.5,31L198,31" + android:strokeWidth="3" + android:strokeColor="#E1E5E8" + android:strokeLineCap="round" /> + + + + + + android:pathData="M48.5,29L41,29" + android:strokeWidth="3" + android:strokeColor="#E1E5E8" + android:strokeLineCap="round" /> + + android:strokeColor="#E1E5E8" /> + + android:strokeColor="#E1E5E8" /> + + android:strokeColor="#E1E5E8" /> + + android:strokeColor="#E1E5E8" /> + - + android:strokeLineCap="round" /> + + + + android:pathData="M246,86L240,86" + android:strokeWidth="3" + android:strokeColor="#E1E5E8" + android:strokeLineCap="round" /> + + + + + + android:pathData="M71,100C71,100 91.468,106.392 82.907,127" + android:strokeWidth="3" + android:strokeColor="#E1E5E8" + android:strokeLineCap="round" /> + + + + + + android:pathData="M111.216,88C111.216,88 103.487,62.498 127,59" + android:strokeWidth="3" + android:strokeColor="#E1E5E8" + android:strokeLineCap="round" /> + + + + + + android:pathData="M108.267,129C108.267,129 103.666,118.058 112,116" + android:strokeWidth="3" + android:strokeColor="#E1E5E8" + android:strokeLineCap="round" /> + + + + + + android:pathData="M86,59C86,59 97.204,40.499 122,49.441" + android:strokeWidth="3" + android:strokeColor="#E1E5E8" + android:strokeLineCap="round" /> + - + android:strokeColor="#175CC4" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + + android:strokeColor="#175CC4" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + - + android:strokeColor="#00000000" /> + - + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + + + + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + + + + + + android:pathData="M120.113,43.868C111.679,38.773 107.377,33.678 108.341,29.926C109.305,26.173 115.516,23.74 125.385,23.278C126.557,23.222 127.762,23.194 128.999,23.194C130.933,23.194 132.946,23.26 135.024,23.392C135.341,22.992 135.667,22.613 136,22.253C132.448,21.99 128.883,21.932 125.324,22.079C114.739,22.571 108.293,25.25 107.172,29.626C106.052,34.002 110.426,39.42 119.493,44.887C122.681,46.786 125.98,48.493 129.373,50C129.24,49.512 129.12,49.019 129.011,48.519C125.961,47.135 122.99,45.582 120.113,43.868Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + + + - + + - + + - + + - + android:strokeColor="#00000000" /> + - + android:strokeColor="#00000000" /> + - + android:strokeColor="#00000000" /> + + android:strokeLineCap="round" /> + + android:strokeLineCap="round" /> + - + android:strokeColor="#00000000" /> + + + + android:fillType="evenOdd" + android:pathData="M56.561,64C54.181,64.439 52.089,65.396 50.606,67.416C47.278,71.938 49.327,77.078 54.857,78.098C56.703,78.437 59.601,77.078 60.179,79.018C60.935,81.551 62.332,84.177 61.68,87.049C61.311,88.674 62.141,90.07 62.99,91.287C63.839,92.504 64.897,93.919 66.804,92.208C69.21,90.058 71.861,88.254 71.917,84.485C71.96,81.143 74.673,79.049 76.34,76.059C73.743,74.76 71.845,72.382 71.148,69.554C73.535,69.338 76.131,71.975 77.792,69.084C78.591,67.694 76.85,66.879 76.561,65.687" + android:strokeWidth="2" + android:strokeColor="#0229BC" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + + + + android:fillType="evenOdd" + android:pathData="M33,70C35.388,70.472 34.669,72.288 34.713,73.716C34.776,75.784 34.644,77.582 37.264,78.795C38.434,79.279 39.338,80.212 39.753,81.364C40.168,82.517 40.056,83.783 39.446,84.853C38.752,86.258 39.283,87.632 39.052,89" + android:strokeWidth="2" + android:strokeColor="#0229BC" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + + + + android:fillType="evenOdd" + android:pathData="M44.549,50C45.942,53.353 43.922,55.033 41.054,55.77C38.516,56.314 36.325,57.845 35,60" + android:strokeWidth="2" + android:strokeColor="#0229BC" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + + android:fillColor="#00000000" + android:fillType="evenOdd" + android:pathData="M51,50.994C54.201,51.126 56.125,49.108 58,47" + android:strokeWidth="2" + android:strokeColor="#0229BC" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + + + + android:fillType="evenOdd" + android:pathData="M62,98C58.455,96.594 54.731,96.964 51,97.358" + android:strokeWidth="2" + android:strokeColor="#0229BC" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + + android:fillColor="#00000000" + android:fillType="evenOdd" + android:pathData="M84,65L84,70C80.806,68.165 79.828,64.394 76,66.161" + android:strokeWidth="2" + android:strokeColor="#0229BC" + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + - + android:strokeColor="#00000000" /> + - + android:strokeColor="#00000000" /> + - + android:strokeColor="#00000000" /> + + + + + + android:pathData="M196,121m-21.811,2.875a22,22 128.215,1 1,43.623 -5.751a22,22 128.215,1 1,-43.623 5.751" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + + android:pathData="M197,119m-21.811,2.875a22,22 65.095,1 1,43.623 -5.751a22,22 65.095,1 1,-43.623 5.751" + android:strokeWidth="2" + android:strokeColor="#175CC4" /> + + android:strokeLineCap="round" /> + - + android:strokeLineCap="round" /> + + + + android:pathData="M202,135m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" + android:strokeWidth="2" + android:strokeColor="#175CC4" + android:strokeLineCap="round" /> + + android:pathData="M166.5,141.5m-6.444,0.85a6.5,6.5 61.837,1 1,12.888 -1.699a6.5,6.5 61.837,1 1,-12.888 1.699" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + + + + android:pathData="M182,151m-3.966,0.523a4,4 127.79,1 1,7.931 -1.046a4,4 127.79,1 1,-7.931 1.046" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + + + + android:pathData="M127.5,102.5m-3.597,18.147a18.5,18.5 54.442,1 1,7.193 -36.294a18.5,18.5 54.442,1 1,-7.193 36.294" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + - + android:strokeColor="#175CC4" /> + + android:fillColor="#61666E" + android:fillType="nonZero" + android:pathData="M126.5,90.5m-0.486,2.452a2.5,2.5 121.374,1 1,0.972 -4.905a2.5,2.5 121.374,1 1,-0.972 4.905" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + + android:fillColor="#61666E" + android:fillType="nonZero" + android:pathData="M142,104m-0.583,2.943a3,3 111.552,1 1,1.166 -5.886a3,3 111.552,1 1,-1.166 5.886" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + + android:fillColor="#61666E" + android:fillType="nonZero" + android:pathData="M133,110m-0.972,4.905a5,5 112.598,1 1,1.944 -9.809a5,5 112.598,1 1,-1.944 9.809" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + + android:fillColor="#61666E" + android:fillType="nonZero" + android:pathData="M133.274,85.116C133.043,85.073 132.817,85.037 132.586,85C132.369,85.415 132.212,85.859 132.117,86.318C131.839,87.539 132.061,88.821 132.734,89.876C133.407,90.931 134.475,91.672 135.697,91.931C137.999,92.326 139.936,91.573 140.689,89.357C138.464,87.504 136.116,85.66 133.274,85.116Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + + android:pathData="M134,108m-0.972,4.905a5,5 112.598,1 1,1.944 -9.809a5,5 112.598,1 1,-1.944 9.809" + android:strokeWidth="2" + android:strokeColor="#175CC4" /> + + android:pathData="M143,103m-0.583,2.943a3,3 111.552,1 1,1.166 -5.886a3,3 111.552,1 1,-1.166 5.886" + android:strokeWidth="2" + android:strokeColor="#175CC4" /> + + android:pathData="M127,89m-0.389,1.962a2,2 101.648,1 1,0.778 -3.924a2,2 101.648,1 1,-0.778 3.924" + android:strokeWidth="2" + android:strokeColor="#175CC4" /> + + android:pathData="M133.147,83.432C132.916,83.389 132.622,83.469 132.391,83.432C132.174,83.847 132.212,83.859 132.117,84.318C131.839,85.539 132.061,86.821 132.734,87.876C133.407,88.931 134.475,89.672 135.697,89.931C137.999,90.326 140.022,89.424 140.775,87.208C138.549,85.354 135.99,83.976 133.147,83.432Z" + android:strokeWidth="2" + android:strokeColor="#175CC4" /> + + android:fillColor="#FFD21F" + android:fillType="nonZero" + android:pathData="M52.621,112.791L58.947,115.787A3,3 127.343,0 1,60.375 119.782L60.375,119.782A3,3 127.343,0 1,56.379 121.209L50.053,118.213A3,3 117.626,0 1,48.625 114.218L48.625,114.218A3,3 117.626,0 1,52.621 112.791z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + + android:fillColor="#FFD21F" + android:fillType="nonZero" + android:pathData="M25.621,100.791L31.947,103.787A3,3 114.062,0 1,33.375 107.782L33.375,107.782A3,3 114.062,0 1,29.379 109.209L23.053,106.213A3,3 63.668,0 1,21.625 102.218L21.625,102.218A3,3 63.668,0 1,25.621 100.791z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + + android:fillColor="#1D74F5" + android:fillType="nonZero" + android:pathData="M41.5,111.5m-1.926,4.067a4.5,4.5 81.105,1 1,3.852 -8.134a4.5,4.5 81.105,1 1,-3.852 8.134" + android:strokeWidth="1" + android:strokeColor="#00000000" /> + - + android:strokeColor="#175CC4" /> + - + android:strokeColor="#175CC4" /> + - + android:strokeColor="#175CC4" /> + - + android:strokeColor="#175CC4" /> + - + android:strokeColor="#175CC4" /> + - - - + android:strokeColor="#00000000" /> + - - + android:strokeColor="#175CC4" /> + - + + - + + - + + - + + - + android:strokeColor="#00000000" /> + - + android:strokeColor="#00000000" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_server.xml b/app/src/main/res/drawable/ic_server.xml new file mode 100644 index 0000000000..a3d3568e28 --- /dev/null +++ b/app/src/main/res/drawable/ic_server.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/style_edit_text_authentication.xml b/app/src/main/res/drawable/style_edit_text_authentication.xml index e76e51253d..dda8f74ebe 100644 --- a/app/src/main/res/drawable/style_edit_text_authentication.xml +++ b/app/src/main/res/drawable/style_edit_text_authentication.xml @@ -3,7 +3,7 @@ android:shape="rectangle"> + android:color="@color/colorWhite" /> diff --git a/app/src/main/res/layout/fragment_authentication_server.xml b/app/src/main/res/layout/fragment_authentication_server.xml index dd827ed848..bdb4ccc376 100644 --- a/app/src/main/res/layout/fragment_authentication_server.xml +++ b/app/src/main/res/layout/fragment_authentication_server.xml @@ -1,61 +1,110 @@ - + + - - - - - - + android:textSize="22sp" + android:fontFamily="sans-serif" + android:textStyle="bold" + android:textColor="#2f343d" + android:lineSpacingExtra="6sp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@id/image_server" + android:layout_marginTop="8dp" + android:text="@string/title_sign_in_your_server" /> + + + + + + + + + + + +