From f29dd657dc6c824ae667520863ee96aaf91d3852 Mon Sep 17 00:00:00 2001 From: "selim.toksal" Date: Thu, 17 Oct 2024 10:12:29 +0300 Subject: [PATCH 1/2] Develop filter by event platform feature --- libraries/analytics-logger/build.gradle | 1 + .../internal/data/dao/EventDao.kt | 10 +++- .../data/repository/EventRepository.kt | 6 ++- .../data/repository/EventRepositoryImpl.kt | 14 ++++- .../internal/domain/manager/EventManager.kt | 6 ++- .../domain/manager/EventManagerImpl.kt | 52 +++++++++++++------ .../domain/paging/EventPagingSource.kt | 2 + .../internal/ui/MainViewModel.kt | 15 ++++++ .../ui/events/EventPlatformAdapter.kt | 52 +++++++++++++++++++ .../internal/ui/events/EventsFragment.kt | 26 ++++++++-- .../analytics_logger_fragment_events.xml | 15 ++++-- .../analytics_logger_item_event_platform.xml | 19 +++++++ .../src/main/res/values/colors.xml | 1 + .../src/main/res/values/themes.xml | 13 ++++- 14 files changed, 203 insertions(+), 29 deletions(-) create mode 100644 libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventPlatformAdapter.kt create mode 100644 libraries/analytics-logger/src/main/res/layout/analytics_logger_item_event_platform.xml diff --git a/libraries/analytics-logger/build.gradle b/libraries/analytics-logger/build.gradle index 27b3d0a..f70f4ae 100644 --- a/libraries/analytics-logger/build.gradle +++ b/libraries/analytics-logger/build.gradle @@ -55,6 +55,7 @@ dependencies { implementation "androidx.appcompat:appcompat:$appcompat_version" implementation "androidx.fragment:fragment-ktx:$fragment_version" implementation "androidx.constraintlayout:constraintlayout:$constraint_layout_version" + implementation "com.google.android.material:material:$material_version" implementation "androidx.room:room-runtime:$room_version" implementation "androidx.room:room-ktx:$room_version" diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/dao/EventDao.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/dao/EventDao.kt index b5d0412..4bbb54c 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/dao/EventDao.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/dao/EventDao.kt @@ -8,12 +8,18 @@ import com.trendyol.android.devtools.analyticslogger.internal.data.model.EventEn @Dao internal interface EventDao { - @Query("SELECT * FROM event_entities WHERE `key` LIKE :query ORDER BY uid DESC LIMIT :limit OFFSET :offset") - suspend fun find(query: String, limit: Int, offset: Int): List + @Query("SELECT * FROM event_entities WHERE (`key` LIKE :query OR value LIKE :query) AND platform LIKE :platform ORDER BY uid DESC LIMIT :limit OFFSET :offset") + suspend fun find(query: String, platform: String, limit: Int, offset: Int): List @Insert suspend fun insert(vararg eventEntities: EventEntity) @Query("DELETE FROM event_entities") suspend fun deleteAll() + + @Query("SELECT DISTINCT platform FROM event_entities") + suspend fun getPlatforms(): List + + @Query("SELECT * FROM event_entities WHERE platform LIKE :platform ORDER BY uid DESC LIMIT :limit OFFSET :offset") + suspend fun filterByPlatform(platform: String, limit: Int, offset: Int): List } diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/repository/EventRepository.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/repository/EventRepository.kt index 09dbb7b..bc19263 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/repository/EventRepository.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/repository/EventRepository.kt @@ -4,9 +4,13 @@ import com.trendyol.android.devtools.analyticslogger.internal.data.model.EventEn internal interface EventRepository { - suspend fun find(query: String, limit: Int, offset: Int): List + suspend fun find(query: String, platform: String, limit: Int, offset: Int): List suspend fun insert(eventEntity: EventEntity) suspend fun deleteAll() + + suspend fun getPlatforms(): List + + suspend fun filterByPlatform(platform: String, limit: Int, offset: Int): List } diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/repository/EventRepositoryImpl.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/repository/EventRepositoryImpl.kt index db54316..79d8be0 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/repository/EventRepositoryImpl.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/data/repository/EventRepositoryImpl.kt @@ -7,8 +7,8 @@ internal class EventRepositoryImpl( private val eventDatabase: EventDatabase, ) : EventRepository { - override suspend fun find(query: String, limit: Int, offset: Int): List { - return eventDatabase.eventDao().find(query, limit, offset) + override suspend fun find(query: String, platform: String, limit: Int, offset: Int): List { + return eventDatabase.eventDao().find(query, platform, limit, offset) } override suspend fun insert(eventEntity: EventEntity) { @@ -18,4 +18,14 @@ internal class EventRepositoryImpl( override suspend fun deleteAll() { return eventDatabase.eventDao().deleteAll() } + + override suspend fun getPlatforms(): List { + val platforms = mutableListOf("All") + platforms.addAll(eventDatabase.eventDao().getPlatforms()) + return platforms + } + + override suspend fun filterByPlatform(platform: String, limit: Int, offset: Int): List { + return eventDatabase.eventDao().filterByPlatform(platform, limit, offset) + } } diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/manager/EventManager.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/manager/EventManager.kt index 6396935..ca24ed8 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/manager/EventManager.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/manager/EventManager.kt @@ -4,9 +4,13 @@ import com.trendyol.android.devtools.analyticslogger.internal.domain.model.Event internal interface EventManager { - suspend fun find(query: String?, page: Int, pageSize: Int): List + suspend fun find(query: String?, platform: String, page: Int, pageSize: Int): List suspend fun insert(key: String?, value: String?, platform: String?) suspend fun deleteAll() + + suspend fun getPlatforms(): List + + suspend fun filterByPlatform(platform: String, page: Int, pageSize: Int): List } diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/manager/EventManagerImpl.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/manager/EventManagerImpl.kt index ea351aa..441bdee 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/manager/EventManagerImpl.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/manager/EventManagerImpl.kt @@ -14,25 +14,14 @@ internal class EventManagerImpl( private val moshi: Moshi, ) : EventManager { - override suspend fun find(query: String?, page: Int, pageSize: Int): List { - val limit = 20 - val offset = (page - 1) * limit - + override suspend fun find(query: String?, platform: String, page: Int, pageSize: Int): List { val events = eventRepository.find( query = "%${query.orEmpty()}%", - limit = limit, - offset = offset, + platform = "%${platform}%", + limit = PAGE_LIMIT, + offset = calculateOffset(page), ) - return events.map { eventEntity -> - Event( - uid = eventEntity.uid, - key = eventEntity.key, - value = eventEntity.value, - json = eventEntity.value.beautify(moshi), - platform = eventEntity.platform, - date = eventEntity.date, - ) - } + return mapEventData(events) } override suspend fun insert( @@ -56,4 +45,35 @@ internal class EventManagerImpl( override suspend fun deleteAll() { return eventRepository.deleteAll() } + + override suspend fun getPlatforms(): List { + return eventRepository.getPlatforms() + } + + override suspend fun filterByPlatform(platform: String, page: Int, pageSize: Int): List { + val events = eventRepository.filterByPlatform( + platform = platform, + limit = PAGE_LIMIT, + offset = calculateOffset(page) + ) + return mapEventData(events) + } + + private fun calculateOffset(page: Int) = (page - 1) * PAGE_LIMIT + + private fun mapEventData(eventEntities: List): List = + eventEntities.map { eventEntity -> + Event( + uid = eventEntity.uid, + key = eventEntity.key, + value = eventEntity.value, + json = eventEntity.value.beautify(moshi), + platform = eventEntity.platform, + date = eventEntity.date, + ) + } + + companion object { + private const val PAGE_LIMIT = 20 + } } diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/paging/EventPagingSource.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/paging/EventPagingSource.kt index f7ba496..1dfba11 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/paging/EventPagingSource.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/domain/paging/EventPagingSource.kt @@ -8,12 +8,14 @@ import com.trendyol.android.devtools.analyticslogger.internal.domain.model.Event internal class EventPagingSource( private val eventManager: EventManager, private val query: String?, + private val platform: String, ) : PagingSource() { override suspend fun load(params: LoadParams): LoadResult { val nextPage = params.key ?: 1 val response = eventManager.find( query = query, + platform = platform, page = nextPage, pageSize = params.loadSize, ) diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/MainViewModel.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/MainViewModel.kt index 81bd641..4ae034e 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/MainViewModel.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/MainViewModel.kt @@ -19,15 +19,26 @@ internal class MainViewModel( private val eventManager: EventManager, ) : ViewModel() { + init { + viewModelScope.launch { + _platformsState.value = eventManager.getPlatforms() + } + } + private val queryState = MutableStateFlow("") + private val platformState = MutableStateFlow("") private val _detailState = MutableStateFlow(DetailState.Initial) val detailState: StateFlow = _detailState + private val _platformsState = MutableStateFlow>(emptyList()) + val platformsState: StateFlow> = _platformsState + val eventsFlow: Flow> = Pager(PagingConfig(pageSize = PAGE_SIZE)) { EventPagingSource( eventManager = eventManager, query = queryState.value, + platform = platformState.value ) } .flow @@ -37,6 +48,10 @@ internal class MainViewModel( queryState.value = query.orEmpty() } + fun setFilterState(platform: String) { + platformState.value = if (platform == "All") "" else platform + } + fun deleteAll() = viewModelScope.launch { eventManager.deleteAll() } diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventPlatformAdapter.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventPlatformAdapter.kt new file mode 100644 index 0000000..cc2b9b4 --- /dev/null +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventPlatformAdapter.kt @@ -0,0 +1,52 @@ +package com.trendyol.android.devtools.analyticslogger.internal.ui.events + +import android.content.res.ColorStateList +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.trendyol.android.devtools.analyticslogger.databinding.AnalyticsLoggerItemEventPlatformBinding +import com.trendyol.android.devtools.analyticslogger.internal.factory.ColorFactory + +class EventPlatformAdapter( +): RecyclerView.Adapter() { + + private val platforms: MutableList = mutableListOf() + var onItemSelected: ((platform: String) -> Unit)? = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EventPlatformViewHolder { + return EventPlatformViewHolder( + AnalyticsLoggerItemEventPlatformBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: EventPlatformViewHolder, position: Int) { + platforms[position].let { holder.bind(it) } + } + + override fun getItemCount(): Int { + return platforms.size + } + + fun submitData(data: List) { + platforms.addAll(data) + notifyDataSetChanged() + } + + inner class EventPlatformViewHolder( + private val binding: AnalyticsLoggerItemEventPlatformBinding + ) : RecyclerView.ViewHolder(binding.root) { + + fun bind(platform: String) = with(binding) { + chipPlatform.text = platform + chipPlatform.chipBackgroundColor = ColorStateList.valueOf(ColorFactory.getColor(platform)) + + chipPlatform.setOnClickListener { + onItemSelected?.invoke(platform) + } + } + } +} diff --git a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventsFragment.kt b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventsFragment.kt index dba10cf..7198eff 100644 --- a/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventsFragment.kt +++ b/libraries/analytics-logger/src/main/java/com/trendyol/android/devtools/analyticslogger/internal/ui/events/EventsFragment.kt @@ -38,6 +38,8 @@ internal class EventsFragment : Fragment() { private var eventAdapter: EventAdapter? = null + private lateinit var eventPlatformAdapter: EventPlatformAdapter + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = AnalyticsLoggerFragmentEventsBinding.inflate(inflater, container, false) return binding.root @@ -51,6 +53,9 @@ internal class EventsFragment : Fragment() { } private fun initView() { + eventPlatformAdapter = EventPlatformAdapter() + binding.platformsRecyclerView.adapter = eventPlatformAdapter + eventAdapter = EventAdapter() binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) binding.recyclerView.adapter = eventAdapter @@ -58,13 +63,28 @@ internal class EventsFragment : Fragment() { eventAdapter?.onItemSelected = { event -> navigateToEventDetail(event) } + + eventPlatformAdapter.onItemSelected = { + viewModel.setFilterState(it) + eventAdapter?.refresh() + } } private fun observeData() { - viewLifecycleOwner.lifecycleScope.launch { - viewModel.eventsFlow.collectLatest { - eventAdapter?.submitData(it) + with(viewLifecycleOwner.lifecycleScope) { + + launch { + viewModel.eventsFlow.collectLatest { + eventAdapter?.submitData(it) + } + } + + launch { + viewModel.platformsState.collectLatest { + eventPlatformAdapter.submitData(it) + } } + } } diff --git a/libraries/analytics-logger/src/main/res/layout/analytics_logger_fragment_events.xml b/libraries/analytics-logger/src/main/res/layout/analytics_logger_fragment_events.xml index c7c23fe..3654293 100644 --- a/libraries/analytics-logger/src/main/res/layout/analytics_logger_fragment_events.xml +++ b/libraries/analytics-logger/src/main/res/layout/analytics_logger_fragment_events.xml @@ -1,11 +1,20 @@ - + android:layout_height="match_parent" + android:orientation="vertical"> + + - \ No newline at end of file + diff --git a/libraries/analytics-logger/src/main/res/layout/analytics_logger_item_event_platform.xml b/libraries/analytics-logger/src/main/res/layout/analytics_logger_item_event_platform.xml new file mode 100644 index 0000000..a666d47 --- /dev/null +++ b/libraries/analytics-logger/src/main/res/layout/analytics_logger_item_event_platform.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/libraries/analytics-logger/src/main/res/values/colors.xml b/libraries/analytics-logger/src/main/res/values/colors.xml index 4ed62c6..194cab4 100644 --- a/libraries/analytics-logger/src/main/res/values/colors.xml +++ b/libraries/analytics-logger/src/main/res/values/colors.xml @@ -4,6 +4,7 @@ #ffffff #000000 #000000 + #9b59b6 #e3e3e3 diff --git a/libraries/analytics-logger/src/main/res/values/themes.xml b/libraries/analytics-logger/src/main/res/values/themes.xml index 62e09a8..fa51ed5 100644 --- a/libraries/analytics-logger/src/main/res/values/themes.xml +++ b/libraries/analytics-logger/src/main/res/values/themes.xml @@ -1,10 +1,21 @@ - + + + + From f2279404fa02af56d5d1a956368d4ca1aa364c62 Mon Sep 17 00:00:00 2001 From: "selim.toksal" Date: Thu, 17 Oct 2024 10:15:53 +0300 Subject: [PATCH 2/2] Update publish version --- libraries/analytics-logger/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/analytics-logger/build.gradle b/libraries/analytics-logger/build.gradle index f70f4ae..1bf93a1 100644 --- a/libraries/analytics-logger/build.gradle +++ b/libraries/analytics-logger/build.gradle @@ -37,7 +37,7 @@ android { ext { PUBLISH_GROUP_ID = 'com.trendyol.android.devtools' - PUBLISH_VERSION = '0.2.0' + PUBLISH_VERSION = '0.3.0' PUBLISH_ARTIFACT_ID = 'analytics-logger' PUBLISH_DESCRIPTION = "Android Analytics Event Logger" PUBLISH_URL = "https://github.com/Trendyol/android-dev-tools"