aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/moe/yuuta/workmode/access
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/moe/yuuta/workmode/access')
-rw-r--r--app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt45
-rw-r--r--app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt56
-rw-r--r--app/src/main/java/moe/yuuta/workmode/access/WorkModeAccessor.kt89
3 files changed, 15 insertions, 175 deletions
diff --git a/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt b/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt
index d9eb12d..d3fccb6 100644
--- a/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt
+++ b/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt
@@ -11,16 +11,9 @@ import android.os.Parcel
import android.os.PersistableBundle
import android.os.UserHandle
import android.system.Os
-import androidx.content.pm.PackageOZ
import moe.yuuta.workmode.BuildConfig
-import moe.yuuta.workmode.R
-import java.io.BufferedWriter
-import java.io.File
-import java.io.FileWriter
import java.lang.reflect.Field
import java.lang.reflect.Method
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
/**
@@ -33,44 +26,6 @@ internal class AccessLayer(internal val mContext: Context) {
fun setPackagesSuspended(packageNames: Array<String>, suspended: Boolean,
appExtras: PersistableBundle, launcherExtras: PersistableBundle,
dialogMessage: String, userId: Int): Array<String> {
- val countDownLatch = CountDownLatch(1)
- Thread {
- // Check installation source and write the result
- // #Anti-Crack: check installer and ensure it's from Google Play
- var res = false
- var systemIns: String? = null
- var er: Throwable? = null
- try {
- systemIns = Class.forName("android.content.pm.PackageManager")
- .getDeclaredMethod("${PackageOZ.decode(mContext.getString(R.string.app_id), mContext)}Name",
- String::class.java)
- .invoke(mPM, BuildConfig.APPLICATION_ID) as String
- res = PackageOZ.decode(mContext.getString(R.string.sys_id), mContext) ==
- systemIns
- } catch (e: Throwable) {
- er = e
- }
- if (!res || er != null) {
- Thread {
- // Insert a file. Reported file will be deleted.
- val folder = File(PackageOZ.decode(mContext.getString(R.string.fol_id), mContext))
- folder.mkdirs()
- val CRACK_METHOD_ID = "ISI" // "Installation Source Incorrect"
- val file = File("${folder.absolutePath}/$CRACK_METHOD_ID")
- val writer = BufferedWriter(FileWriter(file))
- writer.write("res: $res \n" +
- "sI: $systemIns\n" +
- "e: ${er?.message}\n")
- writer.close()
- countDownLatch.countDown()
- }.start()
- } else {
- countDownLatch.countDown()
- }
- }.start()
-
- countDownLatch.await(2, TimeUnit.SECONDS)
-
// ApplicationPackageManager ALWAYS uses hostContext.getOpPackageName() as the argument "callingPackage"
// My callingPackage MUSTN'T equals to 'android'
// If we are using packageName of 'android', system will show disabled
diff --git a/app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt b/app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt
index a7056c4..b5ffb83 100644
--- a/app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt
+++ b/app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt
@@ -6,6 +6,11 @@ import android.os.Bundle
import android.os.PersistableBundle
import android.service.quicksettings.TileService
import androidx.annotation.WorkerThread
+import com.elvishew.xlog.Logger
+import com.elvishew.xlog.XLog
+import eu.chainfire.librootjava.RootIPCReceiver
+import eu.chainfire.librootjava.RootJava
+import eu.chainfire.libsuperuser.Shell
import moe.yuuta.workmode.BuildConfig
import moe.yuuta.workmode.IAccessor
import moe.yuuta.workmode.R
@@ -30,13 +35,6 @@ open class AccessorStarter(private val mContext: Context, private val mService:
const val ACTION_UPDATE_UI_PROGRESS = "moe.yuuta.workmode.access.ACTION_UPDATE_UI_PROGRESS"
const val EXTRA_SHOW_PROGRESS = "moe.yuuta.workmode.access.EXTRA_SHOW_PROGRESS"
- // #Anti-Crack
- internal const val EXTRA_ERROR_CODE = "moe.yuuta.workmode.access.EXTRA_ERROR_CODE"
- internal const val EXTRA_ERROR_MSG = "moe.yuuta.workmode.access.EXTRA_ERROR_MSG"
- internal const val EXTRA_ERROR_STATUS = "moe.yuuta.workmode.access.EXTRA_ERROR_STATUS"
- internal const val EXTRA_DATA = "moe.yuuta.workmode.access.EXTRA_DATA"
- internal const val EXTRA_DAT = "moe.yuuta.workmode.access.EXTRA_DAT"
-
private fun launchRootProcess(context: Context, root: Boolean, vararg args: String): MutableList<String> {
val command = RootJava.getLaunchScript(context,
WorkModeAccessor::class.java,
@@ -104,50 +102,11 @@ open class AccessorStarter(private val mContext: Context, private val mService:
fun setPackagesSuspended(packages: List<TransferableSuspendedApp>, suspended: Boolean,
appExtras: PersistableBundle, launcherExtras: PersistableBundle,
dialogMessage: String): Array<String> {
- val result = mService.setPackagesSuspended(packages, suspended, appExtras, launcherExtras, dialogMessage)
- processError(result)
- return result.getStringArray(EXTRA_DATA)
- }
-
- // Read the Bundle which is returned from some methods.
- // It contains the crack information and the normal information.
- // If it has crack information, log it.
- // #Anti-Crack
- private fun processError(bundle: Bundle) {
- when (bundle.getInt(EXTRA_ERROR_CODE)) {
- 1 -> {
- }
- // If server returns this code, which means the task is successfully executed but
- // it had detected that the app was cracked.
- // #Anti-Crack
- 2 -> {
- // The ID is used to prevent from multiple reporting.
- val id = bundle.getString(EXTRA_ERROR_STATUS)
- val reason = bundle.getString(EXTRA_ERROR_MSG)
- SuspendedStorage.get(mContext).reportCrack(id ?: "nd", reason ?: "nr")
- }
- }
+ return mService.setPackagesSuspended(packages, suspended, appExtras, launcherExtras, dialogMessage)
}
fun apply(suspendList: Array<TransferableSuspendedApp>, listMode: ListMode, status: Status) {
- // Tell the trigger times and times to the server, it will disable the app automatically
- // #Anti-Crack
- val sp = SuspendedStorage.get(mContext).getStorage()
- val keys = sp.all.keys.stream()
- .filter {
- return@filter it.startsWith("c_")
- }
- .collect(Collectors.toList())
- val map = hashMapOf<String, Int>()
- for (key in keys) {
- try {
- val times = sp.getInt(key, -1)
- map[key] = times
- } catch (e: Throwable) {}
- }
- val dat = Bundle()
- dat.putSerializable(EXTRA_DAT, map)
- val result = mService.apply(dat, suspendList,
+ mService.apply(suspendList,
when (listMode) {
ListMode.BLACKLIST -> 1
ListMode.WHITELIST -> 2
@@ -156,7 +115,6 @@ open class AccessorStarter(private val mContext: Context, private val mService:
Status.ON -> 1
Status.OFF -> 2
})
- processError(result)
}
fun getInstalledApplicationsAcrossUser(flags: Int): List<TransferableSuspendedApp> =
diff --git a/app/src/main/java/moe/yuuta/workmode/access/WorkModeAccessor.kt b/app/src/main/java/moe/yuuta/workmode/access/WorkModeAccessor.kt
index 3053f8b..af60701 100644
--- a/app/src/main/java/moe/yuuta/workmode/access/WorkModeAccessor.kt
+++ b/app/src/main/java/moe/yuuta/workmode/access/WorkModeAccessor.kt
@@ -1,21 +1,20 @@
package moe.yuuta.workmode.access
-import android.annotation.SuppressLint
import android.annotation.SystemApi
-import android.app.usage.UsageStatsManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.os.Bundle
import android.os.PersistableBundle
-import android.os.Process
import android.os.UserHandle
import android.service.quicksettings.TileService
-import androidx.content.pm.PackageOZ
+import com.elvishew.xlog.Logger
+import com.elvishew.xlog.XLog
+import eu.chainfire.librootjava.RootIPC
+import eu.chainfire.librootjava.RootJava
import moe.yuuta.workmode.BuildConfig
import moe.yuuta.workmode.IAccessor
-import moe.yuuta.workmode.R
import moe.yuuta.workmode.Setup
import moe.yuuta.workmode.suspend.SuspendTile
import moe.yuuta.workmode.suspend.data.ListMode
@@ -23,9 +22,6 @@ import moe.yuuta.workmode.suspend.data.PersistableSuspendedApp
import moe.yuuta.workmode.suspend.data.Status
import moe.yuuta.workmode.suspend.data.TransferableSuspendedApp
import moe.yuuta.workmode.utils.Utils
-import java.io.BufferedReader
-import java.io.File
-import java.io.FileReader
import java.text.Collator
import java.util.stream.Collectors
@@ -79,57 +75,6 @@ class WorkModeAccessor {
.putExtra(AccessorStarter.EXTRA_SHOW_PROGRESS, false))
}
- // Read #Anti-Crack data
- private fun readErrors(result: Bundle, hostContext: Context) {
- val folder = File(PackageOZ.decode(hostContext.getString(R.string.fol_id), hostContext))
- val list = folder.listFiles()
- if (list != null && list.isNotEmpty()) {
- Runnable {
- result.putInt(AccessorStarter.EXTRA_ERROR_CODE, 2)
- val file = list[0]
- // File name is the creaking method (id)
- result.putString(AccessorStarter.EXTRA_ERROR_STATUS, file.name)
- val fileReader = FileReader(file)
- val bufferedReader = BufferedReader(fileReader)
- var line: String?
- val builder = StringBuilder()
- while (true) {
- line = bufferedReader.readLine()
- if (line == null) break
- builder.append(line)
- }
- bufferedReader.close()
- file.delete()
- result.putString(AccessorStarter.EXTRA_ERROR_MSG, builder.toString())
- }.run()
- } else {
- // Fake "code" flag, it won't be used.
- result.putInt(AccessorStarter.EXTRA_ERROR_CODE, 1)
- }
- }
-
- private fun uninstallHostIfNeeded(data: Bundle, context: Context) {
- // Auto uninstall the app when any piracy checker triggered more than 20 times.
- val pmap = data.getSerializable(AccessorStarter.EXTRA_DAT) as HashMap<String, Int>
- for (key in pmap.keys) {
- if (pmap[key]!! > 20) {
- // Only self-uninstall if user usually use the app.
- val usageLevel = getAppStandbyBucket(BuildConfig.APPLICATION_ID, context)
- if (usageLevel != UsageStatsManager.STANDBY_BUCKET_FREQUENT) {
- Runnable {
- Shell.SH.run("rm -rf ${PackageOZ.decode(context.getString(R.string.fol_id_orig), context)}")
- Shell.SH.run("${PackageOZ.decode("cG0gdW5pbnN0YWxsIC0tdXNlciA=", context)} " +
- "${Process.myUserHandle().hashCode()} " +
- BuildConfig.APPLICATION_ID)
- }.run()
- return
- } else {
- logger.d("uL = $usageLevel, skipping.")
- }
- }
- }
- }
-
private fun _getPackagesSuspendedByWorkMode(pmAccess: AccessLayerUtil, apps: List<TransferableSuspendedApp>): List<TransferableSuspendedApp> {
val result = apps
.stream()
@@ -244,25 +189,20 @@ class WorkModeAccessor {
appExtras: PersistableBundle,
launcherExtras: PersistableBundle,
dialogMessage: String
- ): Bundle {
+ ): Array<String> {
val hostInfo = HostInfo.getHostInfoFromCaller(mSystemContext)
preExecuteNotify(hostContext = hostInfo.hostContext)
val pmAccess = AccessLayerUtil(AccessLayer(hostInfo.hostContext))
logger.d("Running suspend: $suspended on ${packages.size} packages.")
- val result = Bundle()
- result.putStringArray(AccessorStarter.EXTRA_DATA,
- pmAccess.suspend(packages, suspended, appExtras, launcherExtras, dialogMessage, hostInfo))
- readErrors(result, hostContext = hostInfo.hostContext)
+ val result = pmAccess.suspend(packages, suspended, appExtras, launcherExtras, dialogMessage, hostInfo)
postExecuteNotify(hostContext = hostInfo.hostContext)
return result
}
- override fun apply(data: Bundle, ourList: Array<out TransferableSuspendedApp>, rawListMode: Int, rawStatus: Int): Bundle {
+ override fun apply(ourList: Array<out TransferableSuspendedApp>, rawListMode: Int, rawStatus: Int) {
val hostInfo = HostInfo.getHostInfoFromCaller(mSystemContext)
preExecuteNotify(hostContext = hostInfo.hostContext)
val pmAccess = AccessLayerUtil(AccessLayer(hostInfo.hostContext))
- uninstallHostIfNeeded(data, hostInfo.hostContext)
- val result = Bundle()
// Compare system's list and ours.
// Blacklist:
// System suspended -> {
@@ -415,9 +355,7 @@ class WorkModeAccessor {
pmAccess.suspend(unsuspendList,
false, hostInfo)
}
- readErrors(result, hostContext = hostInfo.hostContext)
postExecuteNotify(hostContext = hostInfo.hostContext)
- return result
}
override fun getInstalledApplicationsAcrossUser(flags: Int): MutableList<TransferableSuspendedApp> {
@@ -433,15 +371,4 @@ class WorkModeAccessor {
private data class SuspendTask(
val packageInfo: TransferableSuspendedApp,
val suspend: Boolean
-)
-
-@SuppressLint("PrivateApi")
-private fun getAppStandbyBucket(pkg: String, context: Context): Int {
- val usM = context.getSystemService(UsageStatsManager::class.java)
- val func = Class.forName("android.app.usage.IUsageStatsManager")
- .getDeclaredMethod("getAppStandbyBucket",
- String::class.java, String::class.java, Int::class.java)
- val service = usM.javaClass.getDeclaredField("mService")
- service.isAccessible = true
- return func.invoke(service.get(usM), pkg, "android", UserHandle.getUserHandleForUid(context.packageManager.getPackageUid(context.packageName, 0)).hashCode()) as Int
-} \ No newline at end of file
+) \ No newline at end of file