Skip to content

Commit

Permalink
New filters bottom sheet (#93)
Browse files Browse the repository at this point in the history
  • Loading branch information
jahirfiquitiva committed Jun 4, 2018
1 parent 3df1a57 commit d3da811
Show file tree
Hide file tree
Showing 24 changed files with 657 additions and 402 deletions.
6 changes: 3 additions & 3 deletions dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@ ext.versions = [
targetSdk : 27,
buildTools : '27.0.3',
// Versions:
versionCode : 120,
versionName : '1.2.0',
versionCode : 121,
versionName : '1.2.1',
// Gradle Plugins
gradle : '3.1.2',
kotlin : '1.2.41',
libs : '2.0',
// Dependencies
kuper : '1.3.9',
kuper : '1.4.0',
materialDrawer: '6.0.7',
counterFab : '1.0.3',
fuel : '1.13.0',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ internal data class Launcher(
}

enum class NavigationItem(
val tag: String, val id: Int, @StringRes val title: Int,
private val tag: String, val id: Int, @StringRes val title: Int,
@DrawableRes val icon: Int
) {
HOME("Home", DEFAULT_HOME_SECTION_ID, R.string.section_home, R.drawable.ic_home),
Expand All @@ -88,4 +88,6 @@ enum class NavigationItem(
R.drawable.ic_request);

override fun toString(): String = "NavigationItem[$tag - $id]"
}
}

data class Filter(val title: String, @ColorInt val color: Int, var selected: Boolean)
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import android.support.design.widget.CoordinatorLayout
import android.support.v4.widget.DrawerLayout
import android.view.Gravity
import android.view.Menu
import android.view.MenuItem
import ca.allanwang.kau.utils.dpToPx
Expand All @@ -37,8 +35,6 @@ import ca.allanwang.kau.utils.statusBarLight
import ca.allanwang.kau.utils.tint
import ca.allanwang.kau.utils.visible
import com.andremion.counterfab.CounterFab
import com.mikepenz.materialdrawer.Drawer
import com.mikepenz.materialdrawer.DrawerBuilder
import jahirfiquitiva.libs.blueprint.R
import jahirfiquitiva.libs.blueprint.helpers.extensions.blueprintFormat
import jahirfiquitiva.libs.blueprint.helpers.extensions.defaultLauncher
Expand All @@ -50,18 +46,17 @@ import jahirfiquitiva.libs.blueprint.helpers.utils.DEFAULT_HOME_SECTION_ID
import jahirfiquitiva.libs.blueprint.helpers.utils.DEFAULT_ICONS_SECTION_ID
import jahirfiquitiva.libs.blueprint.helpers.utils.DEFAULT_REQUEST_SECTION_ID
import jahirfiquitiva.libs.blueprint.helpers.utils.DEFAULT_WALLPAPERS_SECTION_ID
import jahirfiquitiva.libs.blueprint.models.Filter
import jahirfiquitiva.libs.blueprint.models.NavigationItem
import jahirfiquitiva.libs.blueprint.quest.IconRequest
import jahirfiquitiva.libs.blueprint.quest.events.SendRequestCallback
import jahirfiquitiva.libs.blueprint.ui.adapters.viewholders.FilterCheckBoxHolder
import jahirfiquitiva.libs.blueprint.ui.fragments.ApplyFragment
import jahirfiquitiva.libs.blueprint.ui.fragments.EmptyFragment
import jahirfiquitiva.libs.blueprint.ui.fragments.HomeFragment
import jahirfiquitiva.libs.blueprint.ui.fragments.IconsFragment
import jahirfiquitiva.libs.blueprint.ui.fragments.RequestsFragment
import jahirfiquitiva.libs.blueprint.ui.fragments.WallpapersFragment
import jahirfiquitiva.libs.blueprint.ui.items.FilterDrawerItem
import jahirfiquitiva.libs.blueprint.ui.items.FilterTitleDrawerItem
import jahirfiquitiva.libs.blueprint.ui.fragments.dialogs.FiltersBottomSheet
import jahirfiquitiva.libs.frames.helpers.extensions.mdDialog
import jahirfiquitiva.libs.frames.helpers.extensions.showChanges
import jahirfiquitiva.libs.frames.helpers.utils.ICONS_APPLIER
Expand Down Expand Up @@ -91,8 +86,7 @@ import jahirfiquitiva.libs.kext.ui.layouts.FixedElevationAppBarLayout
import jahirfiquitiva.libs.kext.ui.widgets.CustomSearchView
import jahirfiquitiva.libs.kuper.ui.widgets.PseudoViewPager

abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),
FilterTitleDrawerItem.ButtonListener {
abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>() {

override val configs: BPKonfigs by lazy { BPKonfigs(this) }
override fun lightTheme(): Int = R.style.BlueprintLightTheme
Expand All @@ -106,9 +100,8 @@ abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),
private val coordinatorLayout: CoordinatorLayout? by bind(R.id.mainCoordinatorLayout)
private val appbarLayout: FixedElevationAppBarLayout? by bind(R.id.appbar)

private var filtersDrawer: Drawer? = null
private val iconsFilters: ArrayList<String> = ArrayList()
private val activeFilters: ArrayList<String> = ArrayList()
private val iconsFilters: ArrayList<Filter> = ArrayList()
private val activeFilters: ArrayList<Filter> = ArrayList()

internal val toolbar: CustomToolbar? by bind(R.id.toolbar)
private val fab: CounterFab? by bind(R.id.fab)
Expand Down Expand Up @@ -147,7 +140,7 @@ abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),
toolbar?.bindToActivity(this, false)
toolbar?.enableScroll(true)
initCurrentSectionId()
initMainComponents(savedInstanceState)
initMainComponents()
if (isIconsPicker) {
postDelayed(10) {
navigateToItem(getNavigationItemWithId(currentSectionId), true, true)
Expand All @@ -165,10 +158,9 @@ abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),
} else defaultSectionId
}

