Skip to content

Commit

Permalink
refactoring code base.
Browse files Browse the repository at this point in the history
  • Loading branch information
tomorisakura committed Nov 12, 2021
1 parent 7d0f048 commit 0c3577d
Show file tree
Hide file tree
Showing 8 changed files with 192 additions and 171 deletions.
82 changes: 14 additions & 68 deletions app/src/main/java/com/grevi/masakapa/ui/HomeActivity.kt
Original file line number Diff line number Diff line change
@@ -1,90 +1,36 @@
package com.grevi.masakapa.ui

import android.Manifest
import android.content.Context
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.LayoutInflater
import android.view.View
import androidx.appcompat.app.AppCompatDelegate
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.NavController
import com.grevi.masakapa.R
import com.grevi.masakapa.databinding.ActivityHomeBinding
import com.grevi.masakapa.ui.base.BaseActivity
import com.grevi.masakapa.util.Constant.PERMISSIONS_STORAGE
import com.grevi.masakapa.util.snackBar
import com.permissionx.guolindev.PermissionX
import dagger.hilt.android.AndroidEntryPoint

class HomeActivity : BaseActivity() {
private lateinit var binding : ActivityHomeBinding
private var state = false
@AndroidEntryPoint
class HomeActivity : BaseActivity<ActivityHomeBinding>() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityHomeBinding.inflate(layoutInflater)
setContentView(binding.root)
override fun subscribeUI() {
setSupportActionBar(binding.toolbar)
supportActionBar?.setIcon(R.drawable.ic_icon_text)
supportActionBar?.title = null

//init navhost container
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_container) as NavHostFragment
navHostFragment.navController
navHostFragment.navController.addOnDestinationChangedListener { controller, destination, _ ->
when(destination.id) {
R.id.recipesFragment -> {
binding.searchCard.visibility = View.VISIBLE
binding.searchCard.setOnClickListener {
controller.navigate(R.id.searchFragment2)
}
}
else -> binding.searchCard.visibility = View.GONE
}
}
storageHandler()
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
super.onCreateOptionsMenu(menu)
menuInflater.inflate(R.menu.toolbar_menu, menu)
return true
override fun getViewBindingInflater(inflater: LayoutInflater): ActivityHomeBinding {
return ActivityHomeBinding.inflate(inflater)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId) {
R.id.dayNight -> {
state = when(state) {
true -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
false
}
else -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
true
}
}
}
override fun navigationStateView(nav: NavController) = with(binding) {
searchCard.visibility = View.VISIBLE
searchCard.setOnClickListener {
nav.navigate(R.id.searchFragment2)
}
//return true
return super.onOptionsItemSelected(item)
}

