mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-20 03:59:35 +01:00
Color list headers
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
This commit is contained in:
parent
a8e99862f1
commit
5ec18780ff
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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(
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
) :
|
) :
|
||||||
|
@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user