Color list headers

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
This commit is contained in:
Álvaro Brey 2022-07-21 13:45:07 +02:00 committed by Andy Scherzinger
parent a8e99862f1
commit 5ec18780ff
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B
9 changed files with 49 additions and 26 deletions

View File

@ -27,6 +27,7 @@ import android.view.View;
import com.nextcloud.talk.R; import com.nextcloud.talk.R;
import com.nextcloud.talk.databinding.RvItemTitleHeaderBinding; import com.nextcloud.talk.databinding.RvItemTitleHeaderBinding;
import com.nextcloud.talk.ui.theme.ViewThemeUtils;
import java.util.List; import java.util.List;
@ -39,12 +40,14 @@ public class GenericTextHeaderItem extends AbstractHeaderItem<GenericTextHeaderI
private static final String TAG = "GenericTextHeaderItem"; private static final String TAG = "GenericTextHeaderItem";
private final String title; private final String title;
private final ViewThemeUtils viewThemeUtils;
public GenericTextHeaderItem(String title) { public GenericTextHeaderItem(String title, ViewThemeUtils viewThemeUtils) {
super(); super();
setHidden(false); setHidden(false);
setSelectable(false); setSelectable(false);
this.title = title; this.title = title;
this.viewThemeUtils = viewThemeUtils;
} }
public String getModel() { public String getModel() {
@ -71,6 +74,7 @@ public class GenericTextHeaderItem extends AbstractHeaderItem<GenericTextHeaderI
Log.d(TAG, "We have payloads, so ignoring!"); Log.d(TAG, "We have payloads, so ignoring!");
} else { } else {
holder.binding.titleTextView.setText(title); holder.binding.titleTextView.setText(title);
viewThemeUtils.colorTextView(holder.binding.titleTextView);
} }
} }

View File

@ -30,6 +30,7 @@ import com.nextcloud.talk.R
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.RvItemSearchMessageBinding import com.nextcloud.talk.databinding.RvItemSearchMessageBinding
import com.nextcloud.talk.models.domain.SearchMessageEntry import com.nextcloud.talk.models.domain.SearchMessageEntry
import com.nextcloud.talk.ui.theme.ViewThemeUtils
import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.DisplayUtils
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
@ -42,7 +43,8 @@ data class MessageResultItem constructor(
private val context: Context, private val context: Context,
private val currentUser: User, private val currentUser: User,
val messageEntry: SearchMessageEntry, val messageEntry: SearchMessageEntry,
private val showHeader: Boolean = false private val showHeader: Boolean = false,
private val viewThemeUtils: ViewThemeUtils
) : ) :
AbstractFlexibleItem<MessageResultItem.ViewHolder>(), AbstractFlexibleItem<MessageResultItem.ViewHolder>(),
IFilterable<String>, IFilterable<String>,
@ -104,7 +106,7 @@ data class MessageResultItem constructor(
const val VIEW_TYPE: Int = R.layout.rv_item_search_message const val VIEW_TYPE: Int = R.layout.rv_item_search_message
} }
override fun getHeader(): GenericTextHeaderItem = MessagesTextHeaderItem(context) override fun getHeader(): GenericTextHeaderItem = MessagesTextHeaderItem(context, viewThemeUtils)
.apply { .apply {
isHidden = showHeader // FlexibleAdapter needs this hack for some reason isHidden = showHeader // FlexibleAdapter needs this hack for some reason
} }

View File