private fun storageHandler() {
PermissionX.init(this)
.permissions(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
.onExplainRequestReason { scope, deniedList, _ ->
scope.showRequestReasonDialog(deniedList, getString(R.string.bucket_permission_reason), "Ok", "Cancel")
}
.request { allGranted, _, _ ->
if (allGranted) {
this.getSharedPreferences(PERMISSIONS_STORAGE, Context.MODE_PRIVATE).apply {
edit().let {
it.putBoolean(PERMISSIONS_STORAGE, true)
it.apply()
}
}
}
}
override fun navigationOnDisableView() = with(binding) {
searchCard.visibility = View.GONE
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import com.grevi.masakapa.databinding.ListsRecipesBinding
import com.grevi.masakapa.model.Recipes
import com.grevi.masakapa.util.DiffUtils

class CategoryItemAdapter : RecyclerView.Adapter<CategoryItemAdapter.CategoryItemVH>() {
class CategoryItemAdapter(private val itemTouch : ((recipes : Recipes) -> Unit))
: RecyclerView.Adapter<CategoryItemAdapter.CategoryItemVH>() {
private val recipes : MutableList<Recipes> = mutableListOf()
internal var itemTouch : ((recipes : Recipes) -> Unit)? = null

inner class CategoryItemVH(private val binding : ListsRecipesBinding) : RecyclerView.ViewHolder(binding.root) {
class CategoryItemVH(private val binding : ListsRecipesBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(recipes : Recipes) {
with(binding) {
imgThumb.load(recipes.imageThumb) {
Expand Down Expand Up @@ -49,6 +49,6 @@ class CategoryItemAdapter : RecyclerView.Adapter<CategoryItemAdapter.CategoryIte

override fun onBindViewHolder(holder: CategoryItemVH, position: Int) {
holder.bind(recipes[position])
holder.itemView.setOnClickListener { itemTouch?.invoke(recipes[position]) }
holder.itemView.setOnClickListener { itemTouch.invoke(recipes[position]) }
}
}
106 changes: 102 additions & 4 deletions app/src/main/java/com/grevi/masakapa/ui/base/BaseActivity.kt
Original file line number Diff line number Diff line change
@@ -1,18 +1,116 @@
package com.grevi.masakapa.ui.base

import android.Manifest
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import androidx.viewbinding.ViewBinding
import com.grevi.masakapa.R
import com.grevi.masakapa.util.Constant
import com.permissionx.guolindev.PermissionX
import dagger.hilt.android.AndroidEntryPoint
import java.util.zip.Inflater

@AndroidEntryPoint
open class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {

private lateinit var _binding : VB
protected val binding get() = _binding

private var state = false //should save state on shared pref

abstract fun getViewBindingInflater(inflater: LayoutInflater): VB

abstract fun navigationStateView(nav: NavController)

abstract fun navigationOnDisableView()

abstract fun subscribeUI()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_binding = getViewBindingInflater(layoutInflater)
setContentView(_binding.root)
supportActionBar?.hide()
supportActionBar?.setBackgroundDrawable(ColorDrawable(Color.WHITE))
subscribeUI()
storageHandler()
setupNavigation(onBindView = {
navigationStateView(it)
}, onNegativeView = {
navigationOnDisableView()
})
}

private fun setupNavigation(
onBindView : (nav :NavController) -> Unit,
onNegativeView: () -> Unit
) {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_container) as NavHostFragment
navHostFragment.navController.addOnDestinationChangedListener { controller, destination, _ ->
when(destination.id) {
R.id.recipesFragment -> onBindView(controller)
else -> onNegativeView()
}
}
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
super.onCreateOptionsMenu(menu)
menuInflater.inflate(R.menu.toolbar_menu, menu)
return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId) {
R.id.dayNight -> {
state = when(state) {
true -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
false
}
else -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
true
}
}
}
}
//return true
return super.onOptionsItemSelected(item)
}

private fun storageHandler() {
PermissionX.init(this)
.permissions(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
.onExplainRequestReason { scope, deniedList, _ ->
scope.showRequestReasonDialog(deniedList,
getString(R.string.bucket_permission_reason),
"Ok",
"Cancel")
}
.request { allGranted, _, _ ->
if (allGranted) {
this.getSharedPreferences(Constant.PERMISSIONS_STORAGE, Context.MODE_PRIVATE)
.apply {
edit().let {
it.putBoolean(Constant.PERMISSIONS_STORAGE, true)
it.apply()
}
}
}
}
}
}
11 changes: 5 additions & 6 deletions app/src/main/java/com/grevi/masakapa/ui/base/BaseFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,14 @@ abstract class BaseFragment<VB: ViewBinding, VM: ViewModel> : Fragment() {
}

protected fun onSwipeRefresh(
view: SwipeRefreshLayout,
pg : LinearProgressIndicator,
action: () -> Unit
view: SwipeRefreshLayout?,
pg : LinearProgressIndicator?,
) {
networkUtils.networkDataStatus.observe(viewLifecycleOwner, {
view.setOnRefreshListener {
view?.setOnRefreshListener {
Handler(Looper.getMainLooper()).postDelayed({
action.invoke()
pg.visibility = View.GONE
subscribeUI()
pg?.visibility = View.GONE
}, TWO_SECOND)
}
})
Expand Down
17 changes: 16 additions & 1 deletion app/src/main/java/com/grevi/masakapa/ui/base/BaseFragmentExt.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package com.grevi.masakapa.ui.base

import androidx.lifecycle.LiveData
import androidx.lifecycle.lifecycleScope
import com.grevi.masakapa.util.State
import com.grevi.masakapa.util.snackBar
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collect
import java.lang.IllegalStateException

fun <T>BaseFragment<*,*>.observeDataListFlow(data: MutableStateFlow<State<T>>, onSuccessState: (T) -> Unit) {
fun <T>BaseFragment<*,*>.observeDataListFlow(
data: MutableStateFlow<State<T>>,
onSuccessState: (T) -> Unit
) {
lifecycleScope.launchWhenCreated {
data.collect {
when(it) {
Expand All @@ -18,4 +22,15 @@ fun <T>BaseFragment<*,*>.observeDataListFlow(data: MutableStateFlow<State<T>>, o
}
}
}
}

fun <T>BaseFragment<*,*>.observeLiveData(data: LiveData<State<T>>, onSuccessState: (T) -> Unit) {
data.observe(viewLifecycleOwner, {
when(it) {
is State.Error -> snackBar(getBinding().root, it.msg).show()
is State.Loading -> snackBar(getBinding().root, it.msg).show()
is State.Success -> onSuccessState(it.data)
else -> throw IllegalStateException("State live datanya ngaco bang")
}
})
}
Loading

0 comments on commit 0c3577d

Please sign in to comment.