private fun initMainComponents(savedInstance: Bundle?) {
private fun initMainComponents() {
initFragments()
initFAB()
initFiltersDrawer(iconsFilters, savedInstance)
updateUI(getNavigationItemWithId(currentSectionId))
}

Expand Down Expand Up @@ -202,10 +194,10 @@ abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),
fab?.setMarginRight(16F.dpToPx.toInt())
fab?.setMarginBottom((if (hasBottomNavigation()) 72F else 16F).dpToPx.toInt())
fab?.setOnClickListener {
if (currentSectionId == DEFAULT_HOME_SECTION_ID) {
executeLauncherIntent(defaultLauncher?.name.orEmpty())
} else if (currentSectionId == DEFAULT_REQUEST_SECTION_ID) {
startRequestsProcess()
when (currentSectionId) {
DEFAULT_HOME_SECTION_ID -> executeLauncherIntent(defaultLauncher?.name.orEmpty())
DEFAULT_REQUEST_SECTION_ID -> startRequestsProcess()
DEFAULT_ICONS_SECTION_ID -> showFiltersBottomSheet()
}
}
updateFAB()
Expand All @@ -218,78 +210,36 @@ abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),
val icon: Drawable? = when (currentSectionId) {
DEFAULT_HOME_SECTION_ID -> drawable(R.drawable.ic_apply)
DEFAULT_REQUEST_SECTION_ID -> drawable(R.drawable.ic_send)
DEFAULT_ICONS_SECTION_ID -> drawable(R.drawable.ic_filter)
else -> null
}
fab?.setImageDrawable(icon?.tint(getActiveIconsColorFor(accentColor, 0.6F)))
fab?.showIf(
(currentSectionId == DEFAULT_HOME_SECTION_ID && launcherName.hasContent())
|| currentSectionId == DEFAULT_REQUEST_SECTION_ID)
|| currentSectionId == DEFAULT_REQUEST_SECTION_ID
|| (currentSectionId == DEFAULT_ICONS_SECTION_ID && iconsFilters.size > 1))
}

