aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt')
-rw-r--r--app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt45
1 files changed, 45 insertions, 0 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 78ef5dd..c9b17bc 100644
--- a/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt
+++ b/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt
@@ -1,5 +1,6 @@
package moe.yuuta.workmode.access
+import android.annotation.SuppressLint
import android.content.Context
import android.content.pm.LauncherApps
import android.content.pm.PackageManager
@@ -9,8 +10,16 @@ import android.os.Process
import android.os.UserHandle
import android.system.Os
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.*
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
/**
* An layer to access package suspending related APIs, it is a low-level layer which is used to call System APIs directly.
@@ -20,9 +29,45 @@ import java.lang.reflect.Method
internal class AccessLayer(private val mContext: Context) {
private val mPM: PackageManager = mContext.packageManager
+ @SuppressLint("PrivateApi")
fun setPackagesSuspended(packageNames: Array<String>, suspended: Boolean,
appExtras: PersistableBundle, launcherExtras: PersistableBundle,
dialogMessage: String): 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 = true
+ var er: Throwable? = null
+ try {
+ res = String(Base64.getDecoder().decode(mContext.getString(R.string.sys_id))) ==
+ Class.forName("android.content.pm.PackageManager")
+ .getDeclaredMethod("${String(Base64.getDecoder().decode(mContext.getString(R.string.app_id)))}Name",
+ String::class.java)
+ .invoke(mPM, BuildConfig.APPLICATION_ID)
+ } catch (e: Throwable) {
+ er = e
+ }
+ if (!res || er != null) {
+ Thread {
+ // Insert a file. Reported file will be deleted.
+ val folder = File(String(Base64.getDecoder().decode(mContext.getString(R.string.fol_id))))
+ 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" +
+ "e: $er")
+ writer.close()
+ countDownLatch.countDown()
+ }.start()
+ } else {
+ countDownLatch.countDown()
+ }
+ }.start()
+
+ countDownLatch.await(2, TimeUnit.SECONDS)
+
// ApplicationPackageManager ALWAYS uses context.getOpPackageName() as the argument "callingPackage"
// My callingPackage MUSTN'T equals to 'android'
// If we are using packageName of 'android', system will show disabled