diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index a97cdb3..f7cb456 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -148,9 +148,6 @@ dependencies { kapt("com.github.bumptech.glide:compiler:4.11.0") implementation("com.github.bumptech.glide:okhttp3-integration:4.1.1") - // Drawer - implementation("com.mikepenz:materialdrawer:8.4.5") - // Themes implementation("com.github.rubensousa:floatingtoolbar:1.5.1") diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/HomeActivity.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/HomeActivity.kt index 97b998f..2334679 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/HomeActivity.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/HomeActivity.kt @@ -1,23 +1,16 @@ package bou.amine.apps.readerforselfossv2.android import android.content.Intent -import android.graphics.Color -import android.graphics.drawable.Drawable -import android.graphics.drawable.GradientDrawable -import android.net.Uri import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.View -import android.widget.ImageView import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts -import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.SearchView import androidx.core.view.doOnNextLayout -import androidx.drawerlayout.widget.DrawerLayout import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.* import androidx.work.Constraints @@ -30,33 +23,16 @@ import bou.amine.apps.readerforselfossv2.android.adapters.ItemsAdapter import bou.amine.apps.readerforselfossv2.android.background.LoadingWorker import bou.amine.apps.readerforselfossv2.android.databinding.ActivityHomeBinding import bou.amine.apps.readerforselfossv2.android.fragments.FilterSheetFragment -import bou.amine.apps.readerforselfossv2.android.settings.SettingsActivity import bou.amine.apps.readerforselfossv2.android.utils.bottombar.maybeShow import bou.amine.apps.readerforselfossv2.android.utils.bottombar.removeBadge import bou.amine.apps.readerforselfossv2.model.SelfossModel import bou.amine.apps.readerforselfossv2.repository.Repository import bou.amine.apps.readerforselfossv2.service.AppSettingsService import bou.amine.apps.readerforselfossv2.utils.ItemType -import bou.amine.apps.readerforselfossv2.utils.getHtmlDecoded -import bou.amine.apps.readerforselfossv2.utils.getIcon import bou.amine.apps.readerforselfossv2.utils.longHash import com.ashokvarma.bottomnavigation.BottomNavigationBar import com.ashokvarma.bottomnavigation.BottomNavigationItem import com.ashokvarma.bottomnavigation.TextBadgeItem -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions -import com.mikepenz.aboutlibraries.LibsBuilder -import com.mikepenz.materialdrawer.holder.BadgeStyle -import com.mikepenz.materialdrawer.holder.ColorHolder -import com.mikepenz.materialdrawer.holder.StringHolder -import com.mikepenz.materialdrawer.model.DividerDrawerItem -import com.mikepenz.materialdrawer.model.PrimaryDrawerItem -import com.mikepenz.materialdrawer.model.SecondaryDrawerItem -import com.mikepenz.materialdrawer.model.interfaces.* -import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader -import com.mikepenz.materialdrawer.util.DrawerImageLoader -import com.mikepenz.materialdrawer.util.addStickyFooterItem -import com.mikepenz.materialdrawer.util.updateBadge import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -71,11 +47,6 @@ import java.util.concurrent.TimeUnit class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAware { - private val DRAWER_ID_TAGS = 100101L - private val DRAWER_ID_HIDDEN_TAGS = 101100L - private val DRAWER_ID_SOURCES = 100110L - private val DRAWER_ID_FILTERS = 100111L - private var items: ArrayList = ArrayList() private var elementsShown: ItemType = ItemType.UNREAD @@ -122,14 +93,8 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar setContentView(view) setSupportActionBar(binding.toolBar) - supportActionBar?.setDisplayHomeAsUpEnabled(true) - supportActionBar?.setHomeButtonEnabled(true) - val mDrawerToggle = ActionBarDrawerToggle(this, binding.drawerContainer, binding.toolBar, R.string.material_drawer_open, R.string.material_drawer_close) - binding.drawerContainer.addDrawerListener(mDrawerToggle) - mDrawerToggle.syncState() handleBottomBar() - initDrawer() handleSwipeRefreshLayout() @@ -150,7 +115,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar binding.swipeRefreshLayout.setOnRefreshListener { repository.offlineOverride = false lastFetchDone = false - handleDrawerItems() CoroutineScope(Dispatchers.Main).launch { getElementsAccordingToTab() binding.swipeRefreshLayout.isRefreshing = false @@ -198,7 +162,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar (it.key to it.value) } }.toMap() - reloadTagsBadges() // Just load everythin if (items.size <= 0) { @@ -296,8 +259,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar override fun onResume() { super.onResume() - handleDrawerItems() - reloadLayoutManager() if (appSettingsService.isInfiniteLoadingEnabled()) { @@ -338,248 +299,44 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar } } - private fun initDrawer() { - DrawerImageLoader.init(object : AbstractDrawerImageLoader() { - override fun set(imageView: ImageView, uri: Uri, placeholder: Drawable, tag: String?) { - Glide.with(this@HomeActivity) - .asBitmap() - .load(uri) - .apply(RequestOptions() - .placeholder(R.mipmap.ic_launcher) - .fallback(R.mipmap.ic_launcher) - .fitCenter()) - .into(imageView) - } - - override fun cancel(imageView: ImageView) { - Glide.with(this@HomeActivity).clear(imageView) - } - }) - - val drawerListener = object : DrawerLayout.DrawerListener { - override fun onDrawerSlide(drawerView: View, slideOffset: Float) { - // We do nothing - } - - override fun onDrawerOpened(drawerView: View) { - binding.bottomBar.hide() - } - - override fun onDrawerClosed(drawerView: View) { - binding.bottomBar.show() - } - - override fun onDrawerStateChanged(newState: Int) { - // We do nothing - } - - } - - binding.drawerContainer.addDrawerListener(drawerListener) - - // Sticky items - addStickyPrimaryItem(R.string.drawer_report_bug, R.drawable.ic_bug_report_black_24dp) { _, _, _ -> - val browserIntent = - Intent(Intent.ACTION_VIEW, Uri.parse(AppSettingsService.trackerUrl)) - startActivity(browserIntent) - false - } - addStickyPrimaryItem(R.string.title_activity_settings, R.drawable.ic_settings_black_24dp) { _, _, _ -> - settingsLauncher.launch(Intent(this, SettingsActivity::class.java)) - false - } - } - - private fun addStickyPrimaryItem(name: Int, icon: Int, clickListener: ((v: View?, item: IDrawerItem<*>, position: Int) -> Boolean)?) { - binding.mainDrawer.addStickyFooterItem( - PrimaryDrawerItem().apply { - nameRes = name - iconRes = icon - isIconTinted = true - onDrawerItemClickListener = clickListener - }) - } - - private fun handleDrawerItems() { - tagsBadge = emptyMap() - binding.mainDrawer.itemAdapter.add( - PrimaryDrawerItem().apply { - nameRes = R.string.drawer_loading - isSelectable = false - } - ) - - CoroutineScope(Dispatchers.IO).launch { - val tags = repository.getTags() - val sources = repository.getSources() - runOnUiThread { - handleDrawerData(tags, sources) - } - } - } - - private fun handleDrawerData(tags: List, sources: List) { - binding.mainDrawer.itemAdapter.clear() - - // Filters title with clear action - secondaryItem(withDivider = false, R.string.drawer_item_filters, DRAWER_ID_FILTERS, R.string.drawer_action_clear) { _,_,_ -> - repository.sourceFilter = null - repository.tagFilter = null - binding.mainDrawer.setSelectionAtPosition(-1) - getElementsAccordingToTab() - fetchOnEmptyList() - false - } - - // Hidden tags - if (tags.isNotEmpty() && appSettingsService.getHiddenTags().isNotEmpty()) { - secondaryItem( - withDivider = true, - R.string.drawer_item_hidden_tags, - DRAWER_ID_HIDDEN_TAGS - ) - handleHiddenTags(tags) - } - - // Tags - secondaryItem(withDivider = true, R.string.drawer_item_tags, DRAWER_ID_TAGS) - if (tags.isEmpty()) { - binding.mainDrawer.itemAdapter.add( - SecondaryDrawerItem() - .apply { nameRes = R.string.drawer_error_loading_tags; isSelectable = false } - ) - } else { - handleTags(tags) - } - - // Sources - secondaryItem(withDivider = true, R.string.drawer_item_sources, DRAWER_ID_SOURCES, R.string.drawer_action_edit) { v, _, _ -> - startActivity(Intent(v!!.context, SourcesActivity::class.java)) - false - } - if (sources.isEmpty()) { - binding.mainDrawer.itemAdapter.add( - SecondaryDrawerItem().apply { - nameRes = R.string.drawer_error_loading_sources - isSelectable = false - } - ) - } else { - handleSources(sources) - } - - // About action - binding.mainDrawer.itemAdapter.add( - DividerDrawerItem(), - PrimaryDrawerItem().apply { - nameRes = R.string.action_about - isSelectable = false - iconRes = R.drawable.ic_info_outline_white_24dp - isIconTinted = true - onDrawerItemClickListener = { _,_,_ -> - LibsBuilder() - .withAboutIconShown(true) - .withAboutVersionShown(true) - .start(this@HomeActivity) - false - } - } - ) - } - - private fun secondaryItem(withDivider: Boolean, name: Int, id: Long, badgeId: Int? = null, clickListener: ((v: View?, item: IDrawerItem<*>, position: Int) -> Boolean)? = null) { - if (withDivider) { - binding.mainDrawer.itemAdapter.add(DividerDrawerItem()) - } - - binding.mainDrawer.itemAdapter.add( - SecondaryDrawerItem().apply { - nameRes = name - identifier = id - isSelectable = false - if (badgeId != null) { - badgeRes = badgeId - } - onDrawerItemClickListener = clickListener - } - ) - } - - private fun createDrawerItem(it: SelfossModel.Tag) { - val gd = GradientDrawable() - val gdColor = try { - Color.parseColor(it.color) - } catch (e: IllegalArgumentException) { - e.sendSilentlyWithAcraWithName("color issue " + it.color) - resources.getColor(R.color.colorPrimary) - } - gd.setColor(gdColor) - gd.shape = GradientDrawable.RECTANGLE - gd.setSize(30, 30) - gd.cornerRadius = 30F - - val drawerItem = PrimaryDrawerItem() - .apply { - nameText = it.tag.getHtmlDecoded() - identifier = it.tag.longHash() - iconDrawable = gd - badgeStyle = BadgeStyle().apply { - textColor = ColorHolder.fromColor(Color.WHITE) - color = ColorHolder.fromColor(resources.getColor(R.color.colorAccent)) - } - onDrawerItemClickListener = { _, _, _ -> - repository.tagFilter = it - repository.sourceFilter = null - getElementsAccordingToTab() - fetchOnEmptyList() - false - } - } - if (it.unread > 0) { - drawerItem.badgeText = it.unread.toString() - } - - binding.mainDrawer.itemAdapter.add(drawerItem) - } - - private fun handleTags(tags: List) { - val filteredTags = tags - .filterNot { appSettingsService.getHiddenTags().contains(it.tag) } - .sortedBy { it.tag } - createTagItems(filteredTags) - } - - private fun handleHiddenTags(tags: List) { - val filteredHiddenTags: List = - tags.filter { appSettingsService.getHiddenTags().contains(it.tag) } - createTagItems(filteredHiddenTags) - } - - private fun createTagItems(tags: List) { - tagsBadge = tags.associate { - createDrawerItem(it) - - (it.tag.longHash() to it.unread) - } - } - - private fun handleSources(sources: List) { - for (source in sources) { - val item = PrimaryDrawerItem().apply { - nameText = source.title.getHtmlDecoded() - identifier = source.id.toLong() - iconUrl = source.getIcon(repository.baseUrl) - onDrawerItemClickListener = { _,_,_ -> - repository.sourceFilter = source - repository.tagFilter = null - getElementsAccordingToTab() - fetchOnEmptyList() - false - } - } - binding.mainDrawer.itemAdapter.add(item) - } - } + // TODO CLEAN +// private fun initDrawer() { +// // TODO add to menu +// addStickyPrimaryItem(R.string.drawer_report_bug, R.drawable.ic_bug_report_black_24dp) { _, _, _ -> +// val browserIntent = +// Intent(Intent.ACTION_VIEW, Uri.parse(AppSettingsService.trackerUrl)) +// startActivity(browserIntent) +// false +// } +// addStickyPrimaryItem(R.string.title_activity_settings, R.drawable.ic_settings_black_24dp) { _, _, _ -> +// settingsLauncher.launch(Intent(this, SettingsActivity::class.java)) +// false +// } +// } +// +// private fun addStickyPrimaryItem(name: Int, icon: Int, clickListener: ((v: View?, item: IDrawerItem<*>, position: Int) -> Boolean)?) { +// // TODO CLEAN +// } +// +// private fun handleDrawerData(tags: List, sources: List) { +// // TODO add to menu +// binding.mainDrawer.itemAdapter.add( +// DividerDrawerItem(), +// PrimaryDrawerItem().apply { +// nameRes = R.string.action_about +// isSelectable = false +// iconRes = R.drawable.ic_info_outline_white_24dp +// isIconTinted = true +// onDrawerItemClickListener = { _,_,_ -> +// LibsBuilder() +// .withAboutIconShown(true) +// .withAboutVersionShown(true) +// .start(this@HomeActivity) +// false +// } +// } +// ) +// } private fun reloadLayoutManager() { val currentManager = binding.recyclerView.layoutManager @@ -784,13 +541,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar } } - private fun reloadTagsBadges() { - tagsBadge.forEach { - binding.mainDrawer.updateBadge(it.key, StringHolder(it.value.toString())) - } - binding.mainDrawer.resetDrawerContent() - } - private fun calculateNoOfColumns(): Int { val displayMetrics = resources.displayMetrics val dpWidth = displayMetrics.widthPixels / displayMetrics.density @@ -880,8 +630,6 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener, DIAwar ).show() tabNewBadge.removeBadge() - handleDrawerItems() - getElementsAccordingToTab() } else { Toast.makeText( diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/MyApp.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/MyApp.kt index 1a5c52e..3265c7a 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/MyApp.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/MyApp.kt @@ -21,8 +21,6 @@ import bou.amine.apps.readerforselfossv2.service.AppSettingsService import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.github.ln_12.library.ConnectivityStatus -import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader -import com.mikepenz.materialdrawer.util.DrawerImageLoader import io.github.aakira.napier.DebugAntilog import io.github.aakira.napier.Napier import kotlinx.coroutines.CoroutineScope @@ -67,8 +65,6 @@ class MyApp : MultiDexApplication(), DIAware { Napier.base(DebugAntilog()) if (!ACRA.isACRASenderServiceProcess()) { - initDrawerImageLoader() - tryToHandleBug() handleNotificationChannels() @@ -138,25 +134,6 @@ class MyApp : MultiDexApplication(), DIAware { } } - private fun initDrawerImageLoader() { - DrawerImageLoader.init(object : AbstractDrawerImageLoader() { - override fun set(imageView: ImageView, uri: Uri, placeholder: Drawable, tag: String?) { - Glide.with(imageView.context) - .load(uri.toString()) - .apply(RequestOptions.fitCenterTransform().placeholder(placeholder)) - .into(imageView) - } - - override fun cancel(imageView: ImageView) { - Glide.with(imageView.context).clear(imageView) - } - - override fun placeholder(ctx: Context, tag: String?): Drawable { - return baseContext.resources.getDrawable(R.mipmap.ic_launcher) - } - }) - } - private fun tryToHandleBug() { val oldHandler = Thread.getDefaultUncaughtExceptionHandler() diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/utils/drawer/CustomBaseViewHolder.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/utils/drawer/CustomBaseViewHolder.kt deleted file mode 100644 index 569e91e..0000000 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/utils/drawer/CustomBaseViewHolder.kt +++ /dev/null @@ -1,14 +0,0 @@ -/* From https://github.com/mikepenz/MaterialDrawer/blob/develop/app/src/main/java/com/mikepenz/materialdrawer/app/drawerItems/CustomBaseViewHolder.java */ -package bou.amine.apps.readerforselfossv2.android.utils.drawer - -import android.view.View -import android.widget.ImageView -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import bou.amine.apps.readerforselfossv2.android.R - -open class CustomBaseViewHolder(var view: View) : RecyclerView.ViewHolder(view) { - var icon: ImageView = view.findViewById(R.id.material_drawer_icon) - var name: TextView = view.findViewById(R.id.material_drawer_name) - var description: TextView = view.findViewById(R.id.material_drawer_description) -} diff --git a/androidApp/src/main/res/layout/activity_home.xml b/androidApp/src/main/res/layout/activity_home.xml index 7ad252c..5debd59 100644 --- a/androidApp/src/main/res/layout/activity_home.xml +++ b/androidApp/src/main/res/layout/activity_home.xml @@ -85,11 +85,4 @@ app:bnbActiveColor="@color/colorAccent" app:bnbBackgroundColor="?attr/bottomBarBackground" /> - - \ No newline at end of file diff --git a/androidApp/src/main/res/layout/filter_fragment.xml b/androidApp/src/main/res/layout/filter_fragment.xml index b9e8b3e..03a6e26 100644 --- a/androidApp/src/main/res/layout/filter_fragment.xml +++ b/androidApp/src/main/res/layout/filter_fragment.xml @@ -45,7 +45,7 @@ android:layout_height="wrap_content" android:layout_marginStart="24dp" android:layout_marginTop="16dp" - android:text="@string/filter_tags_title" + android:text="@string/drawer_item_tags" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -96,7 +96,7 @@ android:layout_height="wrap_content" android:layout_marginStart="24dp" android:layout_marginTop="24dp" - android:text="@string/filter_sources_title" + android:text="@string/drawer_item_sources" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/hiddenTagsGroup" />