diff --git a/app/build.gradle b/app/build.gradle index 9bfe286740..c8a2a36f39 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -105,6 +105,7 @@ dependencies { implementation project(':util') implementation project(':core') implementation project(':suggestions') + implementation project(':themelibrary') implementation libraries.kotlin implementation libraries.coroutinesCore @@ -121,6 +122,9 @@ dependencies { implementation libraries.dagger implementation libraries.daggerSupport + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' kapt libraries.daggerProcessor kapt libraries.daggerAndroidApt @@ -180,6 +184,7 @@ dependencies { testImplementation libraries.truth androidTestImplementation libraries.espressoCore androidTestImplementation libraries.espressoIntents + implementation 'com.google.code.gson:gson:2.8.5' } androidExtensions { @@ -200,4 +205,4 @@ task compileSdk(type: Exec) { preBuild.dependsOn compileSdk if (isPlay) { apply plugin: 'com.google.gms.google-services' -} \ No newline at end of file +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4aad7ac636..69c78f40d5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,23 +19,21 @@ android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" + android:theme="@style/AppTheme" tools:replace="android:name"> - + - - @@ -45,7 +43,6 @@ - - - + /> - - - - - - - - + android:name=".thememanager.ui.ThemesActivity" + android:windowSoftInputMode="adjustResize|stateAlwaysHidden" /> + + - + + \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/app/DrawableHelper.kt b/app/src/main/java/chat/rocket/android/app/DrawableHelper.kt index 8b3220472c..e1e9a73257 100644 --- a/app/src/main/java/chat/rocket/android/app/DrawableHelper.kt +++ b/app/src/main/java/chat/rocket/android/app/DrawableHelper.kt @@ -142,6 +142,16 @@ object DrawableHelper { textView.setCompoundDrawablesWithIntrinsicBounds(startDrawable, null, endDrawable, null) } + /** + * Compounds a Drawable (to appear on top of a text) into a TextView. + * + * @param textView The TextView. + * @param drawable The Drawable. + * @see compoundDrawables + */ + fun compoundTopDrawable(textView: TextView, drawable: Drawable) = + textView.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null) + /** * Returns the user status drawable. * diff --git a/app/src/main/java/chat/rocket/android/authentication/login/ui/LoginFragment.kt b/app/src/main/java/chat/rocket/android/authentication/login/ui/LoginFragment.kt index 98169b957d..8a7a945cff 100644 --- a/app/src/main/java/chat/rocket/android/authentication/login/ui/LoginFragment.kt +++ b/app/src/main/java/chat/rocket/android/authentication/login/ui/LoginFragment.kt @@ -20,17 +20,15 @@ import chat.rocket.android.helper.getCredentials import chat.rocket.android.helper.hasCredentialsSupport import chat.rocket.android.helper.requestStoredCredentials import chat.rocket.android.helper.saveCredentials +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.asObservable -import chat.rocket.android.util.extensions.clearLightStatusBar -import chat.rocket.android.util.extensions.inflate -import chat.rocket.android.util.extensions.showToast -import chat.rocket.android.util.extensions.textContent -import chat.rocket.android.util.extensions.ui +import chat.rocket.android.util.extensions.* import dagger.android.support.AndroidSupportInjection import io.reactivex.disposables.CompositeDisposable import io.reactivex.rxkotlin.Observables import kotlinx.android.synthetic.main.app_bar.* import kotlinx.android.synthetic.main.fragment_authentication_log_in.* +import kotlinx.android.synthetic.main.fragment_authentication_log_in.view_loading import javax.inject.Inject private const val SERVER_NAME = "server_name" @@ -73,6 +71,11 @@ class LoginFragment : Fragment(), LoginView { setupToolbar() presenter.setupView() subscribeEditTexts() + +// if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { + tintEditTextDrawableStart() +// } + setupOnClickListener() analyticsManager.logScreenView(ScreenViewEvent.Login) } @@ -111,7 +114,7 @@ class LoginFragment : Fragment(), LoginView { private fun setupToolbar() { with(activity as AuthenticationActivity) { - this.clearLightStatusBar() + view?.let {this.clearInvisibleStatusBar(it)} toolbar.isVisible = true toolbar.title = serverName?.replace(getString(R.string.default_protocol), "") } @@ -167,7 +170,7 @@ class LoginFragment : Fragment(), LoginView { override fun enableButtonLogin() { context?.let { ViewCompat.setBackgroundTintList( - button_log_in, ContextCompat.getColorStateList(it, R.color.colorAccent) + button_log_in, ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorAccent)) ) button_log_in.isEnabled = true } @@ -178,7 +181,7 @@ class LoginFragment : Fragment(), LoginView { context?.let { ViewCompat.setBackgroundTintList( button_log_in, - ContextCompat.getColorStateList(it, R.color.colorAuthenticationButtonDisabled) + ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorButtonDisabled)) ) button_log_in.isEnabled = false } @@ -187,9 +190,7 @@ class LoginFragment : Fragment(), LoginView { override fun enableButtonForgetPassword() { context?.let { button_forgot_your_password.isEnabled = true - button_forgot_your_password.setTextColor( - ContextCompat.getColorStateList(it, R.color.colorAccent) - ) + button_forgot_your_password.setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) } } @@ -197,7 +198,7 @@ class LoginFragment : Fragment(), LoginView { context?.let { button_forgot_your_password.isEnabled = false button_forgot_your_password.setTextColor( - ContextCompat.getColorStateList(it, R.color.colorAuthenticationButtonDisabled) + ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorButtonDisabled)) ) } } @@ -253,4 +254,15 @@ class LoginFragment : Fragment(), LoginView { text_password.isEnabled = false } } + + private fun tintEditTextDrawableStart() { + ui { + val atDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_at_black_20dp, it) + val keyDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_key_black_20dp, it) + val drawables = arrayOf(atDrawable, keyDrawable) + DrawableHelper.wrapDrawables(drawables) + DrawableHelper.tintDrawables(drawables, it, ThemeUtil.getThemeColorResource(R.attr.colorDrawableStrongTint)) + DrawableHelper.compoundDrawables( arrayOf(text_username_or_email, text_password), drawables) + } + } } diff --git a/app/src/main/java/chat/rocket/android/authentication/loginoptions/ui/LoginOptionsFragment.kt b/app/src/main/java/chat/rocket/android/authentication/loginoptions/ui/LoginOptionsFragment.kt index 4d317c817c..c4498dc4a7 100644 --- a/app/src/main/java/chat/rocket/android/authentication/loginoptions/ui/LoginOptionsFragment.kt +++ b/app/src/main/java/chat/rocket/android/authentication/loginoptions/ui/LoginOptionsFragment.kt @@ -213,9 +213,14 @@ class LoginOptionsFragment : Fragment(), LoginOptionsView { private fun setupToolbar() { with(activity as AuthenticationActivity) { - this.clearLightStatusBar() + view?.let {this.clearInvisibleStatusBar(it)} toolbar.isVisible = true toolbar.title = serverName?.replace(getString(R.string.default_protocol), "") + val overflowIcon = toolbar.overflowIcon + overflowIcon?.let{ + val wrappedDrawable = DrawableHelper.wrapDrawable(it) + DrawableHelper.tintDrawable(wrappedDrawable, this, R.color.colorWhite) + } } } diff --git a/app/src/main/java/chat/rocket/android/authentication/onboarding/ui/OnBoardingFragment.kt b/app/src/main/java/chat/rocket/android/authentication/onboarding/ui/OnBoardingFragment.kt index c2e1a10603..d1c2906a0d 100644 --- a/app/src/main/java/chat/rocket/android/authentication/onboarding/ui/OnBoardingFragment.kt +++ b/app/src/main/java/chat/rocket/android/authentication/onboarding/ui/OnBoardingFragment.kt @@ -12,10 +12,7 @@ import chat.rocket.android.analytics.event.ScreenViewEvent import chat.rocket.android.authentication.onboarding.presentation.OnBoardingPresenter import chat.rocket.android.authentication.onboarding.presentation.OnBoardingView import chat.rocket.android.authentication.ui.AuthenticationActivity -import chat.rocket.android.util.extensions.inflate -import chat.rocket.android.util.extensions.setLightStatusBar -import chat.rocket.android.util.extensions.showToast -import chat.rocket.android.util.extensions.ui +import chat.rocket.android.util.extensions.* import dagger.android.support.AndroidSupportInjection import kotlinx.android.synthetic.main.app_bar.* import kotlinx.android.synthetic.main.fragment_authentication_on_boarding.* @@ -48,7 +45,7 @@ class OnBoardingFragment : Fragment(), OnBoardingView { private fun setupToolbar() { with(activity as AuthenticationActivity) { - view?.let { this.setLightStatusBar(it) } + view?.let { this.setInvisibleStatusBar(it) } toolbar.isVisible = false } } diff --git a/app/src/main/java/chat/rocket/android/authentication/registerusername/ui/RegisterUsernameFragment.kt b/app/src/main/java/chat/rocket/android/authentication/registerusername/ui/RegisterUsernameFragment.kt index 0ddd217bd4..f51922f1d4 100644 --- a/app/src/main/java/chat/rocket/android/authentication/registerusername/ui/RegisterUsernameFragment.kt +++ b/app/src/main/java/chat/rocket/android/authentication/registerusername/ui/RegisterUsernameFragment.kt @@ -1,7 +1,6 @@ package chat.rocket.android.authentication.registerusername.ui import DrawableHelper -import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -15,6 +14,7 @@ import chat.rocket.android.analytics.AnalyticsManager import chat.rocket.android.analytics.event.ScreenViewEvent import chat.rocket.android.authentication.registerusername.presentation.RegisterUsernamePresenter import chat.rocket.android.authentication.registerusername.presentation.RegisterUsernameView +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.showKeyboard @@ -71,9 +71,9 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView { showKeyboard(text_username) } - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { +// if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { tintEditTextDrawableStart() - } +// } setupOnClickListener() subscribeEditText() @@ -89,7 +89,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView { override fun enableButtonUseThisUsername() { context?.let { ViewCompat.setBackgroundTintList( - button_use_this_username, ContextCompat.getColorStateList(it, R.color.colorAccent) + button_use_this_username, ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorAccent)) ) button_use_this_username.isEnabled = true } @@ -99,7 +99,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView { context?.let { ViewCompat.setBackgroundTintList( button_use_this_username, - ContextCompat.getColorStateList(it, R.color.colorAuthenticationButtonDisabled) + ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorButtonDisabled)) ) button_use_this_username.isEnabled = false } @@ -139,7 +139,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView { ui { val atDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_at_black_20dp, it) DrawableHelper.wrapDrawable(atDrawable) - DrawableHelper.tintDrawable(atDrawable, it, R.color.colorDrawableTintGrey) + DrawableHelper.tintDrawable(atDrawable, it, ThemeUtil.getThemeColorResource(R.attr.colorDrawableStrongTint)) DrawableHelper.compoundStartDrawable(text_username, atDrawable) } } diff --git a/app/src/main/java/chat/rocket/android/authentication/resetpassword/ui/ResetPasswordFragment.kt b/app/src/main/java/chat/rocket/android/authentication/resetpassword/ui/ResetPasswordFragment.kt index 61b5d09c25..ccf5b601ed 100644 --- a/app/src/main/java/chat/rocket/android/authentication/resetpassword/ui/ResetPasswordFragment.kt +++ b/app/src/main/java/chat/rocket/android/authentication/resetpassword/ui/ResetPasswordFragment.kt @@ -13,6 +13,7 @@ import chat.rocket.android.analytics.AnalyticsManager import chat.rocket.android.analytics.event.ScreenViewEvent import chat.rocket.android.authentication.resetpassword.presentation.ResetPasswordPresenter import chat.rocket.android.authentication.resetpassword.presentation.ResetPasswordView +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.isEmail @@ -55,6 +56,10 @@ class ResetPasswordFragment : Fragment(), ResetPasswordView { showKeyboard(text_email) } +// if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { + tintEditTextDrawableStart() +// } + setupOnClickListener() subscribeEditText() @@ -74,7 +79,7 @@ class ResetPasswordFragment : Fragment(), ResetPasswordView { override fun enableButtonConnect() { context?.let { ViewCompat.setBackgroundTintList( - button_reset_password, ContextCompat.getColorStateList(it, R.color.colorAccent) + button_reset_password, ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorAccent)) ) button_reset_password.isEnabled = true } @@ -84,7 +89,7 @@ class ResetPasswordFragment : Fragment(), ResetPasswordView { context?.let { ViewCompat.setBackgroundTintList( button_reset_password, - ContextCompat.getColorStateList(it, R.color.colorAuthenticationButtonDisabled) + ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorButtonDisabled)) ) button_reset_password.isEnabled = false } @@ -147,4 +152,13 @@ class ResetPasswordFragment : Fragment(), ResetPasswordView { } private fun unsubscribeEditText() = emailAddressDisposable.dispose() + + private fun tintEditTextDrawableStart() { + ui { + val atDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_email_black_20dp, it) + DrawableHelper.wrapDrawable(atDrawable) + DrawableHelper.tintDrawable(atDrawable, it, ThemeUtil.getThemeColorResource(R.attr.colorDrawableStrongTint)) + DrawableHelper.compoundStartDrawable(text_email, atDrawable) + } + } } \ No newline at end of file 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 eb8668ac58..89d483ed5b 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 @@ -25,15 +25,9 @@ import chat.rocket.android.authentication.server.presentation.ServerPresenter import chat.rocket.android.authentication.server.presentation.ServerView import chat.rocket.android.authentication.ui.AuthenticationActivity import chat.rocket.android.helper.KeyboardHelper +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.asObservable -import chat.rocket.android.util.extensions.hintContent -import chat.rocket.android.util.extensions.inflate -import chat.rocket.android.util.extensions.isValidUrl -import chat.rocket.android.util.extensions.sanitize -import chat.rocket.android.util.extensions.setLightStatusBar -import chat.rocket.android.util.extensions.showToast -import chat.rocket.android.util.extensions.textContent -import chat.rocket.android.util.extensions.ui +import chat.rocket.android.util.extensions.* import chat.rocket.common.util.ifNull import dagger.android.support.AndroidSupportInjection import io.reactivex.disposables.Disposable @@ -113,17 +107,19 @@ class ServerFragment : Fragment(), ServerView { private fun setupToolbar() { with(activity as AuthenticationActivity) { - view?.let { setLightStatusBar(it) } + view?.let { setInvisibleStatusBar(it) } toolbar.isVisible = false } } private fun setupSpinner() { context?.let { - spinner_server_protocol.adapter = ArrayAdapter( - it, - android.R.layout.simple_dropdown_item_1line, arrayOf("https://", "http://") + val adapter = ArrayAdapter( + it, + android.R.layout.simple_dropdown_item_1line, arrayOf("https://", "http://") ) + adapter.setDropDownViewResource(R.layout.spinner_dropdown_item) + spinner_server_protocol.adapter = adapter spinner_server_protocol.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { @@ -159,7 +155,7 @@ class ServerFragment : Fragment(), ServerView { override fun enableButtonConnect() { context?.let { ViewCompat.setBackgroundTintList( - button_connect, ContextCompat.getColorStateList(it, R.color.colorAccent) + button_connect, ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorAccent)) ) button_connect.isEnabled = true } @@ -169,7 +165,7 @@ class ServerFragment : Fragment(), ServerView { context?.let { ViewCompat.setBackgroundTintList( button_connect, - ContextCompat.getColorStateList(it, R.color.colorAuthenticationButtonDisabled) + ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorButtonDisabled)) ) button_connect.isEnabled = false } @@ -282,7 +278,7 @@ class ServerFragment : Fragment(), ServerView { private fun addDomain() { val cursorPosition = text_server_url.length() text_server_url.append(SpannableStringBuilder() - .color(R.color.colorAuthenticationSecondaryText) { append("rocket.chat") }) + .color(ThemeUtil.getThemeColorResource(R.attr.colorDescriptiveText)) { append("rocket.chat") }) text_server_url.setSelection(cursorPosition) appendedText = text_server_url.text.toString() isDomainAppended = true diff --git a/app/src/main/java/chat/rocket/android/authentication/signup/ui/SignupFragment.kt b/app/src/main/java/chat/rocket/android/authentication/signup/ui/SignupFragment.kt index fcf39174fb..3c6dff7d9d 100644 --- a/app/src/main/java/chat/rocket/android/authentication/signup/ui/SignupFragment.kt +++ b/app/src/main/java/chat/rocket/android/authentication/signup/ui/SignupFragment.kt @@ -15,7 +15,9 @@ import chat.rocket.android.analytics.AnalyticsManager import chat.rocket.android.analytics.event.ScreenViewEvent import chat.rocket.android.authentication.signup.presentation.SignupPresenter import chat.rocket.android.authentication.signup.presentation.SignupView +import chat.rocket.android.authentication.ui.AuthenticationActivity import chat.rocket.android.helper.saveCredentials +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.isEmail @@ -54,6 +56,7 @@ class SignupFragment : Fragment(), SignupView { super.onViewCreated(view, savedInstanceState) subscribeEditTexts() + tintEditTextDrawableStart() setupOnClickListener() analyticsManager.logScreenView(ScreenViewEvent.SignUp) @@ -89,7 +92,7 @@ class SignupFragment : Fragment(), SignupView { override fun enableButtonRegister() { context?.let { ViewCompat.setBackgroundTintList( - button_register, ContextCompat.getColorStateList(it, R.color.colorAccent) + button_register, ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorAccent)) ) button_register.isEnabled = true } @@ -100,7 +103,7 @@ class SignupFragment : Fragment(), SignupView { context?.let { ViewCompat.setBackgroundTintList( button_register, - ContextCompat.getColorStateList(it, R.color.colorAuthenticationButtonDisabled) + ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorButtonDisabled)) ) button_register.isEnabled = false } @@ -180,4 +183,22 @@ class SignupFragment : Fragment(), SignupView { text_password.isEnabled = false text_email.isEnabled = false } + + private fun tintEditTextDrawableStart() { + (activity as AuthenticationActivity).apply { + val personDrawable = + DrawableHelper.getDrawableFromId(R.drawable.ic_person_black_20dp, this) + val atDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_at_black_20dp, this) + val keyDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_key_black_20dp, this) + val emailDrawable = + DrawableHelper.getDrawableFromId(R.drawable.ic_email_black_20dp, this) + + val drawables = arrayOf(personDrawable, atDrawable, keyDrawable, emailDrawable) + DrawableHelper.wrapDrawables(drawables) + DrawableHelper.tintDrawables(drawables, this, ThemeUtil.getThemeColorResource(R.attr.colorDrawableStrongTint)) + DrawableHelper.compoundDrawables( + arrayOf(text_name, text_username, text_password, text_email), drawables + ) + } + } } diff --git a/app/src/main/java/chat/rocket/android/authentication/twofactor/ui/TwoFAFragment.kt b/app/src/main/java/chat/rocket/android/authentication/twofactor/ui/TwoFAFragment.kt index 7f01393176..288111ba85 100644 --- a/app/src/main/java/chat/rocket/android/authentication/twofactor/ui/TwoFAFragment.kt +++ b/app/src/main/java/chat/rocket/android/authentication/twofactor/ui/TwoFAFragment.kt @@ -15,6 +15,7 @@ import chat.rocket.android.analytics.AnalyticsManager import chat.rocket.android.analytics.event.ScreenViewEvent import chat.rocket.android.authentication.twofactor.presentation.TwoFAPresenter import chat.rocket.android.authentication.twofactor.presentation.TwoFAView +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.showToast @@ -86,7 +87,7 @@ class TwoFAFragment : Fragment(), TwoFAView { override fun enableButtonConfirm() { context?.let { ViewCompat.setBackgroundTintList( - button_confirm, ContextCompat.getColorStateList(it, R.color.colorAccent) + button_confirm, ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorAccent)) ) button_confirm.isEnabled = true } @@ -96,7 +97,7 @@ class TwoFAFragment : Fragment(), TwoFAView { context?.let { ViewCompat.setBackgroundTintList( button_confirm, - ContextCompat.getColorStateList(it, R.color.colorAuthenticationButtonDisabled) + ContextCompat.getColorStateList(it, ThemeUtil.getThemeColorResource(R.attr.colorButtonDisabled)) ) button_confirm.isEnabled = false } 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 36bfcfcfea..b82daa7753 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 @@ -11,6 +11,8 @@ import androidx.fragment.app.Fragment import chat.rocket.android.R import chat.rocket.android.authentication.domain.model.DeepLinkInfo import chat.rocket.android.authentication.presentation.AuthenticationPresenter +import chat.rocket.android.thememanager.BaseActivity +import chat.rocket.android.util.extensions.addFragment import chat.rocket.android.dynamiclinks.DynamicLinksForFirebase import chat.rocket.android.util.extensions.getDeepLinkInfo import chat.rocket.android.util.extensions.isDynamicLink @@ -23,7 +25,7 @@ import dagger.android.support.HasSupportFragmentInjector import kotlinx.android.synthetic.main.app_bar.* import javax.inject.Inject -class AuthenticationActivity : AppCompatActivity(), HasSupportFragmentInjector { +class AuthenticationActivity : BaseActivity(), HasSupportFragmentInjector { @Inject lateinit var fragmentDispatchingAndroidInjector: DispatchingAndroidInjector @Inject diff --git a/app/src/main/java/chat/rocket/android/chatdetails/adapter/OptionViewHolder.kt b/app/src/main/java/chat/rocket/android/chatdetails/adapter/OptionViewHolder.kt index a9cec0d045..0e3a029385 100644 --- a/app/src/main/java/chat/rocket/android/chatdetails/adapter/OptionViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatdetails/adapter/OptionViewHolder.kt @@ -7,6 +7,7 @@ import android.widget.TextView import chat.rocket.android.R import chat.rocket.android.chatdetails.domain.Option import chat.rocket.android.chatrooms.adapter.ViewHolder +import chat.rocket.android.thememanager.util.ThemeUtil import kotlinx.android.synthetic.main.item_detail_option.view.* class OptionViewHolder( @@ -24,7 +25,7 @@ class OptionViewHolder( val drawable = DrawableHelper.getDrawableFromId(option.icon, itemView.context) drawable.let { image -> val mutateDrawable = DrawableHelper.wrapDrawable(image).mutate() - DrawableHelper.tintDrawable(mutateDrawable, itemView.context, R.color.colorPrimaryText) + DrawableHelper.tintDrawable(mutateDrawable, itemView.context, ThemeUtil.getThemeColorResource(R.attr.colorPrimaryText)) view.setImageDrawable(mutateDrawable) } } diff --git a/app/src/main/java/chat/rocket/android/chatdetails/ui/ChatDetailsFragment.kt b/app/src/main/java/chat/rocket/android/chatdetails/ui/ChatDetailsFragment.kt index f14ac6d5c0..f3ec7182cb 100644 --- a/app/src/main/java/chat/rocket/android/chatdetails/ui/ChatDetailsFragment.kt +++ b/app/src/main/java/chat/rocket/android/chatdetails/ui/ChatDetailsFragment.kt @@ -21,6 +21,7 @@ import chat.rocket.android.chatdetails.viewmodel.ChatDetailsViewModelFactory import chat.rocket.android.chatroom.ui.ChatRoomActivity import chat.rocket.android.server.domain.CurrentServerRepository import chat.rocket.android.server.domain.GetSettingsInteractor +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.showToast import chat.rocket.android.util.extensions.ui @@ -188,13 +189,13 @@ class ChatDetailsFragment : Fragment(), ChatDetailsView { is RoomType.PrivateGroup -> { DrawableHelper.getDrawableFromId(R.drawable.ic_lock_black_12_dp, context!!) } - else -> null + else -> DrawableHelper.getDrawableFromId(R.drawable.ic_hashtag_black_12dp, context!!) } drawable?.let { val wrappedDrawable = DrawableHelper.wrapDrawable(it) val mutableDrawable = wrappedDrawable.mutate() - DrawableHelper.tintDrawable(mutableDrawable, context!!, R.color.colorPrimary) + DrawableHelper.tintDrawable(mutableDrawable, context!!, ThemeUtil.getThemeColorResource(R.attr.colorMessageText)) DrawableHelper.compoundStartDrawable(name, mutableDrawable) } } diff --git a/app/src/main/java/chat/rocket/android/chatinformation/ui/MessageInfoActivity.kt b/app/src/main/java/chat/rocket/android/chatinformation/ui/MessageInfoActivity.kt index 92fd1e9b09..88af23ec0c 100644 --- a/app/src/main/java/chat/rocket/android/chatinformation/ui/MessageInfoActivity.kt +++ b/app/src/main/java/chat/rocket/android/chatinformation/ui/MessageInfoActivity.kt @@ -6,6 +6,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import chat.rocket.android.R +import chat.rocket.android.thememanager.BaseActivity +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extensions.addFragment import chat.rocket.android.util.extensions.textContent import dagger.android.AndroidInjection @@ -23,7 +25,7 @@ fun Context.messageInformationIntent(messageId: String): Intent { private const val INTENT_MESSAGE_ID = "message_id" -class MessageInfoActivity : AppCompatActivity(), HasSupportFragmentInjector { +class MessageInfoActivity : BaseActivity(), HasSupportFragmentInjector { @Inject lateinit var fragmentDispatchingAndroidInjector: DispatchingAndroidInjector @@ -45,6 +47,7 @@ class MessageInfoActivity : AppCompatActivity(), HasSupportFragmentInjector { private fun setupToolbar() { text_toolbar_title.textContent = getString(R.string.message_information_title) + toolbar.setBackgroundColor(ThemeUtil.getThemeColor(R.attr.colorPrimary)) setSupportActionBar(toolbar) supportActionBar?.setDisplayShowTitleEnabled(false) toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp) diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/AttachmentViewHolder.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/AttachmentViewHolder.kt index 2c5ed9fdb8..ad4e21c3e6 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/AttachmentViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/AttachmentViewHolder.kt @@ -15,6 +15,7 @@ import chat.rocket.android.chatroom.uimodel.AttachmentUiModel import chat.rocket.android.emoji.EmojiReactionListener import chat.rocket.android.helper.ImageHelper import chat.rocket.android.player.PlayerActivity +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extensions.content import chat.rocket.android.util.extensions.isVisible import chat.rocket.android.util.extensions.openTabbedUrl @@ -42,7 +43,7 @@ class AttachmentViewHolder( itemView.play_button ) - private val quoteBarColor = ContextCompat.getColor(itemView.context, R.color.quoteBar) + private val quoteBarColor = ThemeUtil.getThemeColor(R.attr.colorQuoteBar) init { with(itemView) { @@ -80,6 +81,7 @@ class AttachmentViewHolder( text_author_name.isVisible = data.hasAuthorLink && data.hasAuthorName if (data.hasAuthorLink && data.hasAuthorName) { bindAuthorLink(data) + text_author_name.setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) } // If not media or message, show the text with quote bar diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageReactionsAdapter.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageReactionsAdapter.kt index 87da4d9576..699bff866a 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageReactionsAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageReactionsAdapter.kt @@ -14,6 +14,7 @@ import chat.rocket.android.emoji.EmojiKeyboardListener import chat.rocket.android.emoji.EmojiPickerPopup import chat.rocket.android.emoji.EmojiReactionListener import chat.rocket.android.infrastructure.LocalRepository +import chat.rocket.android.thememanager.util.ThemeUtil import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.item_reaction.view.* import java.util.concurrent.CopyOnWriteArrayList @@ -114,7 +115,7 @@ class MessageReactionsAdapter : RecyclerView.Adapter() val myself = localRepository.get(LocalRepository.CURRENT_USERNAME_KEY) if (reaction.usernames.contains(myself)) { val context = itemView.context - text_count.setTextColor(ContextCompat.getColor(context, R.color.colorAccent)) + text_count.setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) } text_count.text = reaction.count.toString() diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt index 3c084461f5..e46c56aa05 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt @@ -6,10 +6,12 @@ import android.text.Spannable import android.text.method.LinkMovementMethod import android.text.style.ImageSpan import android.view.View +import androidx.core.content.ContextCompat import androidx.core.view.isVisible import chat.rocket.android.R import chat.rocket.android.chatroom.uimodel.MessageUiModel import chat.rocket.android.emoji.EmojiReactionListener +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.core.model.MessageType import chat.rocket.core.model.isSystemMessage import com.bumptech.glide.load.resource.gif.GifDrawable @@ -52,12 +54,14 @@ class MessageViewHolder( } text_content.text_content.text = data.content + text_content.setLinkTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) button_join_video_call.isVisible = data.message.type is MessageType.JitsiCallStarted button_join_video_call.setOnClickListener { joinVideoCallListener(it) } image_avatar.setImageURI(data.avatar) - text_content.setTextColor(if (data.isTemporary) Color.GRAY else Color.BLACK) + text_content.setTextColor(if (data.isTemporary) ThemeUtil.getThemeColor(R.attr.colorControlText) + else ThemeUtil.getThemeColor(R.attr.colorPrimaryText)) data.message.let { text_edit_indicator.isVisible = !it.isSystemMessage() && it.editedBy != null diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/UrlPreviewViewHolder.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/UrlPreviewViewHolder.kt index 16aaac7dd1..cf0c8c6400 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/UrlPreviewViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/UrlPreviewViewHolder.kt @@ -2,8 +2,10 @@ package chat.rocket.android.chatroom.adapter import android.view.View import androidx.core.view.isVisible +import chat.rocket.android.R import chat.rocket.android.chatroom.uimodel.UrlPreviewUiModel import chat.rocket.android.emoji.EmojiReactionListener +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extensions.content import chat.rocket.android.util.extensions.openTabbedUrl import kotlinx.android.synthetic.main.message_url_preview.view.* @@ -30,6 +32,8 @@ class UrlPreviewViewHolder( text_title.content = data.title text_description.content = data.description ?: "" + text_title.setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) + url_preview_layout.setOnClickListener(onClickListener) text_host.setOnClickListener(onClickListener) text_title.setOnClickListener(onClickListener) diff --git a/app/src/main/java/chat/rocket/android/chatroom/ui/ActionSnackbar.kt b/app/src/main/java/chat/rocket/android/chatroom/ui/ActionSnackbar.kt index 1fc5673756..5d38a915d5 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/ui/ActionSnackbar.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/ui/ActionSnackbar.kt @@ -11,6 +11,7 @@ import androidx.core.view.ViewCompat import androidx.core.view.setPadding import chat.rocket.android.R import chat.rocket.android.helper.MessageParser +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extensions.content import com.google.android.material.snackbar.BaseTransientBottomBar import kotlinx.android.synthetic.main.message_action_bar.view.* @@ -28,7 +29,7 @@ class ActionSnackbar private constructor( val actionSnackbar = ActionSnackbar(parentViewGroup, view, CallbackImpl(view)) with(view) { actionSnackbar.getView().setPadding(0) - actionSnackbar.getView().setBackgroundColor(ContextCompat.getColor(context, R.color.colorWhite)) + actionSnackbar.getView().setBackgroundColor(ThemeUtil.getThemeColor(android.R.attr.colorBackground)) actionSnackbar.parser = parser actionSnackbar.messageTextView = text_view_action_text actionSnackbar.titleTextView = text_view_action_title diff --git a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomActivity.kt b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomActivity.kt index 2af6fb6f95..8fa3e2eb5b 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomActivity.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomActivity.kt @@ -12,6 +12,7 @@ import chat.rocket.android.R import chat.rocket.android.chatroom.presentation.ChatRoomNavigator import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.infrastructure.ConnectionManagerFactory +import chat.rocket.android.thememanager.BaseActivity import chat.rocket.android.util.extensions.addFragment import chat.rocket.android.util.extensions.textContent import dagger.android.AndroidInjection @@ -53,7 +54,7 @@ private const val INTENT_CHAT_ROOM_LAST_SEEN = "chat_room_last_seen" private const val INTENT_CHAT_IS_SUBSCRIBED = "is_chat_room_subscribed" private const val INTENT_CHAT_ROOM_MESSAGE = "chat_room_message" -class ChatRoomActivity : AppCompatActivity(), HasSupportFragmentInjector { +class ChatRoomActivity : BaseActivity(), HasSupportFragmentInjector { @Inject lateinit var fragmentDispatchingAndroidInjector: DispatchingAndroidInjector // TODO - workaround for now... We will move to a single activity 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 72f123b008..82d5e0e160 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 @@ -23,6 +23,7 @@ import android.widget.ImageView import android.widget.TextView import androidx.annotation.DrawableRes import androidx.appcompat.app.AlertDialog +import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import androidx.core.text.bold import androidx.core.view.isVisible @@ -72,20 +73,12 @@ import chat.rocket.android.helper.AndroidPermissionsHelper.getCameraPermission import chat.rocket.android.helper.AndroidPermissionsHelper.getWriteExternalStoragePermission import chat.rocket.android.helper.AndroidPermissionsHelper.hasCameraPermission import chat.rocket.android.helper.AndroidPermissionsHelper.hasWriteExternalStoragePermission +import chat.rocket.android.main.ui.MainActivity +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extension.createImageFile import chat.rocket.android.util.extension.orFalse -import chat.rocket.android.util.extensions.circularRevealOrUnreveal -import chat.rocket.android.util.extensions.clearLightStatusBar -import chat.rocket.android.util.extensions.fadeIn -import chat.rocket.android.util.extensions.fadeOut -import chat.rocket.android.util.extensions.hideKeyboard -import chat.rocket.android.util.extensions.inflate -import chat.rocket.android.util.extensions.isNotNullNorEmpty -import chat.rocket.android.util.extensions.rotateBy -import chat.rocket.android.util.extensions.showToast -import chat.rocket.android.util.extensions.textContent -import chat.rocket.android.util.extensions.ui +import chat.rocket.android.util.extensions.* import chat.rocket.common.model.RoomType import chat.rocket.common.model.roomTypeOf import chat.rocket.core.internal.realtime.socket.model.State @@ -334,10 +327,24 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR } getDraftMessage() subscribeComposeTextMessage() - + tintMessageAttachmentOptionDrawables() analyticsManager.logScreenView(ScreenViewEvent.ChatRoom) } + private fun tintMessageAttachmentOptionDrawables() { + (activity as ChatRoomActivity).apply { + val cameraDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_camera_24dp, this) + val filesDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_files_24dp, this) + val drawingDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_gesture_black_24dp, this) + val drawables = arrayOf(cameraDrawable, filesDrawable, drawingDrawable) + DrawableHelper.wrapDrawables(drawables) + DrawableHelper.tintDrawables(drawables, this, ThemeUtil.getThemeColorResource(R.attr.colorAccent)) + DrawableHelper.compoundDrawables( + arrayOf(button_take_a_photo, button_attach_a_file, button_drawing), drawables + ) + } + } + override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) text_message.addTextChangedListener(EmojiKeyboardPopup.EmojiTextWatcher(text_message)) @@ -1172,9 +1179,10 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR private fun setupToolbar(toolbarTitle: String) { with(activity as ChatRoomActivity) { - this.clearLightStatusBar() + view?.let {this.clearInvisibleStatusBar(it)} this.setupToolbarTitle(toolbarTitle) toolbar.isVisible = true + toolbar.setBackgroundColor(ThemeUtil.getThemeColor(R.attr.colorPrimary)) } } diff --git a/app/src/main/java/chat/rocket/android/chatroom/ui/bottomsheet/MessageActionsBottomSheet.kt b/app/src/main/java/chat/rocket/android/chatroom/ui/bottomsheet/MessageActionsBottomSheet.kt index 4f51f1d6da..c8d1cf6ab1 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/ui/bottomsheet/MessageActionsBottomSheet.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/ui/bottomsheet/MessageActionsBottomSheet.kt @@ -1,5 +1,6 @@ package chat.rocket.android.chatroom.ui.bottomsheet +import android.graphics.drawable.Drawable import android.os.Bundle import android.view.LayoutInflater import android.view.MenuItem @@ -8,6 +9,7 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import chat.rocket.android.R +import chat.rocket.android.thememanager.util.ThemeUtil import com.google.android.material.bottomsheet.BottomSheetDialogFragment import kotlinx.android.synthetic.main.message_action_item.view.* import kotlinx.android.synthetic.main.message_bottomsheet.* @@ -15,8 +17,18 @@ import kotlinx.android.synthetic.main.message_bottomsheet.* class MessageActionsBottomSheet : BottomSheetDialogFragment() { private val adapter = MessageActionAdapter() + private val addReactionDrawable by lazy { + DrawableHelper.getDrawableFromId(R.drawable.ic_add_reaction, requireContext()) + } + private val pinDrawable by lazy { + DrawableHelper.getDrawableFromId(R.drawable.ic_action_message_pin_24dp, requireContext()) + } + private val infoDrawable by lazy { + DrawableHelper.getDrawableFromId(R.drawable.ic_action_message_info_outline_24dp, requireContext()) + } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + tintDrawable() return inflater.inflate(R.layout.message_bottomsheet, container, false) } @@ -73,4 +85,11 @@ class MessageActionsBottomSheet : BottomSheetDialogFragment() { } } } + + private fun tintDrawable() { + context?.let { + val drawables = arrayOf(addReactionDrawable, pinDrawable, infoDrawable) + DrawableHelper.tintDrawables(drawables, it, ThemeUtil.getThemeColorResource(R.attr.colorDescriptiveText)) + } + } } diff --git a/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomViewHolder.kt b/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomViewHolder.kt index 9a4da09a36..5a50717a16 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/adapter/RoomViewHolder.kt @@ -9,6 +9,7 @@ import androidx.core.view.isInvisible import androidx.core.view.isVisible import chat.rocket.android.R import chat.rocket.android.chatrooms.adapter.model.RoomUiModel +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.setTextViewAppearance import chat.rocket.common.model.RoomType import chat.rocket.common.model.UserStatus @@ -43,7 +44,9 @@ class RoomViewHolder(itemView: View, private val listener: (RoomUiModel) -> Unit } else if (room.status != null && room.type is RoomType.DirectMessage) { image_chat_icon.setImageDrawable(getStatusDrawable(room.status)) } else { - image_chat_icon.setImageDrawable(getRoomDrawable(room.type)) + val drawable = getRoomDrawable(room.type) + DrawableHelper.tintDrawable(drawable!!, context, ThemeUtil.getThemeColorResource(R.attr.colorDescriptiveText)) + image_chat_icon.setImageDrawable(drawable) } if (room.lastMessage != null) { diff --git a/app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt b/app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt index 315ef9a1a5..9d6d48dc54 100644 --- a/app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt +++ b/app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt @@ -31,6 +31,7 @@ import chat.rocket.android.chatrooms.viewmodel.LoadingState import chat.rocket.android.chatrooms.viewmodel.Query import chat.rocket.android.servers.ui.ServersBottomSheetFragment import chat.rocket.android.sortingandgrouping.ui.SortingAndGroupingBottomSheetFragment +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.onQueryTextListener import chat.rocket.android.util.extensions.fadeIn import chat.rocket.android.util.extensions.fadeOut @@ -111,6 +112,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { viewModel = ViewModelProviders.of(this, factory).get(ChatRoomsViewModel::class.java) subscribeUi() + tintSortByDrawable() deepLinkInfo?.let { processDeepLink(it) @@ -122,6 +124,15 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { analyticsManager.logScreenView(ScreenViewEvent.ChatRooms) } + private fun tintSortByDrawable() { + ui { + val sortByDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_group_by_type_20dp, it) + DrawableHelper.wrapDrawable(sortByDrawable) + DrawableHelper.tintDrawable(sortByDrawable, it, ThemeUtil.getThemeColorResource(R.attr.colorSubHeaderText)) + DrawableHelper.compoundEndDrawable(text_sort_by, sortByDrawable) + } + } + override fun setupToolbar(serverName: String) { with((activity as AppCompatActivity)) { with(toolbar) { diff --git a/app/src/main/java/chat/rocket/android/createchannel/ui/CreateChannelFragment.kt b/app/src/main/java/chat/rocket/android/createchannel/ui/CreateChannelFragment.kt index 966ddb6ef7..4ab093da1c 100644 --- a/app/src/main/java/chat/rocket/android/createchannel/ui/CreateChannelFragment.kt +++ b/app/src/main/java/chat/rocket/android/createchannel/ui/CreateChannelFragment.kt @@ -20,6 +20,7 @@ import chat.rocket.android.createchannel.presentation.CreateChannelPresenter import chat.rocket.android.createchannel.presentation.CreateChannelView import chat.rocket.android.members.adapter.MembersAdapter import chat.rocket.android.members.uimodel.MemberUiModel +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.showToast @@ -284,7 +285,8 @@ class CreateChannelFragment : Fragment(), CreateChannelView, ActionMode.Callback val chip = Chip(context) chip.text = chipText chip.isCloseIconVisible = true - chip.setChipBackgroundColorResource(R.color.icon_grey) + chip.setChipBackgroundColorResource(ThemeUtil.getThemeColorResource(R.attr.colorButtonDisabled)) + chip.setTextColor(ThemeUtil.getThemeColor(R.attr.colorPrimaryText)) setupChipOnCloseIconClickListener(chip) chip_group_member.addView(chip) } diff --git a/app/src/main/java/chat/rocket/android/dagger/module/ActivityBuilder.kt b/app/src/main/java/chat/rocket/android/dagger/module/ActivityBuilder.kt index d9c4919c3b..116eec852c 100644 --- a/app/src/main/java/chat/rocket/android/dagger/module/ActivityBuilder.kt +++ b/app/src/main/java/chat/rocket/android/dagger/module/ActivityBuilder.kt @@ -38,10 +38,15 @@ import chat.rocket.android.settings.di.SettingsFragmentProvider import chat.rocket.android.settings.password.di.PasswordFragmentProvider import chat.rocket.android.settings.password.ui.PasswordActivity import chat.rocket.android.sortingandgrouping.di.SortingAndGroupingBottomSheetFragmentProvider +import chat.rocket.android.thememanager.BaseActivity +import chat.rocket.android.thememanager.di.BaseActivityModule +import chat.rocket.android.thememanager.ui.ThemesActivity import chat.rocket.android.userdetails.di.UserDetailsFragmentProvider import chat.rocket.android.videoconference.di.VideoConferenceModule import chat.rocket.android.videoconference.ui.VideoConferenceActivity import chat.rocket.android.webview.adminpanel.di.AdminPanelWebViewFragmentProvider +import chat.rocket.android.webview.oauth.ui.OauthWebViewActivity +import chat.rocket.android.webview.ui.WebViewActivity import dagger.Module import dagger.android.ContributesAndroidInjector @@ -50,7 +55,8 @@ abstract class ActivityBuilder { @PerActivity @ContributesAndroidInjector( - modules = [AuthenticationModule::class, + modules = [BaseActivityModule::class, + AuthenticationModule::class, OnBoardingFragmentProvider::class, ServerFragmentProvider::class, LoginOptionsFragmentProvider::class, @@ -65,7 +71,8 @@ abstract class ActivityBuilder { @PerActivity @ContributesAndroidInjector( - modules = [MainModule::class, + modules = [BaseActivityModule::class, + MainModule::class, ChatRoomsFragmentProvider::class, ServersBottomSheetFragmentProvider::class, SortingAndGroupingBottomSheetFragmentProvider::class, @@ -80,7 +87,8 @@ abstract class ActivityBuilder { @PerActivity @ContributesAndroidInjector( - modules = [ChatRoomModule::class, + modules = [ BaseActivityModule::class, + ChatRoomModule::class, ChatRoomFragmentProvider::class, UserDetailsFragmentProvider::class, ChatDetailsFragmentProvider::class, @@ -95,22 +103,38 @@ abstract class ActivityBuilder { abstract fun bindChatRoomActivity(): ChatRoomActivity @PerActivity - @ContributesAndroidInjector(modules = [PasswordFragmentProvider::class]) + @ContributesAndroidInjector(modules = [(BaseActivityModule::class)]) + abstract fun bindBaseActivity(): BaseActivity + + @PerActivity + @ContributesAndroidInjector(modules = [(BaseActivityModule::class)]) + abstract fun bindThemesActivity(): ThemesActivity + + @PerActivity + @ContributesAndroidInjector(modules = [(BaseActivityModule::class)]) + abstract fun OauthWebViewActivity(): OauthWebViewActivity + + @PerActivity + @ContributesAndroidInjector(modules = [(BaseActivityModule::class)]) + abstract fun bindWebViewActivity(): WebViewActivity + + @PerActivity + @ContributesAndroidInjector(modules = [PasswordFragmentProvider::class, BaseActivityModule::class]) abstract fun bindPasswordActivity(): PasswordActivity @PerActivity - @ContributesAndroidInjector(modules = [ChangeServerModule::class]) + @ContributesAndroidInjector(modules = [ChangeServerModule::class, BaseActivityModule::class]) abstract fun bindChangeServerActivity(): ChangeServerActivity @PerActivity - @ContributesAndroidInjector(modules = [MessageInfoFragmentProvider::class]) + @ContributesAndroidInjector(modules = [MessageInfoFragmentProvider::class, BaseActivityModule::class]) abstract fun bindMessageInfoActiviy(): MessageInfoActivity @PerActivity - @ContributesAndroidInjector(modules = [DrawModule::class]) + @ContributesAndroidInjector(modules = [DrawModule::class, BaseActivityModule::class]) abstract fun bindDrawingActivity(): DrawingActivity @PerActivity - @ContributesAndroidInjector(modules = [VideoConferenceModule::class]) + @ContributesAndroidInjector(modules = [VideoConferenceModule::class, BaseActivityModule::class]) abstract fun bindVideoConferenceActivity(): VideoConferenceActivity } diff --git a/app/src/main/java/chat/rocket/android/dagger/module/AppModule.kt b/app/src/main/java/chat/rocket/android/dagger/module/AppModule.kt index d9e1b1afaf..0112d53399 100644 --- a/app/src/main/java/chat/rocket/android/dagger/module/AppModule.kt +++ b/app/src/main/java/chat/rocket/android/dagger/module/AppModule.kt @@ -60,6 +60,7 @@ import chat.rocket.android.server.infrastructure.SharedPrefsBasicAuthRepository import chat.rocket.android.server.infrastructure.SharedPrefsConnectingServerRepository import chat.rocket.android.server.infrastructure.SharedPrefsCurrentServerRepository import chat.rocket.android.server.infrastructure.SharedPrefsSortingAndGroupingRepository +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.AppJsonAdapterFactory import chat.rocket.android.util.BasicAuthenticatorInterceptor import chat.rocket.android.util.HttpLoggingInterceptor @@ -293,7 +294,7 @@ class AppModule { .theme( SpannableTheme.builder() .blockMargin(0) - .linkColor(res.getColor(R.color.colorAccent)) + .linkColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) .build() ) .build() diff --git a/app/src/main/java/chat/rocket/android/directory/ui/DirectoryFragment.kt b/app/src/main/java/chat/rocket/android/directory/ui/DirectoryFragment.kt index e7144808be..d163754b0e 100644 --- a/app/src/main/java/chat/rocket/android/directory/ui/DirectoryFragment.kt +++ b/app/src/main/java/chat/rocket/android/directory/ui/DirectoryFragment.kt @@ -23,6 +23,7 @@ import chat.rocket.android.directory.presentation.DirectoryPresenter import chat.rocket.android.directory.presentation.DirectoryView import chat.rocket.android.directory.uimodel.DirectoryUiModel import chat.rocket.android.helper.EndlessRecyclerViewScrollListener +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.onQueryTextListener import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.isNotNullNorBlank @@ -81,11 +82,25 @@ class DirectoryFragment : Fragment(), DirectoryView { super.onViewCreated(view, savedInstanceState) setupToolbar() setupRecyclerView() + tintSortByDrawables() setupListeners() presenter.loadAllDirectoryChannels() analyticsManager.logScreenView(ScreenViewEvent.Directory) } + private fun tintSortByDrawables() { + ui{ + val drawables = arrayOf(hashtagDrawable, userDrawable, arrowDownDrawable) + DrawableHelper.wrapDrawables(drawables) + DrawableHelper.tintDrawables(drawables, it, ThemeUtil.getThemeColorResource(R.attr.colorSubHeaderText)) + DrawableHelper.compoundStartAndEndDrawable( + text_sort_by, + hashtagDrawable, + arrowDownDrawable + ) + } + } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.directory, menu) diff --git a/app/src/main/java/chat/rocket/android/directory/ui/DirectorySortingBottomSheetFragment.kt b/app/src/main/java/chat/rocket/android/directory/ui/DirectorySortingBottomSheetFragment.kt index 4290ac18c4..6aea0d0bd0 100644 --- a/app/src/main/java/chat/rocket/android/directory/ui/DirectorySortingBottomSheetFragment.kt +++ b/app/src/main/java/chat/rocket/android/directory/ui/DirectorySortingBottomSheetFragment.kt @@ -1,14 +1,19 @@ package chat.rocket.android.directory.ui import DrawableHelper +import android.content.res.ColorStateList +import android.graphics.Color import android.graphics.drawable.Drawable import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager import chat.rocket.android.R +import chat.rocket.android.thememanager.util.ThemeUtil +import chat.rocket.android.util.extensions.ui import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment @@ -64,6 +69,8 @@ class DirectorySortingBottomSheetFragment : BottomSheetDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + tintTextViewStartDrawables() + tintCheckDrawable() setupView() setupListeners() } @@ -126,4 +133,18 @@ class DirectorySortingBottomSheetFragment : BottomSheetDialogFragment() { ) } } + + private fun tintTextViewStartDrawables(){ + ui{ + val drawables = arrayOf(hashtagDrawable, userDrawable) + DrawableHelper.wrapDrawables(drawables) + DrawableHelper.tintDrawables(drawables, it, ThemeUtil.getThemeColorResource(R.attr.colorBottomSheetFragmentText)) + } + } + + private fun tintCheckDrawable() { + context?.let { + DrawableHelper.tintDrawable(checkDrawable, it, ThemeUtil.getThemeColorResource(R.attr.colorAccent)) + } + } } \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/helper/MessageParser.kt b/app/src/main/java/chat/rocket/android/helper/MessageParser.kt index e91faac4f8..18b409e282 100644 --- a/app/src/main/java/chat/rocket/android/helper/MessageParser.kt +++ b/app/src/main/java/chat/rocket/android/helper/MessageParser.kt @@ -19,6 +19,7 @@ import chat.rocket.android.emoji.EmojiRepository import chat.rocket.android.emoji.EmojiTypefaceSpan import chat.rocket.android.server.domain.PublicSettings import chat.rocket.android.server.domain.useRealName +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extensions.openTabbedUrl import chat.rocket.common.model.SimpleUser import chat.rocket.core.model.Message @@ -142,10 +143,10 @@ class MessageParser @Inject constructor( private val currentUser: String? ) : AbstractVisitor() { - private val othersTextColor = ResourcesCompat.getColor(context.resources, R.color.colorAccent, context.theme) + private val othersTextColor = ThemeUtil.getThemeColor(R.attr.colorAccent) private val othersBackgroundColor = ResourcesCompat.getColor(context.resources, android.R.color.transparent, context.theme) - private val myselfTextColor = ResourcesCompat.getColor(context.resources, R.color.colorWhite, context.theme) - private val myselfBackgroundColor = ResourcesCompat.getColor(context.resources, R.color.colorAccent, context.theme) + private val myselfTextColor = ThemeUtil.getThemeColor(android.R.attr.colorBackground) + private val myselfBackgroundColor = ThemeUtil.getThemeColor(R.attr.colorAccent) private val padding = context.resources.getDimensionPixelSize(R.dimen.padding_mention).toFloat() private val radius = context.resources.getDimensionPixelSize(R.dimen.radius_mention).toFloat() diff --git a/app/src/main/java/chat/rocket/android/main/presentation/MainNavigator.kt b/app/src/main/java/chat/rocket/android/main/presentation/MainNavigator.kt index 983f55bd28..e750022a3f 100644 --- a/app/src/main/java/chat/rocket/android/main/presentation/MainNavigator.kt +++ b/app/src/main/java/chat/rocket/android/main/presentation/MainNavigator.kt @@ -13,11 +13,13 @@ import chat.rocket.android.profile.ui.TAG_IMAGE_DIALOG_FRAGMENT import chat.rocket.android.profile.ui.TAG_PROFILE_FRAGMENT import chat.rocket.android.server.ui.changeServerIntent import chat.rocket.android.settings.ui.TAG_SETTINGS_FRAGMENT +import chat.rocket.android.thememanager.ui.ThemesActivity import chat.rocket.android.util.extensions.addFragment 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) { fun toChatList(chatRoomId: String? = null, deepLinkInfo: DeepLinkInfo? = null) { @@ -50,6 +52,10 @@ class MainNavigator(internal val activity: MainActivity) { } } + fun toChangeTheme() { + activity.startActivity(Intent(activity, ThemesActivity::class.java)) + } + fun toProfileImage(avatarUrl: String) { activity.addFragmentBackStack(TAG_IMAGE_DIALOG_FRAGMENT, R.id.fragment_container) { chat.rocket.android.profile.ui.newInstance(avatarUrl) diff --git a/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt b/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt index 66390b8ed0..62351aac43 100644 --- a/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt +++ b/app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt @@ -18,6 +18,7 @@ import chat.rocket.android.core.behaviours.AppLanguageView import chat.rocket.android.main.presentation.MainPresenter import chat.rocket.android.push.refreshPushToken import chat.rocket.android.server.ui.INTENT_CHAT_ROOM_ID +import chat.rocket.android.thememanager.BaseActivity import dagger.android.AndroidInjection import dagger.android.AndroidInjector import dagger.android.DispatchingAndroidInjector @@ -26,7 +27,7 @@ import dagger.android.support.HasSupportFragmentInjector import java.util.* import javax.inject.Inject -class MainActivity : AppCompatActivity(), HasActivityInjector, +class MainActivity : BaseActivity(), HasActivityInjector, HasSupportFragmentInjector, AppLanguageView { @Inject lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector diff --git a/app/src/main/java/chat/rocket/android/members/ui/MembersFragment.kt b/app/src/main/java/chat/rocket/android/members/ui/MembersFragment.kt index 27a8e242d8..825226e0b6 100644 --- a/app/src/main/java/chat/rocket/android/members/ui/MembersFragment.kt +++ b/app/src/main/java/chat/rocket/android/members/ui/MembersFragment.kt @@ -18,10 +18,7 @@ import chat.rocket.android.members.adapter.MembersAdapter import chat.rocket.android.members.presentation.MembersPresenter import chat.rocket.android.members.presentation.MembersView import chat.rocket.android.members.uimodel.MemberUiModel -import chat.rocket.android.util.extensions.clearLightStatusBar -import chat.rocket.android.util.extensions.inflate -import chat.rocket.android.util.extensions.showToast -import chat.rocket.android.util.extensions.ui +import chat.rocket.android.util.extensions.* import dagger.android.support.AndroidSupportInjection import kotlinx.android.synthetic.main.app_bar_chat_room.* import kotlinx.android.synthetic.main.fragment_members.* @@ -136,7 +133,7 @@ class MembersFragment : Fragment(), MembersView { } else { setupToolbarTitle((getString(R.string.title_members))) } - this.clearLightStatusBar() + view?.let {this.clearInvisibleStatusBar(it)} toolbar.isVisible = true } } diff --git a/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt b/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt index 86525d8277..30dbf4d656 100644 --- a/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt +++ b/app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt @@ -5,7 +5,6 @@ import android.app.Activity import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap -import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.Menu @@ -28,6 +27,7 @@ import chat.rocket.android.helper.AndroidPermissionsHelper.hasCameraPermission import chat.rocket.android.main.ui.MainActivity import chat.rocket.android.profile.presentation.ProfilePresenter import chat.rocket.android.profile.presentation.ProfileView +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extension.dispatchImageSelection import chat.rocket.android.util.extension.dispatchTakePicture @@ -86,12 +86,11 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { super.onViewCreated(view, savedInstanceState) setupToolbar() - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { - tintEditTextDrawableStart() - } + tintEditTextDrawableStart() presenter.loadUserProfile() setupListeners() + tintAvatarOptionsDrawables() subscribeEditTexts() analyticsManager.logScreenView(ScreenViewEvent.Profile) @@ -276,7 +275,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { val drawables = arrayOf(personDrawable, atDrawable, emailDrawable) DrawableHelper.wrapDrawables(drawables) - DrawableHelper.tintDrawables(drawables, this, R.color.colorDrawableTintGrey) + DrawableHelper.tintDrawables(drawables, this, ThemeUtil.getThemeColorResource(R.attr.colorDrawableStrongTint)) DrawableHelper.compoundDrawables( arrayOf(text_name, text_username, text_email), drawables ) @@ -344,14 +343,16 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { } context?.let { - AlertDialog.Builder(it) + val dialog = AlertDialog.Builder(it) .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() + }.create() + dialog.show() + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) } } @@ -379,6 +380,21 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { } } + private fun tintAvatarOptionsDrawables() { + (activity as MainActivity).apply { + val accountDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_account_circle_black_24dp, this) + val imageDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_image_black_24dp, this) + val cameraDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_photo_camera_black_24dp, this) + val closeDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_close_black_24dp, this) + val drawables = arrayOf(accountDrawable, imageDrawable, cameraDrawable, closeDrawable) + DrawableHelper.wrapDrawables(drawables) + DrawableHelper.tintDrawables(drawables, this, ThemeUtil.getThemeColorResource(R.attr.colorPrimaryText)) + DrawableHelper.compoundDrawables( + arrayOf(button_view_profile_photo, button_open_gallery, button_take_a_photo, button_reset_avatar), drawables + ) + } + } + private fun showChangesNotSavedDialog() { context?.let { val builder = AlertDialog.Builder(it) @@ -394,7 +410,6 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { .create() .show() } - } private fun updateProfile() { diff --git a/app/src/main/java/chat/rocket/android/push/PushManager.kt b/app/src/main/java/chat/rocket/android/push/PushManager.kt index efd3b84e6c..7027b3db37 100644 --- a/app/src/main/java/chat/rocket/android/push/PushManager.kt +++ b/app/src/main/java/chat/rocket/android/push/PushManager.kt @@ -26,6 +26,7 @@ import chat.rocket.android.server.domain.GetAccountInteractor import chat.rocket.android.server.domain.GetSettingsInteractor import chat.rocket.android.server.domain.siteName import chat.rocket.android.server.ui.changeServerIntent +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.common.model.RoomType import chat.rocket.common.model.roomTypeOf import com.squareup.moshi.Json @@ -367,7 +368,7 @@ class PushManager @Inject constructor( with(this) { setAutoCancel(true) setShowWhen(true) - color = ContextCompat.getColor(context, R.color.colorPrimary) + color = ThemeUtil.getThemeColor(R.attr.colorPrimary) setDefaults(Notification.DEFAULT_ALL) setSmallIcon(smallIcon) setSound(alarmSound) diff --git a/app/src/main/java/chat/rocket/android/server/ui/ChangeServerActivity.kt b/app/src/main/java/chat/rocket/android/server/ui/ChangeServerActivity.kt index df6b72b5fd..eec927f5fc 100644 --- a/app/src/main/java/chat/rocket/android/server/ui/ChangeServerActivity.kt +++ b/app/src/main/java/chat/rocket/android/server/ui/ChangeServerActivity.kt @@ -7,6 +7,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import chat.rocket.android.server.presentation.ChangeServerPresenter import chat.rocket.android.server.presentation.ChangeServerView +import chat.rocket.android.thememanager.BaseActivity import chat.rocket.android.util.extensions.showToast import dagger.android.AndroidInjection import javax.inject.Inject @@ -24,7 +25,7 @@ fun Context.changeServerIntent(serverUrl: String? = null, chatRoomId: String? = } } -class ChangeServerActivity : AppCompatActivity(), ChangeServerView { +class ChangeServerActivity : BaseActivity(), ChangeServerView { @Inject lateinit var presenter: ChangeServerPresenter var progress: ProgressDialog? = null diff --git a/app/src/main/java/chat/rocket/android/servers/adapter/ServerViewHolder.kt b/app/src/main/java/chat/rocket/android/servers/adapter/ServerViewHolder.kt index c4f6c8a98c..067a49c0f5 100644 --- a/app/src/main/java/chat/rocket/android/servers/adapter/ServerViewHolder.kt +++ b/app/src/main/java/chat/rocket/android/servers/adapter/ServerViewHolder.kt @@ -3,7 +3,9 @@ package chat.rocket.android.servers.adapter import android.view.View import androidx.core.view.isInvisible import androidx.recyclerview.widget.RecyclerView +import chat.rocket.android.R import chat.rocket.android.server.domain.model.Account +import chat.rocket.android.thememanager.util.ThemeUtil import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.item_server.view.* @@ -15,6 +17,9 @@ class ServerViewHolder(itemView: View, private val currentServerUrl: String) : Glide.with(context).load(account.serverLogoUrl).into(image_server) text_server_name.text = account.serverName ?: account.serverUrl text_server_url.text = account.serverUrl + val checkDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_check, context) + DrawableHelper.tintDrawable(checkDrawable, context, ThemeUtil.getThemeColorResource(R.attr.colorAccent)) + image_check.setImageDrawable(checkDrawable) image_check.isInvisible = currentServerUrl != account.serverUrl } } diff --git a/app/src/main/java/chat/rocket/android/settings/password/ui/PasswordActivity.kt b/app/src/main/java/chat/rocket/android/settings/password/ui/PasswordActivity.kt index 169eba224a..d2d4f4313f 100644 --- a/app/src/main/java/chat/rocket/android/settings/password/ui/PasswordActivity.kt +++ b/app/src/main/java/chat/rocket/android/settings/password/ui/PasswordActivity.kt @@ -2,8 +2,8 @@ package chat.rocket.android.settings.password.ui import android.os.Bundle import androidx.fragment.app.Fragment -import androidx.appcompat.app.AppCompatActivity import chat.rocket.android.R +import chat.rocket.android.thememanager.BaseActivity import chat.rocket.android.util.extensions.addFragment import chat.rocket.android.util.extensions.textContent import dagger.android.AndroidInjection @@ -13,7 +13,7 @@ import dagger.android.support.HasSupportFragmentInjector import kotlinx.android.synthetic.main.app_bar_password.* import javax.inject.Inject -class PasswordActivity : AppCompatActivity(), HasSupportFragmentInjector { +class PasswordActivity : BaseActivity(), HasSupportFragmentInjector { @Inject lateinit var fragmentDispatchingAndroidInjector: DispatchingAndroidInjector override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/chat/rocket/android/settings/presentation/SettingsPresenter.kt b/app/src/main/java/chat/rocket/android/settings/presentation/SettingsPresenter.kt index fe1fa344ff..e367418167 100644 --- a/app/src/main/java/chat/rocket/android/settings/presentation/SettingsPresenter.kt +++ b/app/src/main/java/chat/rocket/android/settings/presentation/SettingsPresenter.kt @@ -144,6 +144,8 @@ class SettingsPresenter @Inject constructor( fun toProfile() = navigator.toProfile() + fun toChangeTheme() = navigator.toChangeTheme() + fun toAdmin() = currentServer?.let { currentServer -> tokenRepository.get(currentServer)?.let { navigator.toAdminPanel(currentServer.adminPanelUrl(), it.authToken) diff --git a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt index d3d3d20718..da6ff7466f 100644 --- a/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt +++ b/app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt @@ -23,8 +23,10 @@ import chat.rocket.android.core.behaviours.AppLanguageView import chat.rocket.android.helper.TextHelper.getDeviceAndAppInformation import chat.rocket.android.settings.presentation.SettingsPresenter import chat.rocket.android.settings.presentation.SettingsView +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.showToast +import chat.rocket.android.util.extensions.ui import chat.rocket.android.util.invalidateFirebaseToken import dagger.android.support.AndroidSupportInjection import kotlinx.android.synthetic.main.app_bar.* @@ -32,6 +34,10 @@ import kotlinx.android.synthetic.main.dialog_delete_account.* import kotlinx.android.synthetic.main.fragment_settings.* import timber.log.Timber import javax.inject.Inject +import android.widget.ArrayAdapter + + + internal const val TAG_SETTINGS_FRAGMENT = "SettingsFragment" @@ -142,6 +148,8 @@ class SettingsFragment : Fragment(), SettingsView, AppLanguageView { text_contact_us.setOnClickListener { contactSupport() } + text_change_theme.setOnClickListener { presenter.toChangeTheme() } + text_language.setOnClickListener { changeLanguage() } text_review_this_app.setOnClickListener { showAppOnStore() } @@ -208,10 +216,12 @@ class SettingsFragment : Fragment(), SettingsView, AppLanguageView { } } } + val adapter = ArrayAdapter( + activity, R.layout.item_alert_dialog_single_choice, resources.getStringArray(R.array.languages)) AlertDialog.Builder(it) .setTitle(R.string.title_choose_language) .setSingleChoiceItems( - resources.getStringArray(R.array.languages), localeIndex + adapter, localeIndex ) { dialog, option -> val array = locales[option].split(",") if (array.size > 1) { @@ -242,12 +252,14 @@ class SettingsFragment : Fragment(), SettingsView, AppLanguageView { private fun showLogoutDialog() { context?.let { - val builder = AlertDialog.Builder(it) - builder.setTitle(R.string.title_are_you_sure) + val dialog = AlertDialog.Builder(it) + .setTitle(R.string.title_are_you_sure) .setPositiveButton(R.string.action_logout) { _, _ -> presenter.logout() } .setNegativeButton(android.R.string.no) { dialog, _ -> dialog.cancel() } .create() - .show() + dialog.show() + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) } } @@ -256,13 +268,19 @@ class SettingsFragment : Fragment(), SettingsView, AppLanguageView { val dialogLayout = layoutInflater.inflate(R.layout.dialog_delete_account, null) val editText = dialogLayout.findViewById(R.id.text_password) - AlertDialog.Builder(it) + val dialog = AlertDialog.Builder(it) .setView(dialogLayout) .setPositiveButton(R.string.msg_delete_account) { _, _ -> presenter.deleteAccount(editText.text.toString()) }.setNegativeButton(android.R.string.no) { dialog, _ -> dialog.cancel() } .create() - .show() + dialog.show() + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) + val keyDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_key_black_20dp, it) + DrawableHelper.wrapDrawable(keyDrawable) + DrawableHelper.tintDrawable(keyDrawable, it, ThemeUtil.getThemeColorResource(R.attr.colorDrawableStrongTint)) + DrawableHelper.compoundStartDrawable(dialog.text_password, keyDrawable) } } } \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/sortingandgrouping/ui/SortingAndGroupingBottomSheetFragment.kt b/app/src/main/java/chat/rocket/android/sortingandgrouping/ui/SortingAndGroupingBottomSheetFragment.kt index ca62af7f67..bad2d64436 100644 --- a/app/src/main/java/chat/rocket/android/sortingandgrouping/ui/SortingAndGroupingBottomSheetFragment.kt +++ b/app/src/main/java/chat/rocket/android/sortingandgrouping/ui/SortingAndGroupingBottomSheetFragment.kt @@ -2,6 +2,7 @@ package chat.rocket.android.sortingandgrouping.ui import DrawableHelper import android.content.DialogInterface +import android.graphics.drawable.Drawable import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -13,6 +14,8 @@ 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 chat.rocket.android.thememanager.util.ThemeUtil +import chat.rocket.android.util.extensions.ui import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment @@ -32,11 +35,24 @@ class SortingAndGroupingBottomSheetFragment : BottomSheetDialogFragment(), Sorti 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 } + private val filterDrawable by lazy { + DrawableHelper.getDrawableFromId(R.drawable.ic_filter_20dp, requireContext()) + } + private val activityDrawable by lazy { + DrawableHelper.getDrawableFromId(R.drawable.ic_activity_20dp, requireContext()) + } + private val unreadOnTopDrawable by lazy { + DrawableHelper.getDrawableFromId(R.drawable.ic_unread_20dp, requireContext()) + } + private val groupByTypeDrawable by lazy { + DrawableHelper.getDrawableFromId(R.drawable.ic_group_by_type_20dp, requireContext()) + } + private val groupByFavoritesDrawable by lazy { + DrawableHelper.getDrawableFromId(R.drawable.ic_favorites_20dp, requireContext()) + } + private val checkDrawable by lazy { + DrawableHelper.getDrawableFromId(R.drawable.ic_check, requireContext()) + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -53,6 +69,8 @@ class SortingAndGroupingBottomSheetFragment : BottomSheetDialogFragment(), Sorti override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) presenter.getSortingAndGroupingPreferences() + tintTextViewStartDrawables() + tintCheckDrawable() setupListeners() } @@ -154,21 +172,21 @@ class SortingAndGroupingBottomSheetFragment : BottomSheetDialogFragment(), Sorti text_sort_by.text = getString(R.string.msg_sort_by_placeholder, text.toLowerCase()) } - private fun checkSelection(textView: TextView, @DrawableRes startDrawable: Int) { + private fun checkSelection(textView: TextView, startDrawable: Drawable) { context?.let { DrawableHelper.compoundStartAndEndDrawable( textView, - DrawableHelper.getDrawableFromId(startDrawable, it), - DrawableHelper.getDrawableFromId(R.drawable.ic_check, it) + startDrawable, + checkDrawable ) } } - private fun uncheckSelection(textView: TextView, @DrawableRes startDrawable: Int) { + private fun uncheckSelection(textView: TextView, startDrawable: Drawable) { context?.let { DrawableHelper.compoundStartDrawable( textView, - DrawableHelper.getDrawableFromId(startDrawable, it) + startDrawable ) } } @@ -181,4 +199,18 @@ class SortingAndGroupingBottomSheetFragment : BottomSheetDialogFragment(), Sorti isGroupByFavorites ) } + + private fun tintTextViewStartDrawables(){ + ui{ + val drawables = arrayOf(filterDrawable, activityDrawable, unreadOnTopDrawable, groupByTypeDrawable, groupByFavoritesDrawable) + DrawableHelper.wrapDrawables(drawables) + DrawableHelper.tintDrawables(drawables, it, ThemeUtil.getThemeColorResource(R.attr.colorBottomSheetFragmentText)) + } + } + + private fun tintCheckDrawable() { + context?.let { + DrawableHelper.tintDrawable(checkDrawable, it, ThemeUtil.getThemeColorResource(R.attr.colorAccent)) + } + } } \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/thememanager/BaseActivity.kt b/app/src/main/java/chat/rocket/android/thememanager/BaseActivity.kt new file mode 100644 index 0000000000..94adc67df4 --- /dev/null +++ b/app/src/main/java/chat/rocket/android/thememanager/BaseActivity.kt @@ -0,0 +1,59 @@ +package chat.rocket.android.thememanager + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModelProviders +import chat.rocket.android.R +import chat.rocket.android.thememanager.util.ThemeUtil +import chat.rocket.android.thememanager.viewmodel.ThemesViewModel +import chat.rocket.android.thememanager.viewmodel.ThemesViewModelFactory +import dagger.android.AndroidInjection +import javax.inject.Inject + +open class BaseActivity : AppCompatActivity() { + @Inject + lateinit var factory: ThemesViewModelFactory + lateinit var viewModel: ThemesViewModel + private var currentTheme: String = "AppTheme" + private var currentAccentStyle = 0 + private var currentToolbarStyle = 0 + private var currentBackgroundStyle = 0 + + override fun onCreate(savedInstanceState: Bundle?) { + AndroidInjection.inject(this) + viewModel = ViewModelProviders.of(this, factory).get(ThemesViewModel::class.java) + currentTheme = viewModel.getCurrentTheme().name + currentAccentStyle = viewModel.getCurrentTheme().getCustomAccentStyle(resources, this.packageName) + currentToolbarStyle = viewModel.getCurrentTheme().getCustomToolbarStyle(resources, this.packageName) + currentBackgroundStyle = viewModel.getCurrentTheme().getCustomBackgroundStyle(resources, this.packageName) + applyTheme(currentTheme, currentAccentStyle, currentToolbarStyle, currentBackgroundStyle) + super.onCreate(savedInstanceState) + } + + override fun onResume() { + super.onResume() + val selectedTheme = viewModel.getCurrentTheme().name + val selectedAccentStyle = viewModel.getCurrentTheme().getCustomAccentStyle(resources, this.packageName) + val selectedToolbarStyle = viewModel.getCurrentTheme().getCustomToolbarStyle(resources, this.packageName) + val selectedBackgroundStyle = viewModel.getCurrentTheme().getCustomBackgroundStyle(resources, this.packageName) + if ((currentTheme != selectedTheme) + or (currentAccentStyle != selectedAccentStyle) + or (currentToolbarStyle != selectedToolbarStyle) + or (currentBackgroundStyle != selectedBackgroundStyle)) + recreate() + } + + private fun applyTheme(currentTheme: String, currentAccentStyle: Int, currentToolbarStyle: Int, currentBackgroundStyle: Int) { + setTheme(resources.getIdentifier(currentTheme, "style", this.packageName)) + ThemeUtil.setTheme(theme, viewModel.getCurrentTheme()) + if (currentBackgroundStyle != 0) { + setTheme(currentBackgroundStyle) + } + if (currentAccentStyle != 0) { + theme.applyStyle(currentAccentStyle, true) + } + if (currentToolbarStyle != 0) { + theme.applyStyle(currentToolbarStyle, true) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/thememanager/adapter/CustomThemesAdapter.kt b/app/src/main/java/chat/rocket/android/thememanager/adapter/CustomThemesAdapter.kt new file mode 100644 index 0000000000..8525de2a86 --- /dev/null +++ b/app/src/main/java/chat/rocket/android/thememanager/adapter/CustomThemesAdapter.kt @@ -0,0 +1,55 @@ +package chat.rocket.android.thememanager.adapter + +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import chat.rocket.android.R +import chat.rocket.android.thememanager.model.Theme +import chat.rocket.android.util.extensions.inflate +import kotlinx.android.synthetic.main.item_theme_row.view.* + +class CustomThemesAdapter(private val customThemes: List, + private val listener: (Int, String) -> Unit, + private val colorListener: (Int, String, Boolean) -> Unit) : RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = + ViewHolder(parent.inflate(R.layout.item_custom_theme_row)) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val customTheme = customThemes[position] + holder.bind(customTheme) + holder.itemView.text_theme_name.setOnClickListener { + listener.invoke(position, customTheme.name) + } + holder.itemView.item_theme_preview_color_accent.setOnClickListener { + colorListener.invoke(position, "Custom Accent", customTheme.isDark) + } + holder.itemView.item_theme_preview_color_primary.setOnClickListener { + colorListener.invoke(position, "Custom Toolbar", customTheme.isDark) + } + holder.itemView.item_theme_preview_color_background.setOnClickListener { + colorListener.invoke(position, "Custom Background", customTheme.isDark) + } + } + + override fun getItemCount(): Int = customThemes.size + + class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + fun bind(theme: Theme) { + theme.setPreviewColors(itemView.context) + itemView.text_theme_name.text = theme.customName + + val drawableBackground = DrawableHelper.getDrawableFromId(R.drawable.theme_preview, itemView.context).mutate() + val drawableAccent = DrawableHelper.getDrawableFromId(R.drawable.theme_preview, itemView.context).mutate() + val drawablePrimary = DrawableHelper.getDrawableFromId(R.drawable.theme_preview, itemView.context).mutate() + + DrawableHelper.tintDrawable(drawableBackground, itemView.context, theme.colorPreviewBackground) + DrawableHelper.tintDrawable(drawableAccent, itemView.context, theme.colorPreviewAccent) + DrawableHelper.tintDrawable(drawablePrimary, itemView.context, theme.colorPreviewPrimary) + + itemView.item_theme_preview_color_background.setImageDrawable(drawableBackground) + itemView.item_theme_preview_color_accent.setImageDrawable(drawableAccent) + itemView.item_theme_preview_color_primary.setImageDrawable(drawablePrimary) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/thememanager/adapter/ThemesAdapter.kt b/app/src/main/java/chat/rocket/android/thememanager/adapter/ThemesAdapter.kt new file mode 100644 index 0000000000..761150259b --- /dev/null +++ b/app/src/main/java/chat/rocket/android/thememanager/adapter/ThemesAdapter.kt @@ -0,0 +1,50 @@ +package chat.rocket.android.thememanager.adapter + +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import chat.rocket.android.R +import chat.rocket.android.thememanager.model.Theme +import chat.rocket.android.util.extensions.inflate +import kotlinx.android.synthetic.main.item_theme_row.view.* + +class ThemesAdapter(private val themes: List, private val listener: (Theme) -> Unit) : RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = + ViewHolder(parent.inflate(R.layout.item_theme_row)) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val theme = themes[position] + holder.bind(theme) + holder.itemView.setOnClickListener { + listener.invoke(theme) + } + } + + override fun getItemCount(): Int = themes.size + + class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + fun bind(theme: Theme) { + theme.setPreviewColors(itemView.context) + itemView.text_theme_name.text = theme.toString() + + val drawablePrimaryText = DrawableHelper.getDrawableFromId(R.drawable.theme_preview, itemView.context).mutate() + val drawableBackground = DrawableHelper.getDrawableFromId(R.drawable.theme_preview, itemView.context).mutate() + val drawableAccent = DrawableHelper.getDrawableFromId(R.drawable.theme_preview, itemView.context).mutate() + val drawablePrimary = DrawableHelper.getDrawableFromId(R.drawable.theme_preview, itemView.context).mutate() + val drawableDescriptiveText = DrawableHelper.getDrawableFromId(R.drawable.theme_preview, itemView.context).mutate() + + DrawableHelper.tintDrawable(drawableBackground, itemView.context, theme.colorPreviewBackground) + DrawableHelper.tintDrawable(drawablePrimaryText, itemView.context, theme.colorPreviewPrimaryText) + DrawableHelper.tintDrawable(drawableAccent, itemView.context, theme.colorPreviewAccent) + DrawableHelper.tintDrawable(drawablePrimary, itemView.context, theme.colorPreviewPrimary) + DrawableHelper.tintDrawable(drawableDescriptiveText, itemView.context, theme.colorPreviewDescriptiveText) + + itemView.item_theme_preview_primary_text.setImageDrawable(drawablePrimaryText) + itemView.item_theme_preview_color_background.setImageDrawable(drawableBackground) + itemView.item_theme_preview_color_accent.setImageDrawable(drawableAccent) + itemView.item_theme_preview_color_primary.setImageDrawable(drawablePrimary) + itemView.item_theme_preview_color_descriptive_text.setImageDrawable(drawableDescriptiveText) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/thememanager/di/BaseActivityModule.kt b/app/src/main/java/chat/rocket/android/thememanager/di/BaseActivityModule.kt new file mode 100644 index 0000000000..46ad8198ea --- /dev/null +++ b/app/src/main/java/chat/rocket/android/thememanager/di/BaseActivityModule.kt @@ -0,0 +1,12 @@ +package chat.rocket.android.thememanager.di + +import chat.rocket.android.thememanager.BaseActivity +import dagger.Module +import dagger.Provides + +@Module +class BaseActivityModule { + + @Provides + fun provideBaseActivity() = BaseActivity() +} \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/thememanager/infrastructure/ThemesRepository.kt b/app/src/main/java/chat/rocket/android/thememanager/infrastructure/ThemesRepository.kt new file mode 100644 index 0000000000..4c74ca825c --- /dev/null +++ b/app/src/main/java/chat/rocket/android/thememanager/infrastructure/ThemesRepository.kt @@ -0,0 +1,226 @@ +package chat.rocket.android.thememanager.infrastructure + +import android.content.SharedPreferences +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import chat.rocket.android.R +import chat.rocket.android.thememanager.model.Theme +import com.google.gson.Gson +import javax.inject.Inject +import java.text.SimpleDateFormat +import java.util.* +import kotlin.collections.ArrayList + +const val SELECTED_THEME = "selected_theme" +const val LAST_CHANGED = "last_changed" +const val IS_CUSTOM = "is_custom" +const val CUSTOM_THEMES = "custom_themes" + +class ThemesRepository @Inject constructor(private val preferences: SharedPreferences) { + + private val themeList = mutableListOf() + private val themes = MutableLiveData>() + + private val customThemeList = mutableListOf() + private val customThemes = MutableLiveData>() + private val customThemeNamesArray = arrayListOf() + + private var storedList = mutableListOf>() + private val themeNamesArray = arrayListOf() + private val baseThemeNamesArray = arrayListOf() + + private val simpleDateFormat = SimpleDateFormat("MMM dd, yyyy", Locale.getDefault()) + private lateinit var currentDate: Date + + init { + val theme1 = Theme("AppTheme", R.array.AppThemePreview, false) + val theme2 = Theme("DarkTheme", R.array.DarkThemePreview, true) + val theme3 = Theme("BlackTheme", R.array.BlackThemePreview, true) + themeList.add(theme1) + themeList.add(theme2) + themeList.add(theme3) + baseThemeNamesArray.add(theme1.name) + baseThemeNamesArray.add(theme2.name) + baseThemeNamesArray.add(theme3.name) + val iterator = themeList.listIterator() + for (theme in iterator) { + themeNamesArray.add(theme.name) + } + themes.value = themeList + } + + fun getThemes() = themes as LiveData> + + fun saveTheme(theme: String) { + setIsCustom(false) + with(preferences) { + edit().putString(SELECTED_THEME, theme).apply() + saveDate() + } + } + + fun getCurrentTheme(): Theme { + val theme: Theme + if (getIsCustom()) { + val storedCustomTheme = Gson().fromJson(preferences.getString(SELECTED_THEME, ""), mutableMapOf()::class.java) + val baseThemeIndex = (storedCustomTheme["BaseThemeIndex"] as Double).toInt() + val customTheme = themeList[baseThemeIndex].copy() + val customAccent: Int = (storedCustomTheme["CustomColorAccent"] as Double).toInt() + val customToolbar: Int = (storedCustomTheme["CustomColorToolbar"] as Double).toInt() + val customBackground: Int = (storedCustomTheme["CustomColorBackground"] as Double).toInt() + customTheme.customName = storedCustomTheme["ThemeName"] as String + customTheme.customAccent = customAccent + customTheme.customToolbar = customToolbar + customTheme.customBackground = customBackground + theme = customTheme + } else { + val storedTheme = preferences.getString(SELECTED_THEME, "AppTheme") + val themeIndex = themeNamesArray.indexOf(storedTheme) + theme = themeList[themeIndex] + } + return theme + } + + fun getCurrentThemeName(): String { + val name: String + if (getIsCustom()) { + name = getCurrentTheme().customName + } else { + name = getCurrentTheme().name + } + return name + } + + fun setIsCustom(boolean: Boolean) { + preferences.edit().putBoolean(IS_CUSTOM, boolean).apply() + } + + fun getIsCustom(): Boolean { + return preferences.getBoolean(IS_CUSTOM, false) + } + + fun saveCustomTheme(themeIndex: Int, baseThemeName: String) { + val baseThemeIndex = themeNamesArray.indexOf(baseThemeName) + setIsCustom(true) + val mapCustom = mapOf( + "BaseTheme" to customThemeList[themeIndex].name, + "BaseThemeIndex" to baseThemeIndex, + "ThemeName" to customThemeList[themeIndex].customName, + "CustomColorAccent" to customThemeList[themeIndex].customAccent, + "CustomColorToolbar" to customThemeList[themeIndex].customToolbar, + "CustomColorBackground" to customThemeList[themeIndex].customBackground) + preferences.edit().putString(SELECTED_THEME, Gson().toJson(mapCustom)).apply() + } + + fun addCustomTheme(baseThemeIndex: Int, customName: String): Boolean { + if (customName in customThemeNamesArray) { + return true + } else { + val customTheme = themeList[baseThemeIndex] + val mapCustom = mapOf( + "BaseTheme" to customTheme.name, + "BaseThemeIndex" to baseThemeIndex, + "ThemeName" to customName, + "CustomColorAccent" to 0, + "CustomColorToolbar" to 0, + "CustomColorBackground" to 0) + storedList.add(mapCustom) + preferences.edit().putString(CUSTOM_THEMES, Gson().toJson(storedList)).apply() + getCustomThemes() + } + return false + } + + fun editCustomTheme(colorType: String, themeIndex: Int, color: Int): Boolean { + var isCurrent = false + val baseTheme = customThemeList[themeIndex].name + var mapCustom = mapOf() + when (colorType) { + "Custom Accent" -> mapCustom = mapOf( + "BaseTheme" to baseTheme, + "BaseThemeIndex" to themeNamesArray.indexOf(baseTheme), + "ThemeName" to customThemeList[themeIndex].customName, + "CustomColorAccent" to color, + "CustomColorToolbar" to customThemeList[themeIndex].customToolbar, + "CustomColorBackground" to customThemeList[themeIndex].customBackground) + "Custom Toolbar" -> mapCustom = mapOf( + "BaseTheme" to baseTheme, + "BaseThemeIndex" to themeNamesArray.indexOf(baseTheme), + "ThemeName" to customThemeList[themeIndex].customName, + "CustomColorAccent" to customThemeList[themeIndex].customAccent, + "CustomColorToolbar" to color, + "CustomColorBackground" to customThemeList[themeIndex].customBackground) + "Custom Background" -> mapCustom = mapOf( + "BaseTheme" to baseTheme, + "BaseThemeIndex" to themeNamesArray.indexOf(baseTheme), + "ThemeName" to customThemeList[themeIndex].customName, + "CustomColorAccent" to customThemeList[themeIndex].customAccent, + "CustomColorToolbar" to customThemeList[themeIndex].customToolbar, + "CustomColorBackground" to color) + } + storedList[themeIndex] = mapCustom + preferences.edit().putString(CUSTOM_THEMES, Gson().toJson(storedList)).apply() + if (getCurrentThemeName() == customThemeList[themeIndex].customName) { + saveCustomTheme(themeIndex, customThemeList[themeIndex].name) + isCurrent = true + } + getCustomThemes() + return isCurrent + } + + fun getCustomThemes(): LiveData> { + if (preferences.contains(CUSTOM_THEMES)) { + storedList = Gson().fromJson(preferences.getString(CUSTOM_THEMES, ""), mutableListOf>()::class.java) + customThemeList.clear() + customThemeNamesArray.clear() + for (i in 0 until storedList.size) { + val baseThemeIndex = storedList[i]["BaseThemeIndex"] as Double + val customTheme = themeList[baseThemeIndex.toInt()].copy() + val customAccent: Int = (storedList[i]["CustomColorAccent"] as Double).toInt() + val customToolbar: Int = (storedList[i]["CustomColorToolbar"] as Double).toInt() + val customBackground: Int = (storedList[i]["CustomColorBackground"] as Double).toInt() + customTheme.customName = storedList[i]["ThemeName"] as String + customTheme.customAccent = customAccent + customTheme.customToolbar = customToolbar + customTheme.customBackground = customBackground + + customThemeNamesArray.add(customTheme.customName) + customThemeList.add(customTheme) + } + customThemes.value = customThemeList + } + return customThemes + } + + fun removeCustomTheme(position: Int): Boolean { + val customThemeName = customThemeList[position].customName + storedList.removeAt(position) + preferences.edit().putString(CUSTOM_THEMES, Gson().toJson(storedList)).apply() + getCustomThemes() + if (customThemeName == getCurrentThemeName()) { + saveTheme("AppTheme") + setIsCustom(false) + return true + } + return false + } + + fun saveDate() { + with(preferences) { + val currentTimeMillis = System.currentTimeMillis() + edit().putLong(LAST_CHANGED, currentTimeMillis).apply() + } + } + + fun getSavedDate(): String { + if (preferences.contains(LAST_CHANGED)) { + currentDate = Date(preferences.getLong(LAST_CHANGED, 0)) + return simpleDateFormat.format(currentDate) + } + return "" + } + + fun getBaseThemeNames(): ArrayList { + return baseThemeNamesArray + } +} diff --git a/app/src/main/java/chat/rocket/android/thememanager/model/Theme.kt b/app/src/main/java/chat/rocket/android/thememanager/model/Theme.kt new file mode 100644 index 0000000000..c711fc0c16 --- /dev/null +++ b/app/src/main/java/chat/rocket/android/thememanager/model/Theme.kt @@ -0,0 +1,72 @@ +package chat.rocket.android.thememanager.model + +import android.content.Context +import android.content.res.Resources +import androidx.annotation.StyleableRes +import chat.rocket.android.R + +data class Theme(val name: String, val colorArray: Int, val isDark: Boolean) { + var customAccent = 0 + var customToolbar = 0 + var customBackground = 0 + var customName = "" + var custom = false + var colorPreviewBackground = 0 + var colorPreviewPrimary = 0 + var colorPreviewAccent = 0 + var colorPreviewDescriptiveText = 0 + var colorPreviewPrimaryText = 0 + @StyleableRes + var index = 0 + + override fun toString(): String { + return name + } + + fun setPreviewColors(context: Context) { + val typedArray = context.resources.obtainTypedArray(colorArray) + index = 0 + colorPreviewAccent = typedArray.getResourceId(index++, 0) + if (customAccent != 0) { + colorPreviewAccent = customAccent + } + colorPreviewPrimaryText = typedArray.getResourceId(index++, 0) + colorPreviewPrimary = typedArray.getResourceId(index++, 0) + if (customToolbar != 0) { + colorPreviewPrimary = customToolbar + } + colorPreviewDescriptiveText = typedArray.getResourceId(index++, 0) + colorPreviewBackground = typedArray.getResourceId(index++, 0) + if (customBackground != 0) { + colorPreviewBackground = customBackground + } + typedArray.recycle() + } + + fun getCustomAccentStyle(resources: Resources, packageName: String): Int { + var style = 0 + if (customAccent != 0) { + val color = resources.getResourceEntryName(customAccent) + style = resources.getIdentifier(color + "ColorAccent", "style", packageName) + } + return style + } + + fun getCustomToolbarStyle(resources: Resources, packageName: String): Int { + var style = 0 + if (customToolbar != 0) { + val color = resources.getResourceEntryName(customToolbar) + style = resources.getIdentifier(color + "ColorToolbar", "style", packageName) + } + return style + } + + fun getCustomBackgroundStyle(resources: Resources, packageName: String): Int { + var style = 0 + if (customBackground != 0) { + val color = resources.getResourceEntryName(customBackground) + style = resources.getIdentifier(color + name, "style", packageName) + } + return style + } +} \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/thememanager/ui/ThemesActivity.kt b/app/src/main/java/chat/rocket/android/thememanager/ui/ThemesActivity.kt new file mode 100644 index 0000000000..dc72d72910 --- /dev/null +++ b/app/src/main/java/chat/rocket/android/thememanager/ui/ThemesActivity.kt @@ -0,0 +1,244 @@ +package chat.rocket.android.thememanager.ui + +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.widget.ArrayAdapter +import android.widget.EditText +import android.widget.ListView +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.TooltipCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import chat.rocket.android.R +import chat.rocket.android.thememanager.BaseActivity +import chat.rocket.android.thememanager.adapter.CustomThemesAdapter +import chat.rocket.android.thememanager.adapter.ThemesAdapter +import chat.rocket.android.thememanager.model.Theme +import chat.rocket.android.thememanager.util.ThemeUtil +import kotlinx.android.synthetic.main.activity_themes.* +import kotlinx.android.synthetic.main.app_bar.* +import kotlinx.android.synthetic.main.item_custom_themes_recycler.* +import kotlinx.android.synthetic.main.item_theme_info.* +import kotlinx.android.synthetic.main.item_themes_recycler.* + + +fun newInstance() = ThemesActivity() + +class ThemesActivity : BaseActivity() { + private lateinit var adapter: ThemesAdapter + private lateinit var customThemesAdapter: CustomThemesAdapter + private lateinit var baseThemesAdapter: ArrayAdapter + private var baseThemeIndex: Int = 0 + private var baseThemesArray = arrayListOf() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_themes) + + baseThemesArray = viewModel.getBaseThemeNames() + baseThemesAdapter = ArrayAdapter( + this, R.layout.item_alert_dialog_single_choice, baseThemesArray) + + setupToolbar() + setDate() + setCurrentTheme() + subscribeUi() + setupListeners() + setupRecyclerViewSwipeListener() + setupExpandedRecyclerViews() + } + + private fun setupExpandedRecyclerViews() { + if (viewModel.getIsCustom()) { + custom_themes_recycler_view.visibility = View.VISIBLE + recycler_view.visibility = View.GONE + } else { + custom_themes_recycler_view.visibility = View.GONE + recycler_view.visibility = View.VISIBLE + } + } + + private fun setDate() { + theme_last_changed.text = getString(R.string.last_changed, viewModel.getSavedDate()) + } + + private fun setCurrentTheme() { + current_theme.text = viewModel.getCurrentThemeName() + } + + private fun subscribeUi() { + viewModel.getThemes().observe(this, Observer { themes -> + setupRecyclerView(themes) + }) + viewModel.getCustomThemes().observe(this, Observer { customThemes -> + setupCustomRecyclerView(customThemes) + }) + } + + private fun saveTheme(theme: Theme) { + viewModel.saveTheme(theme.toString()) + reloadActivity() + } + + private fun reloadActivity() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + startActivity(Intent(this, ThemesActivity::class.java)) + overridePendingTransition(R.anim.fade_in, R.anim.fade_out) + finish() + } else { + recreate() + } + } + + private fun setupToolbar() { + with((this as AppCompatActivity)) { + with(toolbar) { + setSupportActionBar(this) + title = getString(R.string.title_change_theme) + setNavigationIcon(R.drawable.ic_arrow_back_white_24dp) + setNavigationOnClickListener { onBackPressed() } + } + } + } + + private fun setupRecyclerView(themes: List) { + adapter = ThemesAdapter(themes, listener = { theme: Theme -> saveTheme(theme) }) + recycler_view.layoutManager = LinearLayoutManager(this) + recycler_view.adapter = adapter + } + + private fun setupCustomRecyclerView(customThemes: List) { + customThemesAdapter = CustomThemesAdapter(customThemes, + listener = { themeIndex: Int, baseThemeName -> saveCustomTheme(themeIndex, baseThemeName) }, + colorListener = { themeIndex: Int, title: String, isDark: Boolean -> launchColorPicker(themeIndex, title, isDark) }) + custom_themes_recycler_view.layoutManager = LinearLayoutManager(this) + custom_themes_recycler_view.adapter = customThemesAdapter + } + + private fun setupListeners() { + revert_to_default.setOnClickListener { + viewModel.saveTheme("AppTheme") + reloadActivity() + } + layout_item_add_theme.setOnClickListener { + let { + val view = LayoutInflater.from(it).inflate(R.layout.dialog_add_theme, null) + val listView = view.findViewById(R.id.lv_items) + listView?.adapter = baseThemesAdapter + listView?.choiceMode = ListView.CHOICE_MODE_SINGLE + listView?.setItemChecked(0, true) + listView?.setOnItemClickListener { _, _, position, _ -> + baseThemeIndex = position + } + val editText = view.findViewById(R.id.edit_text_theme_name) + val dialog = AlertDialog.Builder(it) + .setTitle("Add Theme") + .setView(view) + .setNegativeButton(android.R.string.no) { dialog, _ -> dialog.cancel() } + .setPositiveButton(android.R.string.yes) { _, _ -> addCustomTheme(baseThemeIndex, editText.text.toString()) } + .create() + dialog.show() + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) + } + } + text_app_themes.setOnClickListener { + if (recycler_view.visibility == View.VISIBLE) { + recycler_view.visibility = View.GONE + } else { + recycler_view.visibility = View.VISIBLE + custom_themes_recycler_view.visibility = View.GONE + } + } + text_custom_themes.setOnClickListener { + if (custom_themes_recycler_view.visibility == View.VISIBLE) { + custom_themes_recycler_view.visibility = View.GONE + } else { + custom_themes_recycler_view.visibility = View.VISIBLE + recycler_view.visibility = View.GONE + } + } + TooltipCompat.setTooltipText(tooltip, "Tap a theme name to apply.\nTap a palette color to edit.\nSwipe to remove palette.") + } + + private fun setupRecyclerViewSwipeListener() { + val simpleItemTouchCallback = object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) { + + override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean { + return false + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + val position = viewHolder.adapterPosition + val isCurrent = viewModel.removeCustomTheme(position) + if (isCurrent) { + reloadActivity() + } + } + } + val itemTouchHelper = ItemTouchHelper(simpleItemTouchCallback) + itemTouchHelper.attachToRecyclerView(custom_themes_recycler_view) + } + + private fun addCustomTheme(baseThemeIndex: Int, customName: String) { + val saved = viewModel.addCustomTheme(baseThemeIndex, customName) + if (saved) { + let { + val dialog = AlertDialog.Builder(it) + .setTitle("Invalid Name") + .setMessage(ThemeUtil.getTintedString("Custom theme \"$customName\" already exists. Please choose a different name for your theme.", R.attr.colorPrimaryText)) + .setPositiveButton(android.R.string.yes) { dialog, _ -> dialog.dismiss() } + .create() + dialog.show() + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) + } + } + custom_themes_recycler_view.visibility = View.VISIBLE + } + + private fun launchColorPicker(themeIndex: Int, title: String, isDark: Boolean) { + var customColorsArray = arrayOf() + when (title) { + "Custom Accent" -> customColorsArray = resources.getStringArray(R.array.CustomAccent) + "Custom Toolbar" -> if (isDark) customColorsArray = resources.getStringArray(R.array.DarkCustomToolbar) + else customColorsArray = resources.getStringArray(R.array.LightCustomToolbar) + "Custom Background" -> if (isDark) customColorsArray = resources.getStringArray(R.array.DarkCustomBackground) + else customColorsArray = resources.getStringArray(R.array.LightCustomBackground) + } + val adapter = ArrayAdapter( + this, R.layout.item_alert_dialog_single_choice, customColorsArray) + let { + val dialog = AlertDialog.Builder(it) + .setTitle(title) + .setSingleChoiceItems( + adapter, 0 + ) { dialog, option -> + editCustomTheme(themeIndex, option, title, customColorsArray) + dialog.dismiss() + } + .setNegativeButton(android.R.string.cancel) { dialog, _ -> dialog.cancel() } + .create() + dialog.show() + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) + } + } + + private fun editCustomTheme(themeIndex: Int, option: Int, colorType: String, customColorsArray: Array) { + val isCurrent = viewModel.editCustomTheme(colorType, themeIndex, resources.getIdentifier(customColorsArray[option], "color", + this.packageName)) + if (isCurrent) { + saveCustomTheme(themeIndex, viewModel.getCurrentTheme().name) + } + } + + private fun saveCustomTheme(themeIndex: Int, baseThemeName: String) { + viewModel.saveCustomTheme(themeIndex, baseThemeName) + reloadActivity() + } +} diff --git a/app/src/main/java/chat/rocket/android/thememanager/util/ThemeUtil.kt b/app/src/main/java/chat/rocket/android/thememanager/util/ThemeUtil.kt new file mode 100644 index 0000000000..33236bac6a --- /dev/null +++ b/app/src/main/java/chat/rocket/android/thememanager/util/ThemeUtil.kt @@ -0,0 +1,47 @@ +package chat.rocket.android.thememanager.util + +import android.content.Context +import android.content.res.Resources +import android.text.SpannableString +import android.text.style.ForegroundColorSpan +import android.util.TypedValue +import androidx.annotation.AttrRes +import chat.rocket.android.R +import chat.rocket.android.thememanager.model.Theme + +class ThemeUtil{ + + companion object { + @JvmStatic + private lateinit var theme: Resources.Theme + private lateinit var themeData: Theme + private val typedValue: TypedValue = TypedValue() + private const val resolveRefs: Boolean = true + + fun setTheme(theme: Resources.Theme, themeData: Theme) { + this.theme = theme + this.themeData = themeData + } + + fun getThemeColor(@AttrRes attrColor: Int): Int { + theme.resolveAttribute(attrColor, typedValue, resolveRefs) + return typedValue.data + } + + fun getThemeColorResource(@AttrRes attrColor: Int): Int { + theme.resolveAttribute(attrColor, typedValue, resolveRefs) + return typedValue.resourceId + } + + fun getIsDark(context: Context): Boolean{ + theme.resolveAttribute(R.attr.colorBackgroundIsDark, typedValue, resolveRefs) + return context.resources.getBoolean(typedValue.resourceId) + } + + fun getTintedString(string: String, colorRef: Int): SpannableString{ + val spannableString = SpannableString(string) + spannableString.setSpan( ForegroundColorSpan(getThemeColor(colorRef)), 0, spannableString.length, 0) + return spannableString + } + } +} diff --git a/app/src/main/java/chat/rocket/android/thememanager/viewmodel/ThemesViewModel.kt b/app/src/main/java/chat/rocket/android/thememanager/viewmodel/ThemesViewModel.kt new file mode 100644 index 0000000000..5c91f27862 --- /dev/null +++ b/app/src/main/java/chat/rocket/android/thememanager/viewmodel/ThemesViewModel.kt @@ -0,0 +1,22 @@ +package chat.rocket.android.thememanager.viewmodel + +import androidx.lifecycle.ViewModel +import chat.rocket.android.thememanager.infrastructure.ThemesRepository +import javax.inject.Inject + +class ThemesViewModel @Inject constructor(private val themesRepository: ThemesRepository) + : ViewModel() { + + fun getThemes() = themesRepository.getThemes() + fun getBaseThemeNames() = themesRepository.getBaseThemeNames() + fun saveTheme(theme: String) = themesRepository.saveTheme(theme) + fun getCurrentTheme() = themesRepository.getCurrentTheme() + fun addCustomTheme(baseThemeIndex: Int, name: String) = themesRepository.addCustomTheme(baseThemeIndex, name) + fun saveCustomTheme(themeIndex: Int, baseThemeName: String) = themesRepository.saveCustomTheme(themeIndex, baseThemeName) + fun getCustomThemes() = themesRepository.getCustomThemes() + fun getSavedDate() = themesRepository.getSavedDate() + fun removeCustomTheme(position: Int) = themesRepository.removeCustomTheme(position) + fun editCustomTheme(colorType: String, themeIndex: Int, color: Int) = themesRepository.editCustomTheme(colorType, themeIndex, color) + fun getCurrentThemeName() = themesRepository.getCurrentThemeName() + fun getIsCustom() = themesRepository.getIsCustom() +} diff --git a/app/src/main/java/chat/rocket/android/thememanager/viewmodel/ThemesViewModelFactory.kt b/app/src/main/java/chat/rocket/android/thememanager/viewmodel/ThemesViewModelFactory.kt new file mode 100644 index 0000000000..74f89da22e --- /dev/null +++ b/app/src/main/java/chat/rocket/android/thememanager/viewmodel/ThemesViewModelFactory.kt @@ -0,0 +1,16 @@ +package chat.rocket.android.thememanager.viewmodel + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import chat.rocket.android.thememanager.infrastructure.ThemesRepository +import javax.inject.Inject + +class ThemesViewModelFactory @Inject constructor( + private val repository: ThemesRepository +) : ViewModelProvider.NewInstanceFactory() { + + @Suppress("UNCHECKED_CAST") + override fun create(modelClass: Class): T { + return ThemesViewModel(repository) as T + } +} \ No newline at end of file diff --git a/app/src/main/java/chat/rocket/android/userdetails/ui/UserDetailsFragment.kt b/app/src/main/java/chat/rocket/android/userdetails/ui/UserDetailsFragment.kt index e35540176e..ca10561390 100644 --- a/app/src/main/java/chat/rocket/android/userdetails/ui/UserDetailsFragment.kt +++ b/app/src/main/java/chat/rocket/android/userdetails/ui/UserDetailsFragment.kt @@ -12,12 +12,10 @@ import chat.rocket.android.R import chat.rocket.android.analytics.AnalyticsManager import chat.rocket.android.analytics.event.ScreenViewEvent import chat.rocket.android.chatroom.ui.ChatRoomActivity +import chat.rocket.android.thememanager.util.ThemeUtil import chat.rocket.android.userdetails.presentation.UserDetailsPresenter import chat.rocket.android.userdetails.presentation.UserDetailsView -import chat.rocket.android.util.extensions.inflate -import chat.rocket.android.util.extensions.setLightStatusBar -import chat.rocket.android.util.extensions.showToast -import chat.rocket.android.util.extensions.ui +import chat.rocket.android.util.extensions.* import com.bumptech.glide.Glide import com.bumptech.glide.load.MultiTransformation import com.bumptech.glide.load.engine.DiskCacheStrategy @@ -69,6 +67,8 @@ class UserDetailsFragment : Fragment(), UserDetailsView { super.onViewCreated(view, savedInstanceState) setupToolbar() + tintText() + tintDrawables() setupListeners() presenter.checkRemoveUserPermission(chatRoomId) presenter.loadUserDetails(userId) @@ -155,9 +155,9 @@ class UserDetailsFragment : Fragment(), UserDetailsView { handler.postDelayed({ with(activity as ChatRoomActivity) { view?.let { - setLightStatusBar( + setInvisibleStatusBar( it, - ContextCompat.getColor(this, R.color.whitesmoke) + ThemeUtil.getThemeColor(R.attr.colorSettingsSecondaryBackground) ) } toolbar.isVisible = false @@ -170,4 +170,20 @@ class UserDetailsFragment : Fragment(), UserDetailsView { image_avatar.setOnClickListener { with(presenter) { toProfileImage(getImageUri()) } } button_remove_user.setOnClickListener { presenter.removeUser(userId, chatRoomId) } } + + private fun tintText(){ + text_message.setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) + text_video_call.setTextColor(ThemeUtil.getThemeColor(R.attr.colorAccent)) + } + + private fun tintDrawables(){ + ui{ + val drawableMessage = DrawableHelper.getDrawableFromId(R.drawable.ic_message_24dp, it) + val drawableVideo = DrawableHelper.getDrawableFromId(R.drawable.ic_video_24dp, it) + val drawables = arrayOf(drawableMessage, drawableVideo) + DrawableHelper.tintDrawables(drawables, it, ThemeUtil.getThemeColorResource(R.attr.colorAccent)) + DrawableHelper.compoundTopDrawable(text_message,drawableMessage) + DrawableHelper.compoundTopDrawable(text_video_call,drawableVideo) + } + } } diff --git a/app/src/main/java/chat/rocket/android/util/extensions/Ui.kt b/app/src/main/java/chat/rocket/android/util/extensions/Ui.kt index 6f60a628fb..4b2f170639 100644 --- a/app/src/main/java/chat/rocket/android/util/extensions/Ui.kt +++ b/app/src/main/java/chat/rocket/android/util/extensions/Ui.kt @@ -3,6 +3,7 @@ package chat.rocket.android.util.extensions import android.annotation.SuppressLint import android.app.Activity import android.content.Context +import android.graphics.drawable.ColorDrawable import android.os.Build import android.view.LayoutInflater import android.view.Menu @@ -22,23 +23,28 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import chat.rocket.android.R +import chat.rocket.android.thememanager.util.ThemeUtil -fun FragmentActivity.setLightStatusBar(view: View, @ColorInt color: Int = 0) { +fun FragmentActivity.setInvisibleStatusBar(view: View, @ColorInt color: Int = 0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + val isDark = ThemeUtil.getIsDark(applicationContext) var flags = view.systemUiVisibility - flags = flags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - view.systemUiVisibility = flags + window.decorView.systemUiVisibility = (if (isDark){ + flags and (View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR).inv()}else{ + flags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR}) window.statusBarColor = if (color == 0) { - ContextCompat.getColor(this, R.color.colorWhite) + ThemeUtil.getThemeColor(android.R.attr.colorBackground) } else { color } } } -fun FragmentActivity.clearLightStatusBar() { +fun FragmentActivity.clearInvisibleStatusBar(view: View) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - window.statusBarColor = ContextCompat.getColor(this, R.color.colorPrimary) + val flags = view.systemUiVisibility + window.decorView.systemUiVisibility = flags and (View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR).inv() + window.statusBarColor = ThemeUtil.getThemeColor(R.attr.colorPrimaryDark) } } diff --git a/app/src/main/java/chat/rocket/android/util/extensions/View.kt b/app/src/main/java/chat/rocket/android/util/extensions/View.kt index 55f68eb223..eec68f3d80 100644 --- a/app/src/main/java/chat/rocket/android/util/extensions/View.kt +++ b/app/src/main/java/chat/rocket/android/util/extensions/View.kt @@ -6,6 +6,7 @@ import androidx.core.content.res.ResourcesCompat import android.view.View import androidx.core.view.isVisible import chat.rocket.android.R +import chat.rocket.android.thememanager.util.ThemeUtil import timber.log.Timber fun View.openTabbedUrl(url: String?) { @@ -13,7 +14,7 @@ fun View.openTabbedUrl(url: String?) { with(this) { val uri = url.ensureScheme() val tabsbuilder = CustomTabsIntent.Builder() - tabsbuilder.setToolbarColor(ResourcesCompat.getColor(context.resources, R.color.colorPrimary, context.theme)) + tabsbuilder.setToolbarColor(ThemeUtil.getThemeColor(R.attr.colorPrimary)) val customTabsIntent = tabsbuilder.build() try { customTabsIntent.launchUrl(context, uri) diff --git a/app/src/main/java/chat/rocket/android/videoconference/ui/VideoConferenceActivity.kt b/app/src/main/java/chat/rocket/android/videoconference/ui/VideoConferenceActivity.kt index 0b8bd31178..465afad7fb 100644 --- a/app/src/main/java/chat/rocket/android/videoconference/ui/VideoConferenceActivity.kt +++ b/app/src/main/java/chat/rocket/android/videoconference/ui/VideoConferenceActivity.kt @@ -3,7 +3,7 @@ package chat.rocket.android.videoconference.ui import android.content.Context import android.content.Intent import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity +import chat.rocket.android.thememanager.BaseActivity import chat.rocket.android.videoconference.presenter.JitsiVideoConferenceView import chat.rocket.android.videoconference.presenter.VideoConferencePresenter import dagger.android.AndroidInjection @@ -23,7 +23,7 @@ fun Context.videoConferenceIntent(chatRoomId: String, chatRoomType: String): Int private const val INTENT_CHAT_ROOM_ID = "chat_room_id" private const val INTENT_CHAT_ROOM_TYPE = "chat_room_type" -class VideoConferenceActivity : AppCompatActivity(), JitsiVideoConferenceView, +class VideoConferenceActivity : BaseActivity(), JitsiVideoConferenceView, JitsiMeetViewListener { @Inject lateinit var presenter: VideoConferencePresenter private lateinit var chatRoomId: String diff --git a/app/src/main/java/chat/rocket/android/webview/oauth/ui/OauthWebViewActivity.kt b/app/src/main/java/chat/rocket/android/webview/oauth/ui/OauthWebViewActivity.kt index bcf96ca879..b77eb85be8 100644 --- a/app/src/main/java/chat/rocket/android/webview/oauth/ui/OauthWebViewActivity.kt +++ b/app/src/main/java/chat/rocket/android/webview/oauth/ui/OauthWebViewActivity.kt @@ -11,6 +11,7 @@ import android.webkit.WebView import android.webkit.WebViewClient import androidx.core.net.toUri import chat.rocket.android.R +import chat.rocket.android.thememanager.BaseActivity import chat.rocket.android.util.extensions.decodeUrl import chat.rocket.android.util.extensions.toJsonObject import kotlinx.android.synthetic.main.activity_web_view.* @@ -32,7 +33,7 @@ const val INTENT_OAUTH_CREDENTIAL_TOKEN = "credential_token" const val INTENT_OAUTH_CREDENTIAL_SECRET = "credential_secret" // Shows a WebView to the user authenticate with its OAuth credential. -class OauthWebViewActivity : AppCompatActivity() { +class OauthWebViewActivity : BaseActivity() { private lateinit var webPageUrl: String private lateinit var state: String private var isWebViewSetUp: Boolean = false diff --git a/app/src/main/java/chat/rocket/android/webview/sso/ui/SsoWebViewActivity.kt b/app/src/main/java/chat/rocket/android/webview/sso/ui/SsoWebViewActivity.kt index eb6444c083..a00fd63813 100644 --- a/app/src/main/java/chat/rocket/android/webview/sso/ui/SsoWebViewActivity.kt +++ b/app/src/main/java/chat/rocket/android/webview/sso/ui/SsoWebViewActivity.kt @@ -11,6 +11,7 @@ import android.webkit.CookieManager import android.webkit.WebView import android.webkit.WebViewClient import chat.rocket.android.R +import chat.rocket.android.thememanager.BaseActivity import kotlinx.android.synthetic.main.activity_web_view.* import kotlinx.android.synthetic.main.app_bar.* @@ -27,7 +28,7 @@ const val INTENT_SSO_TOKEN = "cas_token" /** * This class is responsible to handle the authentication thought single sign-on protocol (CAS and SAML). */ -class SsoWebViewActivity : AppCompatActivity() { +class SsoWebViewActivity : BaseActivity() { private lateinit var webPageUrl: String private lateinit var casToken: String private var isWebViewSetUp: Boolean = false diff --git a/app/src/main/java/chat/rocket/android/webview/ui/WebViewActivity.kt b/app/src/main/java/chat/rocket/android/webview/ui/WebViewActivity.kt index 348f26618c..7db6326a46 100644 --- a/app/src/main/java/chat/rocket/android/webview/ui/WebViewActivity.kt +++ b/app/src/main/java/chat/rocket/android/webview/ui/WebViewActivity.kt @@ -8,6 +8,7 @@ import androidx.appcompat.app.AppCompatActivity import android.webkit.WebView import android.webkit.WebViewClient import chat.rocket.android.R +import chat.rocket.android.thememanager.BaseActivity import kotlinx.android.synthetic.main.activity_web_view.* import kotlinx.android.synthetic.main.app_bar.* @@ -22,7 +23,7 @@ private const val INTENT_WEB_PAGE_URL = "web_page_url" private const val TOOLBAR_TITLE = "toolbar_title" // Simple WebView to load URL. -class WebViewActivity : AppCompatActivity() { +class WebViewActivity : BaseActivity() { private lateinit var webPageUrl: String private var toolbarTitle: String? = "" diff --git a/app/src/main/res/anim/fade_in.xml b/app/src/main/res/anim/fade_in.xml new file mode 100644 index 0000000000..0ff06a3083 --- /dev/null +++ b/app/src/main/res/anim/fade_in.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/fade_out.xml b/app/src/main/res/anim/fade_out.xml new file mode 100644 index 0000000000..9b71a9421a --- /dev/null +++ b/app/src/main/res/anim/fade_out.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_border_user_details_avatar.xml b/app/src/main/res/drawable/bg_border_user_details_avatar.xml index 21468e90e4..e68058e7a4 100644 --- a/app/src/main/res/drawable/bg_border_user_details_avatar.xml +++ b/app/src/main/res/drawable/bg_border_user_details_avatar.xml @@ -8,7 +8,7 @@ android:right="3dp" android:top="3dp" /> - + diff --git a/app/src/main/res/drawable/circle_background_grey.xml b/app/src/main/res/drawable/circle_background_grey.xml index c63b22acf4..9ef1eb602f 100644 --- a/app/src/main/res/drawable/circle_background_grey.xml +++ b/app/src/main/res/drawable/circle_background_grey.xml @@ -2,5 +2,6 @@ - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_action_message_copy_24dp.xml b/app/src/main/res/drawable/ic_action_message_copy_24dp.xml index 13867bd2ca..993cbf39df 100644 --- a/app/src/main/res/drawable/ic_action_message_copy_24dp.xml +++ b/app/src/main/res/drawable/ic_action_message_copy_24dp.xml @@ -5,6 +5,6 @@ android:viewportWidth="24.0"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_action_message_edit_24dp.xml b/app/src/main/res/drawable/ic_action_message_edit_24dp.xml index 9f97047379..c684d56972 100644 --- a/app/src/main/res/drawable/ic_action_message_edit_24dp.xml +++ b/app/src/main/res/drawable/ic_action_message_edit_24dp.xml @@ -5,6 +5,6 @@ android:viewportWidth="24.0"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_action_message_info_outline_24dp.xml b/app/src/main/res/drawable/ic_action_message_info_outline_24dp.xml index 91752eab05..d8d93fa92f 100644 --- a/app/src/main/res/drawable/ic_action_message_info_outline_24dp.xml +++ b/app/src/main/res/drawable/ic_action_message_info_outline_24dp.xml @@ -4,6 +4,6 @@ android:viewportHeight="24.0" android:viewportWidth="24.0"> diff --git a/app/src/main/res/drawable/ic_action_message_link_24dp.xml b/app/src/main/res/drawable/ic_action_message_link_24dp.xml index e0698f9f34..dfbc8d80c4 100644 --- a/app/src/main/res/drawable/ic_action_message_link_24dp.xml +++ b/app/src/main/res/drawable/ic_action_message_link_24dp.xml @@ -5,6 +5,6 @@ android:viewportHeight="20"> diff --git a/app/src/main/res/drawable/ic_action_message_pin_24dp.xml b/app/src/main/res/drawable/ic_action_message_pin_24dp.xml index fa957518da..7cdba8cd8b 100644 --- a/app/src/main/res/drawable/ic_action_message_pin_24dp.xml +++ b/app/src/main/res/drawable/ic_action_message_pin_24dp.xml @@ -5,6 +5,6 @@ android:viewportWidth="24"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_action_message_quote_24dp.xml b/app/src/main/res/drawable/ic_action_message_quote_24dp.xml index 6108ec53ec..9257c67f71 100644 --- a/app/src/main/res/drawable/ic_action_message_quote_24dp.xml +++ b/app/src/main/res/drawable/ic_action_message_quote_24dp.xml @@ -5,6 +5,6 @@ android:viewportWidth="24.0"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_action_message_reply_24dp.xml b/app/src/main/res/drawable/ic_action_message_reply_24dp.xml index 1be865065f..e1690752bb 100644 --- a/app/src/main/res/drawable/ic_action_message_reply_24dp.xml +++ b/app/src/main/res/drawable/ic_action_message_reply_24dp.xml @@ -5,6 +5,6 @@ android:viewportWidth="24.0"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_action_message_report_24dp.xml b/app/src/main/res/drawable/ic_action_message_report_24dp.xml index f789e51484..fdd075bf49 100644 --- a/app/src/main/res/drawable/ic_action_message_report_24dp.xml +++ b/app/src/main/res/drawable/ic_action_message_report_24dp.xml @@ -5,6 +5,6 @@ android:viewportHeight="20"> diff --git a/app/src/main/res/drawable/ic_action_message_star_24dp.xml b/app/src/main/res/drawable/ic_action_message_star_24dp.xml index 0659283c74..d852886550 100644 --- a/app/src/main/res/drawable/ic_action_message_star_24dp.xml +++ b/app/src/main/res/drawable/ic_action_message_star_24dp.xml @@ -5,6 +5,7 @@ android:viewportWidth="24.0"> + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_activity_20dp.xml b/app/src/main/res/drawable/ic_activity_20dp.xml index 7dd8e07c32..7ccfbee1db 100644 --- a/app/src/main/res/drawable/ic_activity_20dp.xml +++ b/app/src/main/res/drawable/ic_activity_20dp.xml @@ -17,3 +17,4 @@ android:strokeWidth="1.5" android:strokeColor="#9EA2A8" /> + diff --git a/app/src/main/res/drawable/ic_add_24dp.xml b/app/src/main/res/drawable/ic_add_24dp.xml index 0258249cc4..e2d88e56d3 100644 --- a/app/src/main/res/drawable/ic_add_24dp.xml +++ b/app/src/main/res/drawable/ic_add_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_add_new_server_48dp.xml b/app/src/main/res/drawable/ic_add_new_server_48dp.xml index 8bf08b2bcb..2e92430cf5 100644 --- a/app/src/main/res/drawable/ic_add_new_server_48dp.xml +++ b/app/src/main/res/drawable/ic_add_new_server_48dp.xml @@ -9,12 +9,12 @@ 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" /> + android:strokeColor="?colorDescriptiveText" /> + android:strokeColor="?colorDescriptiveText" /> diff --git a/app/src/main/res/drawable/ic_add_reaction.xml b/app/src/main/res/drawable/ic_add_reaction.xml index 0660ee6c01..5e223f7b11 100644 --- a/app/src/main/res/drawable/ic_add_reaction.xml +++ b/app/src/main/res/drawable/ic_add_reaction.xml @@ -4,22 +4,22 @@ android:viewportHeight="20.0" android:viewportWidth="20.0"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_at_black_20dp.xml b/app/src/main/res/drawable/ic_at_black_20dp.xml index 49c5f5f609..89203c27b5 100644 --- a/app/src/main/res/drawable/ic_at_black_20dp.xml +++ b/app/src/main/res/drawable/ic_at_black_20dp.xml @@ -10,17 +10,17 @@ android:pathData="M0 0h20v20H0z" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_chat_black_24dp.xml b/app/src/main/res/drawable/ic_chat_black_24dp.xml index e3489bdead..97868241f9 100644 --- a/app/src/main/res/drawable/ic_chat_black_24dp.xml +++ b/app/src/main/res/drawable/ic_chat_black_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_check_unread_24dp.xml b/app/src/main/res/drawable/ic_check_unread_24dp.xml index 31bb59746c..ea9fd4ab4f 100644 --- a/app/src/main/res/drawable/ic_check_unread_24dp.xml +++ b/app/src/main/res/drawable/ic_check_unread_24dp.xml @@ -4,6 +4,7 @@ android:viewportHeight="24.0" android:viewportWidth="24.0"> + 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 index 24835127dd..f771d246b2 100644 --- a/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml +++ b/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_close_gray_24dp.xml b/app/src/main/res/drawable/ic_close_gray_24dp.xml index f91f9ccfb2..32fcb3dab5 100644 --- a/app/src/main/res/drawable/ic_close_gray_24dp.xml +++ b/app/src/main/res/drawable/ic_close_gray_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_email_black_20dp.xml b/app/src/main/res/drawable/ic_email_black_20dp.xml index e062d6a22b..5b9fab89bc 100644 --- a/app/src/main/res/drawable/ic_email_black_20dp.xml +++ b/app/src/main/res/drawable/ic_email_black_20dp.xml @@ -10,12 +10,12 @@ android:pathData="M0 0h20v20H0z" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_favorites_20dp.xml b/app/src/main/res/drawable/ic_favorites_20dp.xml index 94c6c62039..4e2a0058b5 100644 --- a/app/src/main/res/drawable/ic_favorites_20dp.xml +++ b/app/src/main/res/drawable/ic_favorites_20dp.xml @@ -10,4 +10,5 @@ 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" /> + diff --git a/app/src/main/res/drawable/ic_files_24dp.xml b/app/src/main/res/drawable/ic_files_24dp.xml index 8b8a88fe31..7ba296a8ac 100644 --- a/app/src/main/res/drawable/ic_files_24dp.xml +++ b/app/src/main/res/drawable/ic_files_24dp.xml @@ -4,7 +4,7 @@ android:viewportHeight="17.0" android:viewportWidth="18.0"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_filter_20dp.xml b/app/src/main/res/drawable/ic_filter_20dp.xml index f92bb571b1..a167583d40 100644 --- a/app/src/main/res/drawable/ic_filter_20dp.xml +++ b/app/src/main/res/drawable/ic_filter_20dp.xml @@ -11,6 +11,7 @@ android:strokeWidth="1.5" android:strokeColor="#9EA2A8" android:strokeLineCap="round" /> + + + diff --git a/app/src/main/res/drawable/ic_hashtag_black_12dp.xml b/app/src/main/res/drawable/ic_hashtag_black_12dp.xml index d7b7455e2f..44e4669d6b 100644 --- a/app/src/main/res/drawable/ic_hashtag_black_12dp.xml +++ b/app/src/main/res/drawable/ic_hashtag_black_12dp.xml @@ -5,18 +5,18 @@ android:viewportWidth="12"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_insert_drive_file_black_24dp.xml b/app/src/main/res/drawable/ic_insert_drive_file_black_24dp.xml index 5d88006c77..3e4b20ed24 100644 --- a/app/src/main/res/drawable/ic_insert_drive_file_black_24dp.xml +++ b/app/src/main/res/drawable/ic_insert_drive_file_black_24dp.xml @@ -5,6 +5,6 @@ android:viewportWidth="24.0"> diff --git a/app/src/main/res/drawable/ic_key_black_20dp.xml b/app/src/main/res/drawable/ic_key_black_20dp.xml index 4cb9196bce..46295b3876 100644 --- a/app/src/main/res/drawable/ic_key_black_20dp.xml +++ b/app/src/main/res/drawable/ic_key_black_20dp.xml @@ -10,12 +10,12 @@ android:fillType="evenOdd" android:pathData="M10.0002,5.5001C10.0002,6.3261 9.869,6.9474 9.6082,7.3639L14.4347,12.0381L15,13.8704L13.8695,15L12.0425,14.4382L11.6838,14.0804L11.6838,12.7898L10.3931,12.7898L9.8419,12.2385L9.8419,10.947L8.5504,10.947L7.1801,9.5715C6.6709,9.8576 6.11,10.0002 5.5001,10.0002C4.2845,10.0003 3.1205,9.5084 2.2732,8.6367C1.4258,7.765 0.9672,6.5876 1.0017,5.3724C1.0674,3.0239 3.0247,1.0674 5.3724,1.0017C6.5873,0.9675 7.7643,1.4261 8.6358,2.2732C9.5073,3.1203 9.9991,4.2839 9.9994,5.4992L10.0002,5.5001Z" android:strokeWidth="1.5" - android:strokeColor="#FF2F343D" /> + android:strokeColor="#000000" /> + android:strokeColor="#000000" /> diff --git a/app/src/main/res/drawable/ic_keyboard_black_24dp.xml b/app/src/main/res/drawable/ic_keyboard_black_24dp.xml index 21eed7c287..93b80b38c6 100644 --- a/app/src/main/res/drawable/ic_keyboard_black_24dp.xml +++ b/app/src/main/res/drawable/ic_keyboard_black_24dp.xml @@ -6,7 +6,7 @@ android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_lock_black_12_dp.xml b/app/src/main/res/drawable/ic_lock_black_12_dp.xml index ec2a0d9f99..fa530c43df 100644 --- a/app/src/main/res/drawable/ic_lock_black_12_dp.xml +++ b/app/src/main/res/drawable/ic_lock_black_12_dp.xml @@ -6,11 +6,11 @@ \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_person_black_20dp.xml b/app/src/main/res/drawable/ic_person_black_20dp.xml index ae64ca0dd4..93fbe02279 100644 --- a/app/src/main/res/drawable/ic_person_black_20dp.xml +++ b/app/src/main/res/drawable/ic_person_black_20dp.xml @@ -10,7 +10,7 @@ android:pathData="M0 0h20v20H0z" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_reaction_24dp.xml b/app/src/main/res/drawable/ic_reaction_24dp.xml index 1acb14aa2d..462e11e3c3 100644 --- a/app/src/main/res/drawable/ic_reaction_24dp.xml +++ b/app/src/main/res/drawable/ic_reaction_24dp.xml @@ -5,21 +5,21 @@ android:viewportWidth="20.0"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_send_24dp.xml b/app/src/main/res/drawable/ic_send_24dp.xml index ab820d67a6..97c955be93 100644 --- a/app/src/main/res/drawable/ic_send_24dp.xml +++ b/app/src/main/res/drawable/ic_send_24dp.xml @@ -6,7 +6,7 @@ android:viewportWidth="22.0"> \ 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 index a3d3568e28..e9aa13ea52 100644 --- a/app/src/main/res/drawable/ic_server.xml +++ b/app/src/main/res/drawable/ic_server.xml @@ -6,7 +6,7 @@ android:viewportHeight="171"> + + diff --git a/app/src/main/res/drawable/message_reply_button_bg.xml b/app/src/main/res/drawable/message_reply_button_bg.xml index 85a9bdb663..7ac48613a1 100644 --- a/app/src/main/res/drawable/message_reply_button_bg.xml +++ b/app/src/main/res/drawable/message_reply_button_bg.xml @@ -2,7 +2,7 @@ - + diff --git a/app/src/main/res/drawable/quote_vertical_gray_bar.xml b/app/src/main/res/drawable/quote_vertical_gray_bar.xml index 28c98fc7d9..8649213b69 100644 --- a/app/src/main/res/drawable/quote_vertical_gray_bar.xml +++ b/app/src/main/res/drawable/quote_vertical_gray_bar.xml @@ -1,7 +1,9 @@ - + + + diff --git a/app/src/main/res/drawable/round_textview.xml b/app/src/main/res/drawable/round_textview.xml index f5f6c954de..fd41fb321f 100644 --- a/app/src/main/res/drawable/round_textview.xml +++ b/app/src/main/res/drawable/round_textview.xml @@ -1,7 +1,7 @@ - + - + + diff --git a/app/src/main/res/drawable/rounded_border.xml b/app/src/main/res/drawable/rounded_border.xml index f36cb2a5b3..60bb814d3f 100644 --- a/app/src/main/res/drawable/rounded_border.xml +++ b/app/src/main/res/drawable/rounded_border.xml @@ -4,7 +4,7 @@ + android:color="?colorAuthenticationButtonBorderAndDivider" /> \ 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 81a3650e17..e3df494dbe 100644 --- a/app/src/main/res/drawable/rounded_color_accent.xml +++ b/app/src/main/res/drawable/rounded_color_accent.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/style_attachment_options.xml b/app/src/main/res/drawable/style_attachment_options.xml index 29b8374102..4ed1a113d9 100644 --- a/app/src/main/res/drawable/style_attachment_options.xml +++ b/app/src/main/res/drawable/style_attachment_options.xml @@ -3,7 +3,7 @@ android:shape="rectangle"> + android:color="?android:colorBackground" /> diff --git a/app/src/main/res/drawable/style_edit_text_profile.xml b/app/src/main/res/drawable/style_edit_text_profile.xml index 5308affbbf..3a122046c8 100644 --- a/app/src/main/res/drawable/style_edit_text_profile.xml +++ b/app/src/main/res/drawable/style_edit_text_profile.xml @@ -4,7 +4,7 @@ + android:color="?colorPrimary" /> diff --git a/app/src/main/res/drawable/style_total_unread_messages.xml b/app/src/main/res/drawable/style_total_unread_messages.xml index c1d197d9b3..922b6a844e 100644 --- a/app/src/main/res/drawable/style_total_unread_messages.xml +++ b/app/src/main/res/drawable/style_total_unread_messages.xml @@ -2,6 +2,6 @@ - + diff --git a/app/src/main/res/drawable/theme_preview.xml b/app/src/main/res/drawable/theme_preview.xml new file mode 100644 index 0000000000..04497bc3a8 --- /dev/null +++ b/app/src/main/res/drawable/theme_preview.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/theme_preview_small.xml b/app/src/main/res/drawable/theme_preview_small.xml new file mode 100644 index 0000000000..c539ced94a --- /dev/null +++ b/app/src/main/res/drawable/theme_preview_small.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_chat_room.xml b/app/src/main/res/layout/activity_chat_room.xml index a6f7c66a83..311dd22b09 100644 --- a/app/src/main/res/layout/activity_chat_room.xml +++ b/app/src/main/res/layout/activity_chat_room.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:theme="@style/AppTheme" + android:theme="?appTheme" tools:context=".chatroom.ui.ChatRoomActivity"> \ No newline at end of file + tools:context=".main.ui.MainActivity" /> + + diff --git a/app/src/main/res/layout/activity_password.xml b/app/src/main/res/layout/activity_password.xml index c4dd4a2a8f..2be59929df 100644 --- a/app/src/main/res/layout/activity_password.xml +++ b/app/src/main/res/layout/activity_password.xml @@ -4,7 +4,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:theme="@style/AppTheme" tools:context=".settings.password.ui.PasswordActivity"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_web_view.xml b/app/src/main/res/layout/activity_web_view.xml index 47d208106b..7a179d474d 100644 --- a/app/src/main/res/layout/activity_web_view.xml +++ b/app/src/main/res/layout/activity_web_view.xml @@ -21,7 +21,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" - app:indicatorColor="@color/colorBlack" + app:indicatorColor="?colorLoading" app:indicatorName="BallPulseIndicator" /> \ No newline at end of file diff --git a/app/src/main/res/layout/app_bar.xml b/app/src/main/res/layout/app_bar.xml index 87845b60de..f4f441372a 100644 --- a/app/src/main/res/layout/app_bar.xml +++ b/app/src/main/res/layout/app_bar.xml @@ -2,15 +2,11 @@ + android:layout_height="wrap_content"> + android:layout_height="?attr/actionBarSize"/> \ No newline at end of file diff --git a/app/src/main/res/layout/app_bar_chat_room.xml b/app/src/main/res/layout/app_bar_chat_room.xml index 1ce7116f2c..e86a93542c 100644 --- a/app/src/main/res/layout/app_bar_chat_room.xml +++ b/app/src/main/res/layout/app_bar_chat_room.xml @@ -3,18 +3,14 @@ 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"> + android:layout_height="wrap_content"> + app:navigationIcon="?android:attr/homeAsUpIndicator"> + android:layout_height="wrap_content"> + app:navigationIcon="@drawable/ic_navigation_24dp"> + \ No newline at end of file diff --git a/app/src/main/res/layout/app_bar_password.xml b/app/src/main/res/layout/app_bar_password.xml index 8db44bba59..2c31ba55a3 100644 --- a/app/src/main/res/layout/app_bar_password.xml +++ b/app/src/main/res/layout/app_bar_password.xml @@ -4,17 +4,14 @@ 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"> + > + app:navigationIcon="?android:attr/homeAsUpIndicator"> diff --git a/app/src/main/res/layout/bottom_sheet_fragment_directory_sorting.xml b/app/src/main/res/layout/bottom_sheet_fragment_directory_sorting.xml index 4594abaf50..46c852e28d 100644 --- a/app/src/main/res/layout/bottom_sheet_fragment_directory_sorting.xml +++ b/app/src/main/res/layout/bottom_sheet_fragment_directory_sorting.xml @@ -15,16 +15,15 @@ android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:text="@string/msg_sort_by" - android:textColor="#9EA2A8" - android:textSize="17sp" - android:textStyle="normal" /> + android:textColor="?colorBottomSheetFragmentText" /> + /> @@ -73,7 +72,7 @@ android:layout_height="1dp" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" - android:background="#1F000000" + android:background="?colorDivider" app:layout_constraintTop_toBottomOf="@+id/text_users" /> @@ -109,7 +109,7 @@ android:paddingEnd="16dp" android:paddingBottom="16dp" android:text="@string/msg_search_for_global_users_description" - android:textColor="#9EA2A8" + android:textColor="?colorBottomSheetFragmentText" android:textSize="14sp" android:textStyle="normal" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/bottom_sheet_fragment_servers.xml b/app/src/main/res/layout/bottom_sheet_fragment_servers.xml index e8ecff5af5..bd4ca28792 100644 --- a/app/src/main/res/layout/bottom_sheet_fragment_servers.xml +++ b/app/src/main/res/layout/bottom_sheet_fragment_servers.xml @@ -15,7 +15,7 @@ android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:text="@string/msg_server" - android:textColor="#9EA2A8" + android:textColor="?colorBottomSheetFragmentText" android:textSize="17sp" android:textStyle="normal" app:layout_constraintStart_toStartOf="parent" @@ -26,7 +26,7 @@ android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="16dp" - android:background="#1F000000" + android:background="?colorDivider" app:layout_constraintTop_toBottomOf="@+id/text_server" /> @@ -22,7 +22,7 @@ android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="16dp" - android:background="#1F000000" /> + android:background="?colorDivider" /> @@ -59,7 +59,7 @@ android:paddingEnd="16dp" android:paddingBottom="16dp" android:text="@string/msg_sort_by_activity" - android:textColor="#2F343D" + android:textColor="?colorBottomSheetFragmentHeading" android:textSize="16sp" android:textStyle="normal" /> @@ -69,7 +69,7 @@ android:layout_height="1dp" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" - android:background="#1F000000" /> + android:background="?colorDivider" /> @@ -97,7 +97,7 @@ android:paddingEnd="16dp" android:paddingBottom="16dp" android:text="@string/msg_group_by_type" - android:textColor="#2F343D" + android:textColor="?colorBottomSheetFragmentHeading" android:textSize="16sp" android:textStyle="normal" /> @@ -112,10 +112,11 @@ android:paddingEnd="16dp" android:paddingBottom="16dp" android:text="@string/msg_group_by_favorites" - android:textColor="#2F343D" + android:textColor="?colorBottomSheetFragmentHeading" android:textSize="16sp" android:textStyle="normal" /> + diff --git a/app/src/main/res/layout/dialog_add_theme.xml b/app/src/main/res/layout/dialog_add_theme.xml new file mode 100644 index 0000000000..1ff6a532b4 --- /dev/null +++ b/app/src/main/res/layout/dialog_add_theme.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_delete_account.xml b/app/src/main/res/layout/dialog_delete_account.xml index 9a8ec5b035..ea466383bd 100644 --- a/app/src/main/res/layout/dialog_delete_account.xml +++ b/app/src/main/res/layout/dialog_delete_account.xml @@ -20,6 +20,7 @@ android:hint="@string/msg_password" android:imeOptions="actionDone" android:inputType="textPassword" + android:textColorHint="?colorTextHintEditText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/text_are_you_sure" /> diff --git a/app/src/main/res/layout/dialog_status.xml b/app/src/main/res/layout/dialog_status.xml index 03405d7f28..21cef9a02e 100644 --- a/app/src/main/res/layout/dialog_status.xml +++ b/app/src/main/res/layout/dialog_status.xml @@ -12,6 +12,7 @@ diff --git a/app/src/main/res/layout/file_attachments_dialog.xml b/app/src/main/res/layout/file_attachments_dialog.xml index ddabaa6fa0..8544a24bc8 100644 --- a/app/src/main/res/layout/file_attachments_dialog.xml +++ b/app/src/main/res/layout/file_attachments_dialog.xml @@ -1,6 +1,5 @@ - @@ -25,28 +25,28 @@ android:id="@+id/text_file_name" android:layout_width="0dp" android:layout_height="wrap_content" - android:textColor="@color/colorAccent" - android:textAppearance="@style/TextAppearance.AppCompat.Body2" + android:layout_margin="16dp" android:drawableStart="@drawable/ic_files_24dp" android:drawablePadding="6dp" - app:layout_constraintTop_toBottomOf="@id/text_dialog_title" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" - android:layout_margin="16dp" + android:textAppearance="@style/TextAppearance.AppCompat.Body2" + android:textColor="?colorAccent" android:textDirection="locale" android:visibility="gone" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/text_dialog_title" tools:text="This is a very, very, very long filename, to test how the layout will work on very very very long filenames.pdf" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/text_file_name"> + android:hint="@string/msg_file_description" + android:textColor="?colorPrimaryText" + android:textColorHint="?colorTextHintEditText" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/image_preview" /> + android:textColor="@color/colorWhite" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/text_file_description" /> + android:text="@android:string/cancel" + android:textColor="?colorPrimaryText" + app:layout_constraintEnd_toStartOf="@id/button_send" + app:layout_constraintTop_toBottomOf="@+id/text_file_description" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_admin_panel_web_view.xml b/app/src/main/res/layout/fragment_admin_panel_web_view.xml index 2f1bd797dd..e73a7ebfa6 100644 --- a/app/src/main/res/layout/fragment_admin_panel_web_view.xml +++ b/app/src/main/res/layout/fragment_admin_panel_web_view.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="?android:colorBackground" tools:context=".webview.adminpanel.ui.AdminPanelWebViewFragment"> @@ -35,6 +36,7 @@ android:hint="@string/msg_password" android:imeOptions="actionDone" android:inputType="textPassword" + android:textColorHint="?colorTextHintEditText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_username_or_email" /> @@ -43,7 +45,6 @@ android:id="@+id/button_log_in" style="@style/Authentication.Button" android:layout_marginTop="20dp" - android:backgroundTint="@color/colorAuthenticationButtonDisabled" android:enabled="false" android:text="@string/title_log_in" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_authentication_login_options.xml b/app/src/main/res/layout/fragment_authentication_login_options.xml index a80efc5539..5a43d5d57e 100644 --- a/app/src/main/res/layout/fragment_authentication_login_options.xml +++ b/app/src/main/res/layout/fragment_authentication_login_options.xml @@ -3,7 +3,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/colorWhite" android:padding="@dimen/screen_edge_left_and_right_margins" tools:context="authentication.loginoptions.ui.LoginOptionsFragment"> @@ -34,7 +33,7 @@ android:paddingEnd="16dp" android:text="@string/msg_continue_with_facebook" android:textAllCaps="false" - android:textColor="@color/colorPrimary" + android:textColor="?colorHeadings" android:textSize="16sp" android:visibility="gone" tools:visibility="visible" /> @@ -53,7 +52,7 @@ android:paddingEnd="16dp" android:text="@string/msg_continue_with_github" android:textAllCaps="false" - android:textColor="@color/colorPrimary" + android:textColor="?colorHeadings" android:textSize="16sp" android:visibility="gone" tools:visibility="visible" /> @@ -72,7 +71,7 @@ android:paddingEnd="16dp" android:text="@string/msg_continue_with_google" android:textAllCaps="false" - android:textColor="@color/colorPrimary" + android:textColor="?colorHeadings" android:textSize="16sp" android:visibility="gone" tools:visibility="visible" /> @@ -91,7 +90,7 @@ android:paddingEnd="16dp" android:text="@string/msg_continue_with_linkedin" android:textAllCaps="false" - android:textColor="@color/colorPrimary" + android:textColor="?colorHeadings" android:textSize="16sp" android:visibility="gone" tools:visibility="visible" /> @@ -110,7 +109,7 @@ android:paddingEnd="16dp" android:text="@string/msg_continue_with_gitlab" android:textAllCaps="false" - android:textColor="@color/colorPrimary" + android:textColor="?colorHeadings" android:textSize="16sp" android:visibility="gone" tools:visibility="visible" /> @@ -129,7 +128,7 @@ android:paddingEnd="16dp" android:text="@string/msg_continue_with_wordpress" android:textAllCaps="false" - android:textColor="@color/colorPrimary" + android:textColor="?colorHeadings" android:textSize="16sp" android:visibility="gone" tools:visibility="visible" /> @@ -153,16 +152,17 @@ android:background="@drawable/circle_background_grey" android:contentDescription="@string/msg_content_description_show_more_login_options" android:src="@drawable/ic_expand_more_black_24dp" - android:tint="@color/colorWhite" + android:tint="?android:colorBackground" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + @@ -131,7 +131,7 @@ android:layout_centerVertical="true" android:layout_marginEnd="8dp" android:src="@drawable/ic_chevron_right_black_24dp" - android:tint="@color/colorAuthenticationChevronAndExpandIcon" + android:tint="?colorAuthenticationButtonBorderAndDivider" tools:ignore="ContentDescription" /> diff --git a/app/src/main/res/layout/fragment_authentication_register_username.xml b/app/src/main/res/layout/fragment_authentication_register_username.xml index efadf08025..f0d31dae75 100644 --- a/app/src/main/res/layout/fragment_authentication_register_username.xml +++ b/app/src/main/res/layout/fragment_authentication_register_username.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="?android:colorBackground" android:padding="@dimen/screen_edge_left_and_right_margins" tools:context=".authentication.registerusername.ui.RegisterUsernameFragment"> @@ -22,6 +23,7 @@ android:hint="@string/msg_username" android:imeOptions="actionDone" android:inputType="text" + android:textColorHint="?colorTextHintEditText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/text_sign_in_to_your_server" /> @@ -30,7 +32,6 @@ android:id="@+id/button_use_this_username" style="@style/Authentication.Button" android:layout_marginTop="20dp" - android:backgroundTint="@color/colorAuthenticationButtonDisabled" android:enabled="false" android:text="@string/action_use_this_username" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_authentication_reset_password.xml b/app/src/main/res/layout/fragment_authentication_reset_password.xml index 11f24a1947..c6bdccea9a 100644 --- a/app/src/main/res/layout/fragment_authentication_reset_password.xml +++ b/app/src/main/res/layout/fragment_authentication_reset_password.xml @@ -22,6 +22,7 @@ android:hint="@string/msg_email" android:imeOptions="actionDone" android:inputType="textEmailAddress" + android:textColorHint="?colorTextHintEditText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/text_reset_password" /> @@ -30,7 +31,6 @@ android:id="@+id/button_reset_password" style="@style/Authentication.Button" android:layout_marginTop="20dp" - android:backgroundTint="@color/colorAuthenticationButtonDisabled" android:enabled="false" android:text="@string/title_reset_password" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_authentication_server.xml b/app/src/main/res/layout/fragment_authentication_server.xml index bf398e766c..77cf723388 100644 --- a/app/src/main/res/layout/fragment_authentication_server.xml +++ b/app/src/main/res/layout/fragment_authentication_server.xml @@ -4,7 +4,6 @@ android:id="@+id/scroll_view" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/colorWhite" android:padding="@dimen/screen_edge_left_and_right_margins" tools:context=".authentication.server.ui.ServerFragment"> @@ -46,7 +45,8 @@ android:id="@+id/spinner_server_protocol" android:layout_width="120dp" android:layout_height="match_parent" - android:popupBackground="@color/colorWhite" /> + android:backgroundTint="?colorDescriptiveText" + android:textColor="?colorPrimaryText" /> + android:inputType="text|textUri" + android:textColor="?colorPrimaryText" + android:textColorHint="?colorTextHintEditText" /> @@ -26,6 +25,7 @@ android:hint="@string/msg_name" android:imeOptions="actionNext" android:inputType="textCapWords" + android:textColorHint="?colorTextHintEditText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_sign_up" /> @@ -38,6 +38,7 @@ android:hint="@string/msg_username" android:imeOptions="actionNext" android:inputType="text" + android:textColorHint="?colorTextHintEditText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_name" /> @@ -50,6 +51,7 @@ android:hint="@string/msg_password" android:imeOptions="actionNext" android:inputType="textPassword" + android:textColorHint="?colorTextHintEditText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_username" /> @@ -62,6 +64,7 @@ android:hint="@string/msg_email" android:imeOptions="actionDone" android:inputType="textEmailAddress" + android:textColorHint="?colorTextHintEditText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_password" /> @@ -70,7 +73,6 @@ android:id="@+id/button_register" style="@style/Authentication.Button" android:layout_marginTop="20dp" - android:backgroundTint="@color/colorAuthenticationButtonDisabled" android:enabled="false" android:text="@string/action_register" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_authentication_two_fa.xml b/app/src/main/res/layout/fragment_authentication_two_fa.xml index bbfbbaad92..080d46404c 100644 --- a/app/src/main/res/layout/fragment_authentication_two_fa.xml +++ b/app/src/main/res/layout/fragment_authentication_two_fa.xml @@ -28,7 +28,6 @@ android:id="@+id/button_confirm" style="@style/Authentication.Button" android:layout_marginTop="20dp" - android:backgroundTint="@color/colorAuthenticationButtonDisabled" android:enabled="false" android:text="@string/action_confirm" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_chat_details.xml b/app/src/main/res/layout/fragment_chat_details.xml index 48a7aa460a..7cf4d1cc19 100644 --- a/app/src/main/res/layout/fragment_chat_details.xml +++ b/app/src/main/res/layout/fragment_chat_details.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/whitesmoke"> + > + tools:context=".chatroom.ui.ChatRoomFragment" + > @@ -78,8 +78,8 @@ android:id="@+id/suggestions_view" android:layout_width="0dp" android:layout_height="wrap_content" - android:background="@color/suggestion_background_color" - app:layout_constraintBottom_toTopOf="@id/layout_message_composer" + android:background="?android:colorBackground" + app:layout_constraintBottom_toTopOf="@id/layout_message_composer_container" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> @@ -93,17 +93,24 @@ android:layout_marginBottom="5dp" android:maxLines="2" android:visibility="gone" - app:layout_constraintBottom_toTopOf="@id/layout_message_composer" + app:layout_constraintBottom_toTopOf="@id/layout_message_composer_container" app:layout_constraintEnd_toStartOf="parent" /> - + app:layout_constraintStart_toStartOf="parent"> + + @@ -123,7 +130,7 @@ android:layout_height="wrap_content" android:layout_margin="5dp" android:visibility="gone" - app:layout_constraintBottom_toTopOf="@id/layout_message_composer" + app:layout_constraintBottom_toTopOf="@id/layout_message_composer_container" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> @@ -132,11 +139,11 @@ android:layout_width="0dp" android:layout_height="32dp" android:alpha="0" - android:background="@color/colorPrimary" + android:background="?colorPrimary" android:elevation="4dp" android:gravity="center" android:textAppearance="@style/TextAppearance.AppCompat.Body2" - android:textColor="@color/colorWhite" + android:textColor="?android:colorBackground" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -150,7 +157,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - app:indicatorColor="@color/colorBlack" + app:indicatorColor="?colorLoading" app:indicatorName="BallPulseIndicator" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_chat_rooms.xml b/app/src/main/res/layout/fragment_chat_rooms.xml index b9decc9cea..ca6d43a6b0 100644 --- a/app/src/main/res/layout/fragment_chat_rooms.xml +++ b/app/src/main/res/layout/fragment_chat_rooms.xml @@ -24,7 +24,7 @@ android:paddingEnd="16dp" android:paddingBottom="32dp" android:text="@string/msg_directory" - android:textColor="#0c0d0f" + android:textColor="?colorPrimaryText" android:textSize="17sp" android:textStyle="bold" android:visibility="gone" @@ -34,18 +34,11 @@ @@ -80,7 +73,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - app:indicatorColor="@color/colorBlack" + app:indicatorColor="?colorLoading" app:indicatorName="BallPulseIndicator" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_create_channel.xml b/app/src/main/res/layout/fragment_create_channel.xml index 7e7249e9e8..4b57032b1f 100644 --- a/app/src/main/res/layout/fragment_create_channel.xml +++ b/app/src/main/res/layout/fragment_create_channel.xml @@ -16,7 +16,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - app:indicatorColor="@color/colorBlack" + app:indicatorColor="?colorLoading" app:indicatorName="BallPulseIndicator" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -26,24 +26,22 @@ @@ -58,26 +56,22 @@ @@ -99,6 +93,7 @@ android:layout_marginStart="16dp" android:layout_marginTop="22dp" android:src="@drawable/ic_hashtag_black_12dp" + android:tint="?colorHeadings" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_read_only_description" /> @@ -108,12 +103,14 @@ android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" - android:backgroundTint="@color/colorDim" + android:backgroundTint="?attr/colorDim" android:hint="@string/msg_channel_name" android:inputType="text" android:maxLines="1" android:paddingStart="24dp" android:paddingEnd="10dp" + android:textColor="?colorPrimaryText" + android:textColorHint="?colorTextHintEditText" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="@+id/image_channel_icon" app:layout_constraintEnd_toEndOf="parent" @@ -127,6 +124,7 @@ android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:src="@drawable/ic_at_black_20dp" + android:tint="?colorHeadings" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_channel_name" /> @@ -136,12 +134,14 @@ android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" - android:backgroundTint="@color/colorDim" + android:backgroundTint="?attr/colorDim" android:hint="@string/msg_invite_members" android:inputType="text" android:maxLines="1" android:paddingStart="24dp" android:paddingEnd="10dp" + android:textColor="?colorPrimaryText" + android:textColorHint="?colorTextHintEditText" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="@+id/image_invite_member" app:layout_constraintEnd_toEndOf="parent" @@ -154,7 +154,7 @@ android:layout_height="100dp" android:layout_marginStart="12dp" android:layout_marginEnd="12dp" - android:background="@color/colorWhite" + android:background="?android:colorBackground" android:elevation="2dp" android:orientation="vertical" android:visibility="gone" @@ -177,7 +177,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - app:indicatorColor="@color/colorBlack" + app:indicatorColor="?colorLoading" app:indicatorName="BallPulseIndicator" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -189,6 +189,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/msg_member_not_found" + android:textColor="?colorPrimaryText" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_directory.xml b/app/src/main/res/layout/fragment_directory.xml index 7de8dd034a..4eb9e52c02 100644 --- a/app/src/main/res/layout/fragment_directory.xml +++ b/app/src/main/res/layout/fragment_directory.xml @@ -13,20 +13,13 @@ @@ -44,7 +37,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - app:indicatorColor="@color/colorBlack" + app:indicatorColor="?colorLoading" app:indicatorName="BallPulseIndicator" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/fragment_favorite_messages.xml b/app/src/main/res/layout/fragment_favorite_messages.xml index 510068e374..c1b1dcdc03 100644 --- a/app/src/main/res/layout/fragment_favorite_messages.xml +++ b/app/src/main/res/layout/fragment_favorite_messages.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="?android:colorBackground" tools:context=".favoritemessages.ui.FavoriteMessagesFragment"> + + + + android:inputType="textPassword" + android:textColorHint="?colorTextHintEditText" /> + android:inputType="textPassword" + android:textColorHint="?colorTextHintEditText" /> + android:inputType="textCapWords" + android:textColorHint="?colorTextHintEditText" /> + android:inputType="text" + android:textColorHint="?colorTextHintEditText" /> + android:inputType="textEmailAddress" + android:textColorHint="?colorTextHintEditText" /> @@ -93,7 +96,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" - app:indicatorColor="@color/colorBlack" + app:indicatorColor="?colorLoading" app:indicatorName="BallPulseIndicator" /> + //----------------------------------------------------------------- + + //-------------------------------------------------------------- + app:layout_constraintTop_toBottomOf="@+id/text_change_theme" /> diff --git a/app/src/main/res/layout/item_action_button.xml b/app/src/main/res/layout/item_action_button.xml index 62c470b24e..923d9c7dc5 100644 --- a/app/src/main/res/layout/item_action_button.xml +++ b/app/src/main/res/layout/item_action_button.xml @@ -3,11 +3,14 @@ xmlns:fresco="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:background="?android:colorBackground" android:orientation="horizontal"> @@ -42,7 +42,7 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:textAppearance="@style/TextAppearance.AppCompat.Body2" - android:textColor="@color/colorAccent" + android:textColor="?colorAccent" android:textDirection="locale" app:layout_constraintEnd_toEndOf="@id/title" app:layout_constraintStart_toEndOf="@id/quote_bar" diff --git a/app/src/main/res/layout/item_add_new_server.xml b/app/src/main/res/layout/item_add_new_server.xml index de8f1cf10b..267fea449c 100644 --- a/app/src/main/res/layout/item_add_new_server.xml +++ b/app/src/main/res/layout/item_add_new_server.xml @@ -3,7 +3,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?selectableItemBackground" android:orientation="vertical" android:padding="16dp"> @@ -16,7 +15,7 @@ android:fontFamily="sans-serif" android:gravity="center" android:text="@string/msg_add_new_server" - android:textColor="#9ea2a8" + android:textColor="?colorDescriptiveText" android:textSize="16sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/item_add_reaction.xml b/app/src/main/res/layout/item_add_reaction.xml index 18dedf3c37..8fb490fb14 100644 --- a/app/src/main/res/layout/item_add_reaction.xml +++ b/app/src/main/res/layout/item_add_reaction.xml @@ -8,4 +8,5 @@ android:paddingRight="4dp" android:paddingStart="4dp" android:paddingTop="2dp" + android:tint="?colorDescriptiveText" android:src="@drawable/ic_add_reaction" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_add_theme.xml b/app/src/main/res/layout/item_add_theme.xml new file mode 100644 index 0000000000..d4d0f56b79 --- /dev/null +++ b/app/src/main/res/layout/item_add_theme.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_alert_dialog_single_choice.xml b/app/src/main/res/layout/item_alert_dialog_single_choice.xml new file mode 100644 index 0000000000..079c9e5ed7 --- /dev/null +++ b/app/src/main/res/layout/item_alert_dialog_single_choice.xml @@ -0,0 +1,16 @@ + + diff --git a/app/src/main/res/layout/item_author_attachment.xml b/app/src/main/res/layout/item_author_attachment.xml index 18a4032c2a..a020772089 100644 --- a/app/src/main/res/layout/item_author_attachment.xml +++ b/app/src/main/res/layout/item_author_attachment.xml @@ -5,9 +5,9 @@ android:id="@+id/author_attachment_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?android:attr/selectableItemBackground" android:clickable="true" android:focusable="true" + android:background="?android:colorBackground" android:paddingBottom="@dimen/message_item_top_and_bottom_padding" android:paddingEnd="@dimen/screen_edge_left_and_right_padding" android:paddingStart="@dimen/screen_edge_left_and_right_padding" @@ -38,7 +38,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="4dp" - android:textColor="@color/colorAccent" + android:textColor="?colorAccent" android:textAppearance="@style/TextAppearance.AppCompat.Body2" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toEndOf="@id/author_icon" diff --git a/app/src/main/res/layout/item_chat.xml b/app/src/main/res/layout/item_chat.xml index 541fcf66c3..92fdc0115d 100644 --- a/app/src/main/res/layout/item_chat.xml +++ b/app/src/main/res/layout/item_chat.xml @@ -4,7 +4,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?android:attr/selectableItemBackground" android:paddingStart="@dimen/screen_edge_left_and_right_padding" android:paddingTop="@dimen/chat_item_top_and_bottom_padding" android:paddingEnd="@dimen/screen_edge_left_and_right_padding" diff --git a/app/src/main/res/layout/item_chatroom_header.xml b/app/src/main/res/layout/item_chatroom_header.xml index 3324ad081c..1b3d2f3f5e 100644 --- a/app/src/main/res/layout/item_chatroom_header.xml +++ b/app/src/main/res/layout/item_chatroom_header.xml @@ -1,6 +1,7 @@ diff --git a/app/src/main/res/layout/item_color_attachment.xml b/app/src/main/res/layout/item_color_attachment.xml index 5e400d771c..a1910eb82b 100644 --- a/app/src/main/res/layout/item_color_attachment.xml +++ b/app/src/main/res/layout/item_color_attachment.xml @@ -4,8 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/color_attachment_container" android:layout_width="match_parent" + android:background="?android:colorBackground" android:layout_height="wrap_content" - android:background="?android:attr/selectableItemBackground" android:clickable="true" android:focusable="true" android:paddingStart="@dimen/screen_edge_left_and_right_padding" @@ -30,6 +30,7 @@ android:layout_height="wrap_content" android:layout_marginStart="8dp" android:autoLink="web" + android:textColor="?colorAccent" android:textAppearance="@style/TextAppearance.AppCompat.Body1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/quote_bar" diff --git a/app/src/main/res/layout/item_custom_theme_row.xml b/app/src/main/res/layout/item_custom_theme_row.xml new file mode 100644 index 0000000000..982a4f13f7 --- /dev/null +++ b/app/src/main/res/layout/item_custom_theme_row.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_custom_themes_recycler.xml b/app/src/main/res/layout/item_custom_themes_recycler.xml new file mode 100644 index 0000000000..0d52b1583e --- /dev/null +++ b/app/src/main/res/layout/item_custom_themes_recycler.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_detail_option.xml b/app/src/main/res/layout/item_detail_option.xml index f549344859..9779302715 100644 --- a/app/src/main/res/layout/item_detail_option.xml +++ b/app/src/main/res/layout/item_detail_option.xml @@ -5,8 +5,8 @@ xmlns:tools="http://schemas.android.com/tools" android:clickable="true" android:focusable="true" - android:foreground="?android:attr/selectableItemBackground" android:padding="20dp"> + - + android:background="?colorDivider" /> + android:background="?colorDivider" /> @@ -162,7 +162,7 @@ android:id="@+id/button_join_video_call" android:layout_width="200dp" android:layout_height="wrap_content" - android:background="@color/colorAccent" + android:background="?colorAccent" android:text="@string/msg_join_video_call" android:visibility="gone" app:layout_constraintStart_toStartOf="@+id/text_content" diff --git a/app/src/main/res/layout/item_message_attachment.xml b/app/src/main/res/layout/item_message_attachment.xml index 0ffb5ca0d4..9ea61d5dca 100644 --- a/app/src/main/res/layout/item_message_attachment.xml +++ b/app/src/main/res/layout/item_message_attachment.xml @@ -7,7 +7,6 @@ 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" @@ -35,6 +34,7 @@ diff --git a/app/src/main/res/layout/item_reaction.xml b/app/src/main/res/layout/item_reaction.xml index cf3772d373..09431833c9 100644 --- a/app/src/main/res/layout/item_reaction.xml +++ b/app/src/main/res/layout/item_reaction.xml @@ -26,7 +26,7 @@ android:maxLines="1" android:paddingStart="4dp" android:paddingLeft="4dp" - android:textColor="@color/reaction_text" + android:textColor="?colorAccent" android:textSize="16sp" tools:text=":)" /> @@ -50,7 +50,7 @@ android:paddingEnd="4dp" android:paddingRight="4dp" android:paddingBottom="4dp" - android:textColor="@color/reaction_text" + android:textColor="?colorControlText" android:textSize="16sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/item_read_receipt.xml b/app/src/main/res/layout/item_read_receipt.xml index 6908f56234..0ed0bb64a3 100644 --- a/app/src/main/res/layout/item_read_receipt.xml +++ b/app/src/main/res/layout/item_read_receipt.xml @@ -8,6 +8,7 @@ @@ -25,7 +24,7 @@ android:layout_marginEnd="12dp" android:fontFamily="sans-serif-medium" android:maxLines="1" - android:textColor="#DE000000" + android:textColor="?colorHeadings" android:textSize="16sp" android:textStyle="normal" app:layout_constraintStart_toEndOf="@+id/image_server" @@ -40,7 +39,7 @@ android:layout_marginEnd="12dp" android:fontFamily="sans-serif" android:maxLines="1" - android:textColor="#99000000" + android:textColor="?colorDim" android:textSize="14sp" android:textStyle="normal" app:layout_constraintStart_toEndOf="@+id/image_server" diff --git a/app/src/main/res/layout/item_theme_info.xml b/app/src/main/res/layout/item_theme_info.xml new file mode 100644 index 0000000000..3dd992309b --- /dev/null +++ b/app/src/main/res/layout/item_theme_info.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_theme_row.xml b/app/src/main/res/layout/item_theme_row.xml new file mode 100644 index 0000000000..bf6c7fc18f --- /dev/null +++ b/app/src/main/res/layout/item_theme_row.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_theme_row_small.xml b/app/src/main/res/layout/item_theme_row_small.xml new file mode 100644 index 0000000000..47e86495dc --- /dev/null +++ b/app/src/main/res/layout/item_theme_row_small.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_themes_recycler.xml b/app/src/main/res/layout/item_themes_recycler.xml new file mode 100644 index 0000000000..f0226387ee --- /dev/null +++ b/app/src/main/res/layout/item_themes_recycler.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_toolbar.xml b/app/src/main/res/layout/layout_toolbar.xml index 1ce9943c67..a8e936314a 100644 --- a/app/src/main/res/layout/layout_toolbar.xml +++ b/app/src/main/res/layout/layout_toolbar.xml @@ -9,13 +9,12 @@ android:id="@+id/toolbar" android:layout_width="0dp" android:layout_height="@dimen/toolbar_height" - android:background="@color/colorPrimary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_scrollFlags="scroll|enterAlways" - app:popupTheme="@style/ThemeOverlay.AppCompat.Light" - app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> + style="@style/ChatRoom.ChatName.TextView" + > + android:theme="?appAccentStyle" + android:layout_height="wrap_content"> @@ -27,7 +28,7 @@ android:layout_marginBottom="8dp" android:ellipsize="end" android:maxLines="2" - android:textColor="@color/actionMenuColor" + android:textColor="?colorDescriptiveText" android:textSize="14sp" android:typeface="normal" app:layout_constraintBottom_toBottomOf="parent" @@ -57,7 +58,7 @@ android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" - android:textColor="@color/colorAccent" + android:textColor="?colorAccent" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/text_view_action_text" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/message_action_item.xml b/app/src/main/res/layout/message_action_item.xml index 3eb49a1fae..f48a7cfd79 100644 --- a/app/src/main/res/layout/message_action_item.xml +++ b/app/src/main/res/layout/message_action_item.xml @@ -4,7 +4,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?attr/selectableItemBackground" android:paddingStart="16dp" android:paddingTop="8dp" android:paddingEnd="16dp" @@ -32,6 +31,7 @@ android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" + android:textColor="?colorDescriptiveText" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/message_attachment.xml b/app/src/main/res/layout/message_attachment.xml index 49f5aaf68a..99c4dd591d 100644 --- a/app/src/main/res/layout/message_attachment.xml +++ b/app/src/main/res/layout/message_attachment.xml @@ -5,11 +5,9 @@ android:id="@+id/attachment_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?android:attr/selectableItemBackground" android:orientation="vertical" - android:paddingEnd="@dimen/screen_edge_left_and_right_margins" - android:paddingStart="72dp"> - + android:paddingStart="72dp" + android:paddingEnd="@dimen/screen_edge_left_and_right_margins"> @@ -51,6 +50,7 @@ android:id="@+id/file_text" android:layout_width="match_parent" android:layout_height="wrap_content" + android:textColor="?colorDim" tools:text="Some text" /> @@ -24,10 +23,10 @@ android:id="@+id/text_room_is_read_only" android:layout_width="0dp" android:layout_height="45dp" - android:background="@color/colorWhite" + android:background="?android:colorBackground" android:gravity="center" android:text="@string/msg_this_room_is_read_only" - android:textColor="@color/colorBlack" + android:textColor="?colorHeadings" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -37,9 +36,9 @@ android:id="@+id/button_join_chat" android:layout_width="match_parent" android:layout_height="45dp" - android:background="@color/colorWhite" + android:background="?android:colorBackground" android:text="@string/action_join_chat" - android:textColor="@color/colorAccent" + android:textColor="?colorAccent" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -81,7 +80,9 @@ android:lineSpacingExtra="4dp" android:maxLines="4" android:minHeight="24dp" - android:scrollbars="vertical" /> + android:scrollbars="vertical" + android:textColor="?colorHeadings" + android:textColorHint="?colorTextHintEditText" /> + android:layout_height="match_parent"> + android:theme="?appAccentStyle" + android:tint="?colorAccent" + android:visibility="invisible" + app:backgroundTint="?colorFloatingActionButtonBorder" + tools:visibility="visible" /> + app:layout_anchorGravity="end" + tools:text="1" + tools:visibility="visible" /> \ No newline at end of file diff --git a/app/src/main/res/layout/message_url_preview.xml b/app/src/main/res/layout/message_url_preview.xml index 8fe5454c16..6e60b883dc 100644 --- a/app/src/main/res/layout/message_url_preview.xml +++ b/app/src/main/res/layout/message_url_preview.xml @@ -5,7 +5,6 @@ android:id="@+id/url_preview_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?android:attr/selectableItemBackground" android:paddingStart="72dp" android:paddingEnd="24dp"> @@ -22,7 +21,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" - android:textColor="@color/colorSecondaryText" + android:textColor="?colorSecondaryText" android:textDirection="locale" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/image_preview" @@ -33,7 +32,7 @@ android:id="@+id/text_title" android:layout_width="0dp" android:layout_height="wrap_content" - android:textColor="@color/colorAccent" + android:textColor="?colorAccent" android:textDirection="locale" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/text_host" @@ -42,6 +41,7 @@ + \ No newline at end of file diff --git a/app/src/main/res/layout/suggestion_command_item.xml b/app/src/main/res/layout/suggestion_command_item.xml index 91668d96f2..30f9672b7e 100644 --- a/app/src/main/res/layout/suggestion_command_item.xml +++ b/app/src/main/res/layout/suggestion_command_item.xml @@ -5,7 +5,6 @@ android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:layout_marginTop="4dp" - android:background="@color/suggestion_background_color" android:orientation="horizontal" android:paddingTop="2dp"> @@ -18,7 +17,7 @@ android:layout_marginStart="8dp" android:ellipsize="end" android:maxLines="1" - android:textColor="@color/colorBlack" + android:textColor="?colorPrimaryText" android:textSize="14sp" tools:text="/leave" /> @@ -32,7 +31,7 @@ android:ellipsize="end" android:gravity="start" android:maxLines="1" - android:textColor="@color/actionMenuColor" + android:textColor="?colorDim" android:textSize="14sp" tools:text="Leave a channel" /> diff --git a/app/src/main/res/layout/suggestion_emoji_item.xml b/app/src/main/res/layout/suggestion_emoji_item.xml index 7bc93f57bf..dca463df9b 100644 --- a/app/src/main/res/layout/suggestion_emoji_item.xml +++ b/app/src/main/res/layout/suggestion_emoji_item.xml @@ -7,8 +7,7 @@ android:layout_marginStart="8dp" android:layout_marginTop="2dp" android:layout_marginEnd="2dp" - android:layout_marginBottom="2dp" - android:background="@color/suggestion_background_color"> + android:layout_marginBottom="2dp"> + android:layout_marginTop="2dp"> + android:layout_marginTop="2dp"> @@ -25,7 +24,7 @@ android:layout_toEndOf="@+id/text_name" android:maxLines="1" android:layout_marginStart="8dp" - android:textColor="@color/actionMenuColor" + android:textColor="?colorDim" android:textSize="16sp" tools:text="@tools:sample/full_names" /> diff --git a/app/src/main/res/layout/update_avatar_options.xml b/app/src/main/res/layout/update_avatar_options.xml index 2426e97a0c..bd2c58b42e 100644 --- a/app/src/main/res/layout/update_avatar_options.xml +++ b/app/src/main/res/layout/update_avatar_options.xml @@ -8,6 +8,7 @@ @@ -21,7 +20,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" - app:indicatorColor="@color/colorBlack" + app:indicatorColor="?colorLoading" app:indicatorName="BallPulseIndicator" /> \ No newline at end of file diff --git a/app/src/main/res/menu/chatrooms.xml b/app/src/main/res/menu/chatrooms.xml index cf415f2d1d..a19dd1fad3 100644 --- a/app/src/main/res/menu/chatrooms.xml +++ b/app/src/main/res/menu/chatrooms.xml @@ -12,6 +12,7 @@ android:id="@+id/action_search" android:icon="@drawable/ic_search_white_24dp" android:title="@string/action_search" + android:color="@color/color_white" app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="ifRoom|collapseActionView" /> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 18ad8487db..397c331096 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -15,6 +15,7 @@ الإعدادات تفضيلات تغيير كلمة السر + Change Theme قيمنا لوحة الإدارة تغيير كلمة السر @@ -63,6 +64,7 @@ اتصل بنا + Change Theme تغيير اللغة قيم هذا التطبيق شارك هذا التطبيق @@ -370,4 +372,12 @@ تأكيد *مطلوب تم إرسال تقريرك! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 81bd4024e9..4cd1275893 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -16,6 +16,7 @@ Einstellungen Eigenschaften Ändere Passwort + Change Theme Bewerten Sie uns Administrationsmenü Ändere Passwort @@ -41,7 +42,7 @@ Erstelle Abmelden Eine Datei anhängen - Bestätige Passwort-Änderung + Bestätige Passwort Änderung Trete Chat bei Online Abwesend @@ -63,6 +64,9 @@ Kontaktiere uns + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Sprache Bewerte diese App Teile diese App @@ -70,7 +74,7 @@ Lizenz Version: %1$s (%2$d) Serverversion: %1$s - Analysedaten senden + Analysesaten senden Anonyme Statistiken senden um diese App weiter zu verbessern KEINE anonymen Statistiken senden um diese App weiter zu verbessern Nicht anwendbar, da es sich um eine FOSS version handelt @@ -102,20 +106,20 @@ Keine Anzeigedaten vorhanden Schau dir das an Teilen Sie mit - Profil-Update erfolgreich + Profil update erfolgreich Benutzername Benutzername oder E-Mail Passwort Name - E-Mail + EMail Avatar URL Oder weiter mit einem Social Account Neuer Benutzer? %1$s Passwort vergessen? Zurücksetzen - E-Mail gesendet! Prüfe deinen E-Mail Posteingang, um dein Passwort zurückzusetzen. + E-Mail gesendet! Prüfe dein E-Mail Posteingang um dein Passwort zurückzusetzen. Bitte eine korrekte E-Mail Adresse eingeben - Beim Weitergehen akzeptieren Sie unsere\n%1$s und %2$s + Beim weitergehen akzeptieren Sie usere\n%1$s und %2$s Gestern Heute Nachricht @@ -124,7 +128,7 @@ Dieser Raum ist Read-Only Falscher 2FA Code Falsche Datei - Falsche Server-URL + Falsche Server URL Login mit Facebook Login mit GitHub Login mit Google @@ -135,10 +139,10 @@ Login mit WordPress Sende Nachricht Zeige mehr Login-Optionen - Zeige Anhang-Optionen + Zeige Anhang Optionen Du Unbekannt - E-Mail Addresse + E-Mail Address UTC Offset Neues Passwort eingeben Bestätige neues Passwort @@ -151,13 +155,13 @@ Datei Noch keine Nachrichten Build %1$d - %2$s - %3$s - Server-Version veraltet. Bitte kontaktieren Sie ihren Server-Administrator. - Die Server-Version scheint älter als die empfolene Version %1$s zu sein.\nSie können sich trotzdem einloggen, aber es kann zu einem unerwartetem Verhalten kommen. - Die Server-Version scheint älter als die minimale Version %1$s zu sein.\nBitte updaten Sie Ihren Server, um sich einloggen zu können! - Keine Chat-Nachrichten - Starte die Konversation, um Ihre \nNachrichten hier zu sehen. - Bei HTTP verbinden Sie sich unsicher zu einem Server. Wir empfehlen, HTTPS zu benutzen. - Ein Fehler ist aufgetreten beim Prüfen der Server-Version, bitte versuchen Sie es noch einmal + Server Version veraltet. Bitte kontaktieren Sie ihren Server Administrator. + Die Server Version scheint älter als die empfolene Version %1$s zu sein.\nSie können sich trotzdem einloggen, aber es kann zu einem unerwartetem Verhalten kommen. + Die Server Version scheint älter als die minimale Version %1$s zu sein.\nBitte updaten Sie Ihren Server um sich einloggen zu können! + Keine Chat Nachrichten + Starte die Konversation um Ihre \nNachrichten hier zu sehen. + Bei HTTP verbinden Sie sich usicher zu einem Server. Wir empfehlen HTTPS zu benutzen. + Ein Fehler ist aufgetreten beim prüfen der Server Version, bitte versuchen Sie es noch einmal Das ausgewählte Protokoll wird vom Server nicht akzeptiert, versuchen Sie HTTPS Bild wurde in der Galerie gespeichert Bild speichern fehlgeschlagen @@ -169,7 +173,7 @@ Kein Ergebnis gefunden Ausloggen… Lade Datei hoch - Datei-Beschreibung + Datei Beschreibung Sende Sende Anhang @@ -224,7 +228,7 @@ Android App-Unterstützung - Raum-Namen geändert zu: %1$s von %2$s + Raum Namen geändert zu: %1$s von %2$s Benutzer %1$s hinzugefügt von %2$s Benutzer %1$s entfernt von %2$s Hat den Raum verlassen. @@ -328,7 +332,7 @@ Keine letzten Emojis - Standard-Hautton + Standard Hautton Sortiert nach %1$s @@ -368,4 +372,11 @@ *erforderlich Ihr Bericht wurde gesendet! + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 4af1545fac..eb6d7b3479 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -15,6 +15,7 @@ Configuraciones Preferences Cambia la contraseña + Change Theme Nos califica Admin panel Cambia la contraseña @@ -63,6 +64,9 @@ Contact us + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Language Review this app Share this app @@ -370,4 +374,12 @@ Submit *required Your report has been sent! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 18b5fa93ac..0d01d005c6 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -15,6 +15,7 @@ تنظیمات ترجیحات تغییر گذرواژه + Change Theme به ما امتیاز دهید Admin panel تغییر گذرواژه @@ -63,6 +64,9 @@ Contact us + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Language Review this app Share this app @@ -369,4 +373,12 @@ واگذاری *required گزارش شما فرستاده شد + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 80c5c17dec..a4881e2dd3 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -16,6 +16,7 @@ Préférences Langues Changer le mot de passe + Change Theme Evaluez nous Administration Changer le mot de passe @@ -63,6 +64,7 @@ Nous contacter + Change Theme Langue Notez cette application Partagez cette application @@ -369,4 +371,12 @@ Soumettre *Obligatoire Votre rapport a été envoyé! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index 3482506468..181a4488b9 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -15,6 +15,7 @@ सेटिंग्स प्राथमिकताएँ पासवर्ड बदलें + Change Theme हमें रेटिंग दें एडमिन पैनल पासवर्ड बदलें @@ -63,6 +64,9 @@ Contact us + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Language Review this app Share this app @@ -371,4 +375,12 @@ जमा करें * आवश्यक आपकी रिपोर्ट भेज दी गई है! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index dcc85c736c..ed8b4550fc 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -15,6 +15,7 @@ Parametri Preferenze Cambiare Password + Change Theme Valutaci Pannello di Amministrazione Password @@ -63,6 +64,9 @@ Contact us + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Language Review this app Share this app @@ -366,4 +370,12 @@ Invia *necessario Il tuo resoconto è stato inviato! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 880d9fba48..1eefd52651 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -15,6 +15,7 @@ 設定 環境設定 パスワードの変更 + Change Theme 私たちを評価してください 管理パネル パスワードの変更 @@ -63,6 +64,9 @@ Contact us + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Language Review this app Share this app @@ -370,4 +374,12 @@ Submit *required Your report has been sent! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 5ed0bb0dcd..2fc942010b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -15,6 +15,7 @@ Configurações Preferencias Alterar senha + Change Theme nos avalie Choose Language Painel administrativo @@ -63,6 +64,9 @@ Contact us + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Language Review this app Share this app @@ -370,4 +374,12 @@ Enviar *obrigatório A mensagem foi reportada! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 9ff0bea9be..902e3305f2 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -15,6 +15,7 @@ Definições Preferências Alterar palavra-passe + Change Theme Avalie-nos Choose Language Painel de Administração @@ -62,6 +63,9 @@ Contact us + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Language Review this app Share this app @@ -367,4 +371,12 @@ Enviar *requerido O seu relatório foi enviado! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index c6d739df4c..1668a790f4 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -15,6 +15,7 @@ Настройки Персональные Изменить пароль + Change Theme оцените нас Панель админа Изменить пароль @@ -63,6 +64,9 @@ Связаться с нами + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Изменить язык Оставить отзыв Поделиться приложением @@ -367,4 +371,12 @@ Отправить *требуется Ваша жалоба была отправлена! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 5d689a7940..04ce766b61 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -15,6 +15,7 @@ Ayarlar Tercihler Şifre Değişikliği + Change Theme Bizi değerlendirin Yönetici Paneli Şifrenizi Değiştirin @@ -63,6 +64,9 @@ Contact us + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Language Review this app Share this app @@ -370,4 +374,12 @@ Submit *required Your report has been sent! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 294a6eb8a1..3370d09d7c 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -15,6 +15,7 @@ Налаштування Персональні Змінити пароль + Change Theme Оцініть нас Панель адміністратора Змінити пароль @@ -63,6 +64,9 @@ Contact us + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Language Review this app Share this app @@ -367,4 +371,12 @@ Submit *required Your report has been sent! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9dc7b0fa28..fa2a23eb59 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -15,6 +15,7 @@ 设置 首选项 修改密码 + Change Theme 给我们打分 管理面板 修改密码 @@ -63,6 +64,9 @@ Contact us + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Language Review this app Share this app @@ -366,4 +370,12 @@ 提交 *必须 您的报告已提交! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e7ad15bbe3..cb25488dab 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -15,6 +15,7 @@ 設定 選項 修改密碼 + Change Theme 給我們評價 管理面板 修改密碼 @@ -62,6 +63,9 @@ Contact us + //-------------------------------------------------------------------------------------------- + Change Theme + //-------------------------------------------------------------------------------------------- Language Review this app Share this app @@ -346,4 +350,12 @@ 提交 *必須輸入 您的報告已經提交! + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml new file mode 100644 index 0000000000..d4d09b60aa --- /dev/null +++ b/app/src/main/res/values/attrs.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml new file mode 100644 index 0000000000..08d25f7dba --- /dev/null +++ b/app/src/main/res/values/bools.xml @@ -0,0 +1,4 @@ + + + false + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index cf64225425..b0aeac89c9 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,15 +6,28 @@ #FF2F343D #FF1D74F5 + + #1F000000 + @color/colorPrimary + #77000000 + #f3f4f5 + #54585e + + @color/colorWhite + #FBFBFB + #99000000 + #A0A0A0 + #DE000000 #FF787878 - #FFC1C1C1 - #FF9DA2A9 + #88000000 #FF5699FF - #99000000 - #FF0C0D0F - #8B000000 + #FF0C0D0F + #99000000 + #FFCBCED1 + #88000000 + #54585e #2FE1A8 @@ -26,46 +39,184 @@ #FFFFFFFF #FF000000 #FFFF0000 + #FFf1f1f1 - #FFE1E5E8 - #FFE1E5E8 - #FFCBCED1 - #FF9EA2A8 - - #FFa0a0a0 - #FF727272 - #FFf1f1f1 - - @color/colorWhite - - #9FA2A8 - - #D8D8D8 - - #FBFBFB - - #99000000 - - #4D000000 - - #70F1F1F1 - - #FF767676 - - #A0A0A0 - - #1F000000 - - #F4F5F7 + #22000000 + #22000000 + #22000000 + #66000000 + #88ffffff + #FF9CA2A8 + #FFCBCED1 - @color/colorWhite - - #AFADAF + #AFADAF - #FAFAFA - - #868585 + @color/colorWhite + #f1f2f4 + #ffffff + #e1e5e8 + @color/colorWhite + @color/colorWhite + + #0a4469 + + + @color/colorAccent + @color/colorPrimaryText + @color/colorPrimary + @color/colorDescriptiveText + @color/colorBackground + + + #607D8B + #40A4C4 + #FF009688 + #805BC4 + #7c4dff + #FFCDDC39 + #FFFFC107 + #eb3434 + #D75344 + #FC8A10 + #FF5722 + #EB9772 + #B56969 + #DFA2C1 + #FF9E9E9E + #BCABA4 + #8B2D2D + #FF795548 + #A45838 + + + + Default + BlueGrey + Blue + Teal + Purple + DeepPurple + Lime + Amber + Red + Coral + Orange + DeepOrange + Peach + TeaPink + PastelPink + Grey + Wheat + BurntUmber + Brown + Coconut + + + + #368CA7 + #40A4C4 + #562B22 + #4A251C + #FFB901 + #D89D01 + #273238 + #212A2F + #0359AE + #024A92 + #6D4D42 + #5C3F37 + #729F98 + #608782 + #00704A + #005F3F + #003E19 + #013415 + #000000 + @color/darkColorPrimary + #526A76 + #84282D + #712227 + #6B4DA5 + #9F908B + #9E8AAD + #C78060 + + + Default + Black + DarkBlue + GunMetal + Blue + CobaltBlue + Purple + Lilac + Peach + BlueGrey + FadedTeal + BottleGreen + ForestGreen + Gold + Taupe + Chocolate + Wheat + BrickRed + + + + + Default + Black + DarkBlue + GunMetal + Blue + CobaltBlue + Purple + Lilac + Peach + BlueGrey + FadedTeal + BottleGreen + ForestGreen + Gold + Taupe + Chocolate + Wheat + BrickRed + + + + #FAFAFA + + #FDE5D7 + #FDDCC9 + #F9EFE9 + #41464E + #F8BE9C + #E89768 + + #EEDFD8 + #D9CBC5 + #A89790 + + #F1E7F9 + #ECDEF8 + #BAA3CC + #DFD5E7 + + #E8F8F0 + #DCF2EC + #A3D1C9 + #D5EAE6 + + + Default + Snow + Almond + Mint + Lavender + LightPeach + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 4c1b7c16b0..a542f31784 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -48,4 +48,10 @@ 32dp + + 20dp + 25dp + 20dp + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4fc8fcf9e7..815467ee2f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,6 +27,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Settings Preferences Change Password + Change Theme Rate Us Admin panel Change Password @@ -75,6 +76,9 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Contact us + //------------------------------------------------- + Change Theme + //------------------------------------------------ Language Review this app Share this app @@ -398,4 +402,15 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin Submit *required Your report has been sent! + + + Hello blank fragment + + + Last Changed %s + Revert to Default + Create Custom Theme + App Themes + Custom Themes + Add Theme \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 22e9fd87ef..b77f60ae9c 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,18 +1,4 @@ - - - - @@ -29,7 +15,7 @@ wrap_content 16sp sans-serif - #FF54585E + ?colorControlText normal @@ -37,7 +23,7 @@ 17sp sans-serif bold - @color/colorAccent + ?colorAccent 1 end @@ -50,7 +36,7 @@ 15sp sans-serif normal - @color/colorAuthenticationSecondaryText + ?colorDescriptiveText 1 end @@ -59,7 +45,7 @@ 17sp sans-serif normal - @color/colorAuthenticationSecondaryText + ?colorDescriptiveText @@ -82,26 +67,28 @@ 18sp sans-serif-medium normal - @color/colorWhite + ?android:colorBackground false @drawable/rounded_color_accent + ?colorButtonDisabled // REMARK: To be removed as soon as we have our loading view. + @@ -111,7 +98,7 @@ 16sp sans-serif-medium normal - @color/colorPrimary + ?colorPrimaryText end 1 @@ -119,32 +106,34 @@ + + + + + + + + + // REMARK: To be removed. + @@ -281,4 +308,269 @@ @drawable/ic_close_white_24dp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000000..4e79b18ee4 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index fd0c37ffa6..7bf10dfe9f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':player', ':emoji', ':draw', ':util', ':core', ':suggestions' \ No newline at end of file +include ':app', ':player', ':emoji', ':draw', ':util', ':core', ':suggestions', ':themelibrary' \ No newline at end of file diff --git a/themelibrary/.gitignore b/themelibrary/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/themelibrary/.gitignore @@ -0,0 +1 @@ +/build diff --git a/themelibrary/build.gradle b/themelibrary/build.gradle new file mode 100644 index 0000000000..f770da66f8 --- /dev/null +++ b/themelibrary/build.gradle @@ -0,0 +1,36 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 28 + + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation 'androidx.appcompat:appcompat:1.0.2' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21" +} diff --git a/themelibrary/proguard-rules.pro b/themelibrary/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/themelibrary/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/themelibrary/src/androidTest/java/com/example/nbamir/themelibrary/ExampleInstrumentedTest.java b/themelibrary/src/androidTest/java/com/example/nbamir/themelibrary/ExampleInstrumentedTest.java new file mode 100644 index 0000000000..5521a14b6d --- /dev/null +++ b/themelibrary/src/androidTest/java/com/example/nbamir/themelibrary/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.example.nbamir.themelibrary; + +import android.content.Context; + +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.example.nbamir.themelibrary.test", appContext.getPackageName()); + } +} diff --git a/themelibrary/src/main/AndroidManifest.xml b/themelibrary/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..1444cb9d17 --- /dev/null +++ b/themelibrary/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/themelibrary/src/main/res/values/attrs.xml b/themelibrary/src/main/res/values/attrs.xml new file mode 100644 index 0000000000..9709c39e82 --- /dev/null +++ b/themelibrary/src/main/res/values/attrs.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themelibrary/src/main/res/values/bools.xml b/themelibrary/src/main/res/values/bools.xml new file mode 100644 index 0000000000..ca71f2e17b --- /dev/null +++ b/themelibrary/src/main/res/values/bools.xml @@ -0,0 +1,5 @@ + + + true + true + \ No newline at end of file diff --git a/themelibrary/src/main/res/values/colors.xml b/themelibrary/src/main/res/values/colors.xml new file mode 100644 index 0000000000..d8d6f1db4f --- /dev/null +++ b/themelibrary/src/main/res/values/colors.xml @@ -0,0 +1,151 @@ + + + + #FFe8ebed + + #0b182c + #0b182c + #0b182c + #0b182c + + #071223 + + #77ffffff + #77FFFFFF + #77ffffff + #77ffffff + #77ffffff + #77ffffff + #77ffffff + + #33FFFFFF + #33FFFFFF + #33FFFFFF + #33FFFFFF + + #ffffff + #ffffff + #ffffff + #ffffff + + #99FFFFFF + #99FFFFFF + + #1a2232 + #1a2232 + + #0e1f38 + #0e1f38 + + #22FFFFFF + #22FFFFFF + + #1d74f5 + + #030c1b + + #99ffffff + #99ffffff + + #07101e + #cdcdcd + + + #FFe8ebed + + #FF0e0d0d + #FF0e0d0d + #FF0e0d0d + #FF0e0d0d + + #FF191717 + + #77ffffff + #77FFFFFF + #77ffffff + #77ffffff + #77ffffff + #77ffffff + #77ffffff + + #33FFFFFF + #33FFFFFF + #33FFFFFF + #33FFFFFF + #33FFFFFF + + #FFFAFAFA + #FFFAFAFA + #FFFAFAFA + #FFFAFAFA + + #99FFFFFF + + #17181a + #17181a + + #1f2329 + #1f2329 + + #22FFFFFF + + #1d74f5 + + #000000 + + #99ffffff + #99ffffff + + #090909 + + #cdcdcd + + #FFb2b8c6 + true + + + + @color/darkColorAccent + @color/darkColorPrimaryText + @color/darkColorPrimary + @color/darkColorDescriptiveText + @color/darkColorBackground + + + + @color/blackColorAccent + @color/blackColorPrimaryText + @color/blackColorPrimary + @color/blackColorDescriptiveText + @color/blackColorBackground + + + + #000000 + + #1A1A1A + #1E1E1E + #C0C0C0 + + #142022 + #182628 + #545C5E + + #131901 + #21231A + #686C5D + + #19071D + #2E123B + #27172B + + + Default + Charcoal + DarkBlue + Jet + DarkJungle + EerieGreen + Plum + + \ No newline at end of file diff --git a/themelibrary/src/main/res/values/strings.xml b/themelibrary/src/main/res/values/strings.xml new file mode 100644 index 0000000000..645a4b91ba --- /dev/null +++ b/themelibrary/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + ThemeLibrary + diff --git a/themelibrary/src/main/res/values/styles.xml b/themelibrary/src/main/res/values/styles.xml new file mode 100644 index 0000000000..5dd084943f --- /dev/null +++ b/themelibrary/src/main/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + + \ No newline at end of file diff --git a/themelibrary/src/main/res/values/themes.xml b/themelibrary/src/main/res/values/themes.xml new file mode 100644 index 0000000000..f43e7ad199 --- /dev/null +++ b/themelibrary/src/main/res/values/themes.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themelibrary/src/test/java/com/example/nbamir/themelibrary/ExampleUnitTest.java b/themelibrary/src/test/java/com/example/nbamir/themelibrary/ExampleUnitTest.java new file mode 100644 index 0000000000..0dd540c195 --- /dev/null +++ b/themelibrary/src/test/java/com/example/nbamir/themelibrary/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.example.nbamir.themelibrary; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file