diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/LogDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/LogDao.kt index 5e6bfb782..ae7e5d6b9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/LogDao.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/LogDao.kt @@ -1,6 +1,6 @@ package com.topjohnwu.magisk.data.database -import com.topjohnwu.magisk.data.database.base.* +import com.topjohnwu.magisk.data.database.magiskdb.* import com.topjohnwu.magisk.model.entity.MagiskLog import com.topjohnwu.magisk.model.entity.toLog import com.topjohnwu.magisk.model.entity.toMap @@ -8,7 +8,7 @@ import java.util.concurrent.TimeUnit class LogDao : BaseDao() { - override val table = DatabaseDefinition.Table.LOG + override val table = Table.LOG fun deleteOutdated( suTimeout: Long = TimeUnit.DAYS.toMillis(14) @@ -18,7 +18,7 @@ class LogDao : BaseDao() { } }.ignoreElement() - fun deleteAll() = query<Delete> {}.ignoreElement() + fun deleteAll() = query<Delete>().ignoreElement() fun fetchAll() = query<Select> { orderBy("time", Order.DESC) @@ -30,4 +30,4 @@ class LogDao : BaseDao() { values(log.toMap()) }.ignoreElement() -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/PolicyDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/PolicyDao.kt index 3e4d0464f..ff73b6cb7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/PolicyDao.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/PolicyDao.kt @@ -3,7 +3,10 @@ package com.topjohnwu.magisk.data.database import android.content.Context import android.content.pm.PackageManager import com.topjohnwu.magisk.Const -import com.topjohnwu.magisk.data.database.base.* +import com.topjohnwu.magisk.data.database.magiskdb.Delete +import com.topjohnwu.magisk.data.database.magiskdb.BaseDao +import com.topjohnwu.magisk.data.database.magiskdb.Replace +import com.topjohnwu.magisk.data.database.magiskdb.Select import com.topjohnwu.magisk.extensions.now import com.topjohnwu.magisk.model.entity.MagiskPolicy import com.topjohnwu.magisk.model.entity.toMap @@ -16,7 +19,7 @@ class PolicyDao( private val context: Context ) : BaseDao() { - override val table: String = DatabaseDefinition.Table.POLICY + override val table: String = Table.POLICY fun deleteOutdated( nowSeconds: Long = TimeUnit.MILLISECONDS.toSeconds(now) @@ -72,4 +75,4 @@ class PolicyDao( } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/SettingsDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/SettingsDao.kt index a394dd5e9..c2b4a2701 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/SettingsDao.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/SettingsDao.kt @@ -1,10 +1,13 @@ package com.topjohnwu.magisk.data.database -import com.topjohnwu.magisk.data.database.base.* +import com.topjohnwu.magisk.data.database.magiskdb.Delete +import com.topjohnwu.magisk.data.database.magiskdb.BaseDao +import com.topjohnwu.magisk.data.database.magiskdb.Replace +import com.topjohnwu.magisk.data.database.magiskdb.Select class SettingsDao : BaseDao() { - override val table = DatabaseDefinition.Table.SETTINGS + override val table = Table.SETTINGS fun delete(key: String) = query<Delete> { condition { equals("key", key) } @@ -19,4 +22,4 @@ class SettingsDao : BaseDao() { condition { equals("key", key) } }.map { it.firstOrNull()?.values?.firstOrNull()?.toIntOrNull() ?: default } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/StringDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/StringDao.kt index 6d767ac51..92b8c458b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/StringDao.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/StringDao.kt @@ -1,10 +1,13 @@ package com.topjohnwu.magisk.data.database -import com.topjohnwu.magisk.data.database.base.* +import com.topjohnwu.magisk.data.database.magiskdb.Delete +import com.topjohnwu.magisk.data.database.magiskdb.BaseDao +import com.topjohnwu.magisk.data.database.magiskdb.Replace +import com.topjohnwu.magisk.data.database.magiskdb.Select class StringDao : BaseDao() { - override val table = DatabaseDefinition.Table.STRINGS + override val table = Table.STRINGS fun delete(key: String) = query<Delete> { condition { equals("key", key) } @@ -19,4 +22,4 @@ class StringDao : BaseDao() { condition { equals("key", key) } }.map { it.firstOrNull()?.values?.firstOrNull() ?: default } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/base/BaseDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/base/BaseDao.kt deleted file mode 100644 index 3fe8f0bdd..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/base/BaseDao.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.topjohnwu.magisk.data.database.base - -abstract class BaseDao { - - abstract val table: String - - inline fun <reified Builder : MagiskQueryBuilder> query(builder: Builder.() -> Unit) = - Builder::class.java.newInstance() - .apply { table = this@BaseDao.table } - .apply(builder) - .toString() - .let { MagiskQuery(it) } - .query() - -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/base/DatabaseDefinition.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/base/DatabaseDefinition.kt deleted file mode 100644 index 2a5c364af..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/base/DatabaseDefinition.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.topjohnwu.magisk.data.database.base - -import androidx.annotation.AnyThread -import com.topjohnwu.superuser.Shell -import io.reactivex.Single - -object DatabaseDefinition { - - object Table { - const val POLICY = "policies" - const val LOG = "logs" - const val SETTINGS = "settings" - const val STRINGS = "strings" - } - -} - -@AnyThread -fun MagiskQuery.query() = query.su() - -fun String.suRaw() = Single.fromCallable { Shell.su(this).exec().out } -fun String.su() = suRaw().map { it.toMap() } - -fun List<String>.toMap() = map { it.split(Regex("\\|")) } - .map { it.toMapInternal() } - -private fun List<String>.toMapInternal() = map { it.split("=", limit = 2) } - .filter { it.size == 2 } - .map { Pair(it[0], it[1]) } - .toMap() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQuery.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQuery.kt deleted file mode 100644 index 9407c2f36..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQuery.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.topjohnwu.magisk.data.database.base - -inline class MagiskQuery(private val _query: String) { - val query get() = "magisk --sqlite '$_query'" -} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/BaseDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/BaseDao.kt new file mode 100644 index 000000000..93f6c7aa1 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/BaseDao.kt @@ -0,0 +1,44 @@ +package com.topjohnwu.magisk.data.database.magiskdb + +import androidx.annotation.StringDef +import com.topjohnwu.superuser.Shell +import io.reactivex.Single + +abstract class BaseDao { + + object Table { + const val POLICY = "policies" + const val LOG = "logs" + const val SETTINGS = "settings" + const val STRINGS = "strings" + } + + @StringDef(Table.POLICY, Table.LOG, Table.SETTINGS, Table.STRINGS) + @Retention(AnnotationRetention.SOURCE) + annotation class TableStrict + + @TableStrict + abstract val table: String + + inline fun <reified Builder : Query.Builder> query(builder: Builder.() -> Unit = {}) = + Builder::class.java.newInstance() + .apply { table = this@BaseDao.table } + .apply(builder) + .toString() + .let { Query(it) } + .query() + +} + +fun Query.query() = query.su() + +private fun String.suRaw() = Single.fromCallable { Shell.su(this).exec().out } +private fun String.su() = suRaw().map { it.toMap() } + +private fun List<String>.toMap() = map { it.split(Regex("\\|")) } + .map { it.toMapInternal() } + +private fun List<String>.toMapInternal() = map { it.split("=", limit = 2) } + .filter { it.size == 2 } + .map { Pair(it[0], it[1]) } + .toMap() diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQueryBuilder.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/Query.kt similarity index 76% rename from app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQueryBuilder.kt rename to app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/Query.kt index 01777d0ad..d34542296 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQueryBuilder.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/Query.kt @@ -1,27 +1,17 @@ -package com.topjohnwu.magisk.data.database.base +package com.topjohnwu.magisk.data.database.magiskdb import androidx.annotation.StringDef -import com.topjohnwu.magisk.data.database.base.Order.Companion.ASC -import com.topjohnwu.magisk.data.database.base.Order.Companion.DESC -interface MagiskQueryBuilder { +class Query(private val _query: String) { + val query get() = "magisk --sqlite '$_query'" - val requestType: String - var table: String - - companion object { - inline operator fun <reified Builder : MagiskQueryBuilder> invoke(builder: Builder.() -> Unit): MagiskQuery = - Builder::class.java.newInstance() - .apply(builder) - .toString() - .let { - MagiskQuery(it) - } + interface Builder { + val requestType: String + var table: String } - } -class Delete : MagiskQueryBuilder { +class Delete : Query.Builder { override val requestType: String = "DELETE FROM" override var table = "" @@ -36,7 +26,7 @@ class Delete : MagiskQueryBuilder { } } -class Select : MagiskQueryBuilder { +class Select : Query.Builder { override val requestType: String get() = "SELECT $fields FROM" override lateinit var table: String @@ -69,7 +59,7 @@ class Replace : Insert() { override val requestType: String = "REPLACE INTO" } -open class Insert : MagiskQueryBuilder { +open class Insert : Query.Builder { override val requestType: String = "INSERT INTO" override lateinit var table: String @@ -137,19 +127,11 @@ class Condition { } } -class Order { - - @set:OrderStrict - var order = DESC - var field = "" - - companion object { - const val ASC = "ASC" - const val DESC = "DESC" - } - +object Order { + const val ASC = "ASC" + const val DESC = "DESC" } -@StringDef(ASC, DESC) +@StringDef(Order.ASC, Order.DESC) @Retention(AnnotationRetention.SOURCE) -annotation class OrderStrict \ No newline at end of file +annotation class OrderStrict diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt index 733eb85b9..b39f52dee 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt @@ -2,11 +2,11 @@ package com.topjohnwu.magisk.data.repository import com.topjohnwu.magisk.Const import com.topjohnwu.magisk.data.database.LogDao -import com.topjohnwu.magisk.data.database.base.suRaw import com.topjohnwu.magisk.extensions.toSingle import com.topjohnwu.magisk.model.entity.MagiskLog import com.topjohnwu.magisk.model.entity.WrappedMagiskLog import com.topjohnwu.superuser.Shell +import io.reactivex.Single import java.util.concurrent.TimeUnit @@ -18,8 +18,9 @@ class LogRepository( .map { it.sortByDescending { it.date.time }; it } .map { it.wrap() } - fun fetchMagiskLogs() = "tail -n 5000 ${Const.MAGISK_LOG}".suRaw() - .filter { it.isNotEmpty() } + fun fetchMagiskLogs() = Single.fromCallable { + Shell.su("tail -n 5000 ${Const.MAGISK_LOG}").exec().out + }.filter { it.isNotEmpty() } fun clearLogs() = logDao.deleteAll() fun clearOutdated() = logDao.deleteOutdated() @@ -37,4 +38,4 @@ class LogRepository( } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt index b9a4ae98b..eb1d3c5d7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt @@ -3,7 +3,6 @@ package com.topjohnwu.magisk.data.repository import android.content.pm.PackageManager import com.topjohnwu.magisk.Config import com.topjohnwu.magisk.Info -import com.topjohnwu.magisk.data.database.base.su import com.topjohnwu.magisk.data.network.GithubRawServices import com.topjohnwu.magisk.extensions.getLabel import com.topjohnwu.magisk.extensions.packageName @@ -57,7 +56,7 @@ class MagiskRepository( .toList() fun toggleHide(isEnabled: Boolean, packageName: String, process: String) = - "magiskhide --%s %s %s".format(isEnabled.state, packageName, process).su().ignoreElement() + Shell.su("magiskhide --${isEnabled.state} $packageName $process").submit() private val Boolean.state get() = if (this) "add" else "rm" diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt index 8e09a010f..2640abcad 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt @@ -90,9 +90,7 @@ class HideViewModel( .toList() .map { it to items.calculateDiff(it) } - private fun toggleItem(item: HideProcessRvItem) = magiskRepo - .toggleHide(item.isHidden.value, item.packageName, item.process) - .subscribeK() - .add() + private fun toggleItem(item: HideProcessRvItem) = + magiskRepo.toggleHide(item.isHidden.value, item.packageName, item.process) -} \ No newline at end of file +}