fun initFiltersDrawer(filters: ArrayList<String>, savedInstance: Bundle? = null) {
val filtersDrawerBuilder = DrawerBuilder().withActivity(this).withDrawerGravity(Gravity.END)

if (savedInstance != null) filtersDrawerBuilder.withSavedInstance(savedInstance)

filtersDrawer?.removeAllItems()

if (filters.isNotEmpty()) {
filtersDrawerBuilder.addDrawerItems(FilterTitleDrawerItem(this))
setupFiltersDrawerItems(filtersDrawerBuilder, filters)
}

filtersDrawer = filtersDrawerBuilder.build()

this.iconsFilters.clear()
this.iconsFilters.addAll(filters)

val item = getNavigationItemWithId(currentSectionId)
lockFiltersDrawer(item.id != DEFAULT_ICONS_SECTION_ID || filters.size <= 1)
if (currentSectionId == DEFAULT_ICONS_SECTION_ID) invalidateOptionsMenu()
}

private fun setupFiltersDrawerItems(builder: DrawerBuilder, filters: ArrayList<String>) {
fun initFiltersFromCategories(categories: ArrayList<String>) {
var index = 0
var colorIndex = 0
val colors = stringArray(R.array.filters_colors).orEmpty()
val listener = object : FilterCheckBoxHolder.StateChangeListener {
override fun onStateChanged(
checked: Boolean, title: String,
fireFiltersListener: Boolean
) {
if (activeFilters.contains(title) && !checked) {
activeFilters.remove(title)
if (fireFiltersListener) applyIconFilters()
} else if (checked) {
activeFilters.add(title)
if (fireFiltersListener) applyIconFilters()
}
}
}

if (filters.size > 1) {
filters.forEach {
val newFilters = ArrayList<Filter>()
if (categories.size > 1) {
categories.forEach {
if (colorIndex >= colors.size) colorIndex = 0
val name = it.formatCorrectly().blueprintFormat()
if (!(name.contains("all", true))) {
builder.addDrawerItems(
FilterDrawerItem().withName(it.formatCorrectly().blueprintFormat())
.withColor(Color.parseColor(colors[colorIndex]))
.withListener(listener)
.withDivider(index < (filters.size - 1)))
newFilters.add(Filter(name, Color.parseColor(colors[colorIndex]), false))
index += 1
colorIndex += 1
}
}
}
}

override fun onButtonPressed() {
filtersDrawer?.drawerItems?.forEach {
(it as? FilterDrawerItem)?.checkBoxHolder?.apply(false, false)
}
activeFilters.clear()
applyIconFilters()

this.iconsFilters.clear()
this.iconsFilters.addAll(newFilters)
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
Expand Down Expand Up @@ -329,7 +279,6 @@ abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
item?.let {
when (it.itemId) {
R.id.filters -> if (iconsFilters.isNotEmpty()) filtersDrawer?.openDrawer()
R.id.refresh -> {
refreshWallpapers()
refreshRequests()
Expand Down Expand Up @@ -403,6 +352,15 @@ abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),
}
}

private fun showFiltersBottomSheet() {
FiltersBottomSheet.show(
this@BaseBlueprintActivity, iconsFilters, activeFilters) {
this.activeFilters.clear()
this.activeFilters.addAll(it)
this.applyIconFilters()
}
}

internal open fun navigateToItem(
item: NavigationItem,
fromClick: Boolean,
Expand Down Expand Up @@ -434,13 +392,10 @@ abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),

private fun updateUI(item: NavigationItem) {
updateFAB()

toolbar?.title = getString(
if (item.id == DEFAULT_HOME_SECTION_ID) R.string.app_name else item.title)
supportActionBar?.title = getString(
if (item.id == DEFAULT_HOME_SECTION_ID) R.string.app_name else item.title)

lockFiltersDrawer(item.id != DEFAULT_ICONS_SECTION_ID || iconsFilters.size <= 1)
}

private fun updateToolbarMenuItems(item: NavigationItem, menu: Menu) {
Expand All @@ -450,7 +405,6 @@ abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),
R.id.search,
if (isInIconsSection) iconsFilters.isNotEmpty()
else item.id != DEFAULT_HOME_SECTION_ID)
menu.setItemVisibility(R.id.filters, isInIconsSection && iconsFilters.size > 1)
menu.setItemVisibility(
R.id.refresh,
item.id == DEFAULT_WALLPAPERS_SECTION_ID || item.id == DEFAULT_REQUEST_SECTION_ID)
Expand All @@ -461,12 +415,6 @@ abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),
menu.setItemVisibility(R.id.help, hasBottomNavigation() && !isIconsPicker)
}

private fun lockFiltersDrawer(lock: Boolean) {
filtersDrawer?.drawerLayout?.setDrawerLockMode(
if (lock) DrawerLayout.LOCK_MODE_LOCKED_CLOSED else DrawerLayout.LOCK_MODE_UNLOCKED,
Gravity.END)
}

open fun getNavigationItems(): Array<NavigationItem> =
arrayOf(
NavigationItem.HOME,
Expand Down Expand Up @@ -570,10 +518,9 @@ abstract class BaseBlueprintActivity : BaseFramesActivity<BPKonfigs>(),
}()
}