@ -23,8 +23,10 @@ package com.nextcloud.talk.adapters.items
import android.content.Context import android.content.Context
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.ui.theme.ViewThemeUtils
class MessagesTextHeaderItem(context: Context) : GenericTextHeaderItem(context.getString(R.string.messages)) { class MessagesTextHeaderItem(context: Context, viewThemeUtils: ViewThemeUtils) :
GenericTextHeaderItem(context.getString(R.string.messages), viewThemeUtils) {
companion object { companion object {
/** /**
* "Random" value, just has to be different than other view types * "Random" value, just has to be different than other view types

View File

@ -65,6 +65,7 @@ import com.nextcloud.talk.models.json.converters.EnumActorTypeConverter
import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.models.json.participants.Participant
import com.nextcloud.talk.ui.dialog.ContactsBottomDialog import com.nextcloud.talk.ui.dialog.ContactsBottomDialog
import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.users.UserManager
import com.nextcloud.talk.ui.theme.ViewThemeUtils
import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.ConductorRemapping import com.nextcloud.talk.utils.ConductorRemapping
import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.bundle.BundleKeys
@ -103,6 +104,9 @@ class ContactsController(args: Bundle) :
@Inject @Inject
lateinit var ncApi: NcApi lateinit var ncApi: NcApi
@Inject
lateinit var viewThemeUtils: ViewThemeUtils
private var credentials: String? = null private var credentials: String? = null
private var currentUser: User? = null private var currentUser: User? = null
private var contactsQueryDisposable: Disposable? = null private var contactsQueryDisposable: Disposable? = null
@ -492,7 +496,7 @@ class ContactsController(args: Bundle) :
val headerTitle = getHeaderTitle(participant) val headerTitle = getHeaderTitle(participant)
var genericTextHeaderItem: GenericTextHeaderItem var genericTextHeaderItem: GenericTextHeaderItem
if (!userHeaderItems.containsKey(headerTitle)) { if (!userHeaderItems.containsKey(headerTitle)) {
genericTextHeaderItem = GenericTextHeaderItem(headerTitle) genericTextHeaderItem = GenericTextHeaderItem(headerTitle, viewThemeUtils)
userHeaderItems.put(headerTitle, genericTextHeaderItem) userHeaderItems.put(headerTitle, genericTextHeaderItem)
} }
val newContactItem = ContactItem( val newContactItem = ContactItem(

View File

@ -92,8 +92,6 @@ import com.nextcloud.talk.models.json.statuses.StatusesOverall;
import com.nextcloud.talk.repositories.unifiedsearch.UnifiedSearchRepository; import com.nextcloud.talk.repositories.unifiedsearch.UnifiedSearchRepository;
import com.nextcloud.talk.ui.dialog.ChooseAccountDialogFragment; import com.nextcloud.talk.ui.dialog.ChooseAccountDialogFragment;
import com.nextcloud.talk.ui.dialog.ConversationsListBottomDialog; import com.nextcloud.talk.ui.dialog.ConversationsListBottomDialog;
import com.nextcloud.talk.ui.theme.ServerTheme;
import com.nextcloud.talk.ui.theme.ServerThemeProvider;
import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.ui.theme.ViewThemeUtils;
import com.nextcloud.talk.users.UserManager; import com.nextcloud.talk.users.UserManager;
import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.ApiUtils;
@ -185,7 +183,7 @@ public class ConversationsListController extends BaseController implements Flexi
UnifiedSearchRepository unifiedSearchRepository; UnifiedSearchRepository unifiedSearchRepository;
@Inject @Inject
ServerTheme serverTheme; ViewThemeUtils viewThemeUtils;
@BindView(R.id.recycler_view) @BindView(R.id.recycler_view)
RecyclerView recyclerView; RecyclerView recyclerView;
@ -624,7 +622,7 @@ public class ConversationsListController extends BaseController implements Flexi
GenericTextHeaderItem genericTextHeaderItem; GenericTextHeaderItem genericTextHeaderItem;
if (!callHeaderItems.containsKey(headerTitle)) { if (!callHeaderItems.containsKey(headerTitle)) {
genericTextHeaderItem = new GenericTextHeaderItem(headerTitle); genericTextHeaderItem = new GenericTextHeaderItem(headerTitle, viewThemeUtils);
callHeaderItems.put(headerTitle, genericTextHeaderItem); callHeaderItems.put(headerTitle, genericTextHeaderItem);
} }
@ -705,7 +703,7 @@ public class ConversationsListController extends BaseController implements Flexi
GenericTextHeaderItem genericTextHeaderItem; GenericTextHeaderItem genericTextHeaderItem;
if (!callHeaderItems.containsKey(headerTitle)) { if (!callHeaderItems.containsKey(headerTitle)) {
genericTextHeaderItem = new GenericTextHeaderItem(headerTitle); genericTextHeaderItem = new GenericTextHeaderItem(headerTitle, viewThemeUtils);
callHeaderItems.put(headerTitle, genericTextHeaderItem); callHeaderItems.put(headerTitle, genericTextHeaderItem);
} }
@ -790,7 +788,8 @@ public class ConversationsListController extends BaseController implements Flexi
ContactAddressBookWorker.Companion.run(context); ContactAddressBookWorker.Companion.run(context);
showNewConversationsScreen(); showNewConversationsScreen();
}); });
new ViewThemeUtils(serverTheme).themeFAB(floatingActionButton);
viewThemeUtils.themeFAB(floatingActionButton);
if (getActivity() != null && getActivity() instanceof MainActivity) { if (getActivity() != null && getActivity() instanceof MainActivity) {
MainActivity activity = (MainActivity) getActivity(); MainActivity activity = (MainActivity) getActivity();
@ -1416,7 +1415,7 @@ public class ConversationsListController extends BaseController implements Flexi
List<AbstractFlexibleItem> adapterItems = new ArrayList<>(entries.size() + 1); List<AbstractFlexibleItem> adapterItems = new ArrayList<>(entries.size() + 1);
for (int i = 0; i < entries.size(); i++) { for (int i = 0; i < entries.size(); i++) {
final boolean showHeader = i == 0; final boolean showHeader = i == 0;
adapterItems.add(new MessageResultItem(context, currentUser, entries.get(i), showHeader)); adapterItems.add(new MessageResultItem(context, currentUser, entries.get(i), showHeader, viewThemeUtils));
} }
if (results.getHasMore()) { if (results.getHasMore()) {
adapterItems.add(LoadMoreResultsItem.INSTANCE); adapterItems.add(LoadMoreResultsItem.INSTANCE);

View File

@ -41,6 +41,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.controllers.ConversationsListController import com.nextcloud.talk.controllers.ConversationsListController
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.ActivityMessageSearchBinding import com.nextcloud.talk.databinding.ActivityMessageSearchBinding
import com.nextcloud.talk.ui.theme.ViewThemeUtils
import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.DisplayUtils
import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.bundle.BundleKeys
import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
@ -64,6 +65,9 @@ class MessageSearchActivity : BaseActivity() {
@Inject @Inject
lateinit var userProvider: CurrentUserProviderNew lateinit var userProvider: CurrentUserProviderNew
@Inject
lateinit var viewThemeUtils: ViewThemeUtils
private lateinit var binding: ActivityMessageSearchBinding private lateinit var binding: ActivityMessageSearchBinding
private lateinit var searchView: SearchView private lateinit var searchView: SearchView
@ -105,7 +109,9 @@ class MessageSearchActivity : BaseActivity() {
DisplayUtils.applyColorToStatusBar( DisplayUtils.applyColorToStatusBar(
this, this,
ResourcesCompat.getColor( ResourcesCompat.getColor(
resources, R.color.appbar, null resources,
R.color.appbar,
null
) )
) )
DisplayUtils.applyColorToNavigationBar( DisplayUtils.applyColorToNavigationBar(
@ -154,7 +160,7 @@ class MessageSearchActivity : BaseActivity() {
emptyList() emptyList()
} }
val newItems = val newItems =
state.results.map { MessageResultItem(this, user, it) } + loadMoreItems state.results.map { MessageResultItem(this, user, it, false, viewThemeUtils) } + loadMoreItems
if (adapter != null) { if (adapter != null) {
adapter!!.updateDataSet(newItems) adapter!!.updateDataSet(newItems)

View File

@ -26,9 +26,10 @@ import android.content.Context
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.models.json.capabilities.Capabilities import com.nextcloud.talk.models.json.capabilities.Capabilities
import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
import javax.inject.Inject
// TODO cache theme, keyed by server url // TODO cache theme, keyed by server url
internal class ServerThemeProviderImpl( internal class ServerThemeProviderImpl @Inject constructor(
private val context: Context, private val context: Context,
private val userProvider: CurrentUserProviderNew private val userProvider: CurrentUserProviderNew
) : ) :

View File

@ -21,25 +21,24 @@
package com.nextcloud.talk.ui.theme package com.nextcloud.talk.ui.theme
import android.content.Context
import com.nextcloud.talk.dagger.modules.ContextModule import com.nextcloud.talk.dagger.modules.ContextModule
import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
import com.nextcloud.talk.utils.database.user.UserModule import com.nextcloud.talk.utils.database.user.UserModule
import dagger.Binds
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.Reusable import dagger.Reusable
@Module(includes = [ContextModule::class, UserModule::class]) @Module(includes = [ContextModule::class, UserModule::class])
class ThemeModule { internal abstract class ThemeModule {
@Provides @Binds
@Reusable @Reusable
fun provideServerThemeProvider(context: Context, userProvider: CurrentUserProviderNew): ServerThemeProvider { abstract fun bindServerThemeProvider(provider: ServerThemeProviderImpl): ServerThemeProvider
return ServerThemeProviderImpl(context, userProvider)
}
@Provides companion object {
fun provideCurrentServerTheme(themeProvider: ServerThemeProvider): ServerTheme { @Provides
return themeProvider.getServerThemeForCurrentUser() fun provideCurrentServerTheme(themeProvider: ServerThemeProvider): ServerTheme {
return themeProvider.getServerThemeForCurrentUser()
}
} }
} }

View File

@ -24,9 +24,11 @@ package com.nextcloud.talk.ui.theme
import android.content.Context import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.content.res.Configuration import android.content.res.Configuration
import android.widget.TextView
import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
import javax.inject.Inject
class ViewThemeUtils(val theme: ServerTheme) { class ViewThemeUtils @Inject constructor(val theme: ServerTheme) {
private fun isDarkMode(context: Context): Boolean = when ( private fun isDarkMode(context: Context): Boolean = when (
context.resources.configuration.uiMode and context.resources.configuration.uiMode and
@ -45,4 +47,8 @@ class ViewThemeUtils(val theme: ServerTheme) {
fab.backgroundTintList = ColorStateList.valueOf(getElementColor(fab.context)) fab.backgroundTintList = ColorStateList.valueOf(getElementColor(fab.context))
fab.imageTintList = ColorStateList.valueOf(theme.colorText) fab.imageTintList = ColorStateList.valueOf(theme.colorText)
} }
fun colorTextView(titleTextView: TextView) {
titleTextView.setTextColor(getElementColor(titleTextView.context))
}
} }