Added superuser screen implementation

* partially
This commit is contained in:
Viktor De Pasquale
2019-10-18 19:38:55 +02:00
parent a539ffb188
commit fcbf56e93a
18 changed files with 451 additions and 8 deletions
@@ -2,8 +2,11 @@ package com.topjohnwu.magisk.redesign.compat
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.databinding.OnRebindCallback
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import androidx.transition.TransitionManager
import com.topjohnwu.magisk.R
import com.topjohnwu.magisk.base.BaseActivity
import com.topjohnwu.magisk.model.events.ViewEvent
@@ -27,6 +30,13 @@ abstract class CompatActivity<ViewModel : CompatViewModel, Binding : ViewDataBin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.addOnRebindCallback(object : OnRebindCallback<Binding>() {
override fun onPreBind(binding: Binding): Boolean {
TransitionManager.beginDelayedTransition(binding.root as ViewGroup)
return super.onPreBind(binding)
}
})
delegate.onCreate()
navigation?.onCreate(savedInstanceState)
}
@@ -2,7 +2,10 @@ package com.topjohnwu.magisk.redesign.compat
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.databinding.OnRebindCallback
import androidx.databinding.ViewDataBinding
import androidx.transition.TransitionManager
import com.topjohnwu.magisk.base.BaseFragment
import com.topjohnwu.magisk.model.events.ViewEvent
@@ -19,6 +22,13 @@ abstract class CompatFragment<ViewModel : CompatViewModel, Binding : ViewDataBin
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.addOnRebindCallback(object : OnRebindCallback<Binding>() {
override fun onPreBind(binding: Binding): Boolean {
TransitionManager.beginDelayedTransition(binding.root as ViewGroup)
return super.onPreBind(binding)
}
})
delegate.onCreate()
}
@@ -1,10 +1,55 @@
package com.topjohnwu.magisk.redesign.superuser
import android.content.pm.PackageManager
import com.topjohnwu.magisk.BR
import com.topjohnwu.magisk.data.database.PolicyDao
import com.topjohnwu.magisk.databinding.ComparableRvItem
import com.topjohnwu.magisk.extensions.applySchedulers
import com.topjohnwu.magisk.extensions.subscribeK
import com.topjohnwu.magisk.model.entity.recycler.PolicyRvItem
import com.topjohnwu.magisk.model.navigation.Navigation
import com.topjohnwu.magisk.redesign.compat.CompatViewModel
import com.topjohnwu.magisk.redesign.home.itemBindingOf
import com.topjohnwu.magisk.utils.DiffObservableList
class SuperuserViewModel : CompatViewModel() {
class SuperuserViewModel(
private val db: PolicyDao,
private val packageManager: PackageManager
) : CompatViewModel() {
val items = diffListOf<PolicyRvItem>()
val itemBinding = itemBindingOf<PolicyRvItem> {
it.bindExtra(BR.viewModel, this)
}
override fun refresh() = db.fetchAll()
.flattenAsFlowable { it }
.parallel()
.map { PolicyRvItem(it, it.applicationInfo.loadIcon(packageManager)) }
.sequential()
.sorted { o1, o2 ->
compareBy<PolicyRvItem>(
{ it.item.appName.toLowerCase() },
{ it.item.packageName }
).compare(o1, o2)
}
.toList()
.map { it to items.calculateDiff(it) }
.applySchedulers()
.applyViewModel(this)
.subscribeK { items.update(it.first, it.second) }
fun hidePressed() = Navigation.hide().publish()
}
fun deletePressed(item: PolicyRvItem) {
TODO()
}
}
inline fun <T : ComparableRvItem<T>> diffListOf(
vararg newItems: T
) = DiffObservableList(object : DiffObservableList.Callback<T> {
override fun areItemsTheSame(oldItem: T, newItem: T) = oldItem.genericItemSameAs(newItem)
override fun areContentsTheSame(oldItem: T, newItem: T) = oldItem.genericContentSameAs(newItem)
}).also { it.update(newItems.toList()) }