internal fun applyIconFilters() {
private fun applyIconFilters() {
((pager?.adapter as? FragmentsPagerAdapter)?.get(
currentSectionPosition) as? IconsFragment)
?.applyFilters(activeFilters)
currentSectionPosition) as? IconsFragment)?.applyFilters(activeFilters)
}

private fun scrollToTop() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import jahirfiquitiva.libs.kext.extensions.inactiveIconsColor

abstract class BottomNavigationBlueprintActivity : BaseBlueprintActivity() {

internal val bottomBar: AHBottomNavigation? by bind(R.id.bottom_navigation)
private val bottomBar: AHBottomNavigation? by bind(R.id.bottom_navigation)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Copyright (c) 2018. Jahir Fiquitiva
*
* Licensed under the CreativeCommons Attribution-ShareAlike
* 4.0 International License. You may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jahirfiquitiva.libs.blueprint.ui.adapters

import android.view.ViewGroup
import ca.allanwang.kau.utils.inflate
import jahirfiquitiva.libs.archhelpers.ui.adapters.RecyclerViewListAdapter
import jahirfiquitiva.libs.blueprint.R
import jahirfiquitiva.libs.blueprint.models.Filter
import jahirfiquitiva.libs.blueprint.ui.adapters.viewholders.FilterChipHolder

class FiltersAdapter(private val onSelectionChange: (Filter, Boolean) -> Unit) :
RecyclerViewListAdapter<Filter, FilterChipHolder>() {

val selectedFilters = ArrayList<Filter>()

fun updateSelectedFilters(filters: ArrayList<Filter>) {
selectedFilters.clear()
selectedFilters.addAll(filters)
notifyDataSetChanged()
}

fun toggleFilter(filter: Filter, checked: Boolean) {
if (checked) addToSelected(filter) else removeFromSelected(filter)
}

private fun addToSelected(filter: Filter) {
if (selectedFilters.contains(filter)) return
selectedFilters.add(filter)
notifyDataSetChanged()
}

private fun removeFromSelected(filter: Filter) {
if (!selectedFilters.contains(filter)) return
selectedFilters.remove(filter)
notifyDataSetChanged()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FilterChipHolder =
FilterChipHolder(parent.inflate(R.layout.item_filter_chip))

override fun doBind(holder: FilterChipHolder, position: Int, shouldAnimate: Boolean) {
val rightItem = list[position]
holder.bind(
rightItem, selectedFilters.any { it.title.equals(rightItem.title, true) },
onSelectionChange)
}
}
Loading

0 comments on commit d3da811

Please sign in to comment.