aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/moe/yuuta/workmode
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/moe/yuuta/workmode')
-rw-r--r--app/src/main/java/moe/yuuta/workmode/MainActivity.kt41
-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
-rw-r--r--app/src/main/java/moe/yuuta/workmode/gpl/GPL.kt47
5 files changed, 23 insertions, 255 deletions
diff --git a/app/src/main/java/moe/yuuta/workmode/MainActivity.kt b/app/src/main/java/moe/yuuta/workmode/MainActivity.kt
index 587a86a..de913c3 100644
--- a/app/src/main/java/moe/yuuta/workmode/MainActivity.kt
+++ b/app/src/main/java/moe/yuuta/workmode/MainActivity.kt
@@ -27,11 +27,8 @@ import com.elvishew.xlog.XLog
import com.google.android.gms.oss.licenses.OssLicensesMenuActivity
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.tabs.TabLayout
-import moe.yuuta.gplicense.LicenseCheckerCallback
-import moe.yuuta.gplicense.Policy
import moe.yuuta.workmode.access.AccessorStarter
import moe.yuuta.workmode.async.*
-import moe.yuuta.workmode.gpl.GPL
import moe.yuuta.workmode.suspend.AsyncSuspender
import moe.yuuta.workmode.suspend.SuspendTile
import moe.yuuta.workmode.suspend.data.*
@@ -40,7 +37,7 @@ import moe.yuuta.workmode.utils.Utils
import java.util.concurrent.CompletableFuture
import java.util.stream.Collectors
-class MainActivity : AppCompatActivity(), SwitchBar.OnSwitchChangeListener, View.OnClickListener, LicenseCheckerCallback, moe.yuuta.workmode.update.Callback, LifecycleUIUpdateReceiver.Callback {
+class MainActivity : AppCompatActivity(), SwitchBar.OnSwitchChangeListener, View.OnClickListener, moe.yuuta.workmode.update.Callback, LifecycleUIUpdateReceiver.Callback {
private val logger: Logger = XLog.tag("MainActivity").build()
companion object {
@@ -79,7 +76,6 @@ class MainActivity : AppCompatActivity(), SwitchBar.OnSwitchChangeListener, View
mCheckUpdateObserver = LifecycleUpdateChecker(this, this)
lifecycle.addObserver(LifecycleUIUpdateReceiver(this, this))
lifecycle.addObserver(mCheckUpdateObserver)
- lifecycle.addObserver(GPL(this, lifecycle, this))
setProgressUI(false)
}
@@ -341,35 +337,14 @@ class MainActivity : AppCompatActivity(), SwitchBar.OnSwitchChangeListener, View
return@map it.copyToSimpleTransferableInfo()
}
.collect(Collectors.toList()))
- startActivityForResult(Intent(this, ApplicationPickerActivity::class.java)
- .putExtra(ApplicationPickerActivity.EXTRA_SELECTED_PACKAGES,
- selected), RC_PICK)
- }
- }
- }
-
- override fun allow(reason: Int) = proceedLicensing(reason)
-
- override fun dontAllow(reason: Int) = proceedLicensing(reason)
-
- override fun applicationError(errorCode: Int) {
- logger.e("StatusException: $errorCode")
- SuspendedStorage.get(this).reportCrack("a_e", "co: $errorCode")
- }
-
- private fun proceedLicensing(reason: Int) {
- logger.d("Status: ${
- when (reason) {
- Policy.LICENSED -> "OK"
- Policy.NOT_LICENSED -> "Fail"
- Policy.RETRY -> "Unknown"
- else -> "? $reason"
+ startActivityForResult(
+ Intent(this, ApplicationPickerActivity::class.java)
+ .putExtra(
+ ApplicationPickerActivity.EXTRA_SELECTED_PACKAGES,
+ selected
+ ), RC_PICK
+ )
}
- }")
- when (reason) {
- Policy.LICENSED -> SuspendedStorage.get(this).removeCrack("g_p_l")
- Policy.NOT_LICENSED -> SuspendedStorage.get(this).reportCrack("g_p_l", "n_p")
- Policy.RETRY -> SuspendedStorage.get(this).reportCrack("g_p_l", "rt")
}
}
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
diff --git a/app/src/main/java/moe/yuuta/workmode/gpl/GPL.kt b/app/src/main/java/moe/yuuta/workmode/gpl/GPL.kt
deleted file mode 100644
index 3824f19..0000000
--- a/app/src/main/java/moe/yuuta/workmode/gpl/GPL.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-package moe.yuuta.workmode.gpl
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.provider.Settings
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleObserver
-import androidx.lifecycle.OnLifecycleEvent
-import moe.yuuta.gplicense.AESObfuscator
-import moe.yuuta.gplicense.LicenseChecker
-import moe.yuuta.gplicense.LicenseCheckerCallback
-import moe.yuuta.gplicense.ServerManagedPolicy
-import moe.yuuta.workmode.BuildConfig
-
-// #Anti-Crack
-// Google Play Licenser
-class GPL(
- private val context: Context,
- private val lifecycle: Lifecycle,
- private val callback: LicenseCheckerCallback
-) : LifecycleObserver {
- private val SALT = byteArrayOf(
- -90, 83, 80, -91, -37, -57, 74, -69, 52, 89,
- -9, -5, -77, -71, -36, -79, -11, 37, -69, 88
- )
-
- private lateinit var instance: LicenseChecker
-
- @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
- fun start() {
- @SuppressLint("HardwareIds") val android_id = Settings.Secure.getString(context.contentResolver,
- Settings.Secure.ANDROID_ID)
- instance = LicenseChecker(
- context,
- ServerManagedPolicy(context, AESObfuscator(SALT, BuildConfig.APPLICATION_ID, android_id)),
- BuildConfig.GOOGLE_PLAY_LICENSING_KEY
- )
- instance.checkAccess(callback)
- }
-
- @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
- fun destroy() {
- if (::instance.isInitialized) {
- instance.onDestroy()
- }
- }
-} \ No newline at end of file