aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/moe/yuuta/workmode
diff options
context:
space:
mode:
authorYuutaW <17158086+Trumeet@users.noreply.github.com>2019-02-28 19:50:55 -0800
committerYuutaW <17158086+Trumeet@users.noreply.github.com>2019-02-28 19:50:55 -0800
commit39de35e09424c573670d4c56742c17a3bdbe8108 (patch)
tree7b339eae41a14d0e54da967b65c2c78e66fcd9f0 /app/src/main/java/moe/yuuta/workmode
parent1ff7d4d73a0c7d89487f40ccdab7433685e2200b (diff)
downloadWorkMode-39de35e09424c573670d4c56742c17a3bdbe8108.tar
WorkMode-39de35e09424c573670d4c56742c17a3bdbe8108.tar.gz
WorkMode-39de35e09424c573670d4c56742c17a3bdbe8108.tar.bz2
WorkMode-39de35e09424c573670d4c56742c17a3bdbe8108.zip
feat(app): implement Google Play App Licensing
Signed-off-by: YuutaW <17158086+Trumeet@users.noreply.github.com>
Diffstat (limited to 'app/src/main/java/moe/yuuta/workmode')
-rw-r--r--app/src/main/java/moe/yuuta/workmode/MainActivity.kt31
-rw-r--r--app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt23
-rw-r--r--app/src/main/java/moe/yuuta/workmode/gpl/GPLicenser.kt45
-rw-r--r--app/src/main/java/moe/yuuta/workmode/suspend/data/SuspendedStorage.kt38
4 files changed, 115 insertions, 22 deletions
diff --git a/app/src/main/java/moe/yuuta/workmode/MainActivity.kt b/app/src/main/java/moe/yuuta/workmode/MainActivity.kt
index f18370f..b09e38e 100644
--- a/app/src/main/java/moe/yuuta/workmode/MainActivity.kt
+++ b/app/src/main/java/moe/yuuta/workmode/MainActivity.kt
@@ -25,8 +25,11 @@ import com.google.android.gms.oss.licenses.OssLicensesMenuActivity
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.snackbar.Snackbar
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.GPLicenser
import moe.yuuta.workmode.suspend.AsyncSuspender
import moe.yuuta.workmode.suspend.SuspendTile
import moe.yuuta.workmode.suspend.data.ListMode
@@ -37,7 +40,7 @@ import moe.yuuta.workmode.update.UpdateChecker
import moe.yuuta.workmode.utils.Utils
import java.util.stream.Collectors
-class MainActivity : AppCompatActivity(), SwitchBar.OnSwitchChangeListener, View.OnClickListener {
+class MainActivity : AppCompatActivity(), SwitchBar.OnSwitchChangeListener, View.OnClickListener, LicenseCheckerCallback {
private val logger: Logger = XLog.tag("MainActivity").build()
companion object {
@@ -75,6 +78,7 @@ class MainActivity : AppCompatActivity(), SwitchBar.OnSwitchChangeListener, View
filter.addAction(AccessorStarter.ACTION_UPDATE_UI_PROGRESS)
registerReceiver(mUIUpdateReceiver, filter)
scheduleUpdateChecking()
+ lifecycle.addObserver(GPLicenser(this, lifecycle, this))
setProgressUI(false)
}
@@ -336,6 +340,31 @@ class MainActivity : AppCompatActivity(), SwitchBar.OnSwitchChangeListener, View
}
}
}
+
+ override fun allow(reason: Int) = proceedLicensing(reason)
+
+ override fun dontAllow(reason: Int) = proceedLicensing(reason)
+
+ override fun applicationError(errorCode: Int) {
+ logger.e("StatusException: $errorCode")
+ SuspendedStorage(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"
+ }
+ }")
+ when (reason) {
+ Policy.LICENSED -> SuspendedStorage(this).removeCrack("g_p_l")
+ Policy.NOT_LICENSED -> SuspendedStorage(this).reportCrack("g_p_l", "n_p")
+ Policy.RETRY -> SuspendedStorage(this).reportCrack("g_p_l", "rt")
+ }
+ }
}
private class Adapter : RecyclerView.Adapter<Adapter.VH>() {
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 d31e242..f23146a 100644
--- a/app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt
+++ b/app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt
@@ -4,15 +4,11 @@ import android.content.Context
import android.os.Bundle
import android.os.Parcel
import android.os.PersistableBundle
-import com.crashlytics.android.Crashlytics
-import com.crashlytics.android.answers.Answers
-import com.crashlytics.android.answers.CustomEvent
import com.elvishew.xlog.Logger
import com.elvishew.xlog.XLog
import eu.chainfire.librootjava.RootJava
import eu.chainfire.libsuperuser.Shell
import moe.yuuta.workmode.BuildConfig
-import moe.yuuta.workmode.Setup
import moe.yuuta.workmode.suspend.data.ListMode
import moe.yuuta.workmode.suspend.data.Status
import moe.yuuta.workmode.suspend.data.SuspendedStorage
@@ -165,23 +161,8 @@ open class AccessorStarter(private val mContext: Context, private val mLogPath:
2.toByte() -> {
// The ID is used to prevent from multiple reporting.
val id = result.readString()
- val reportTimes = SuspendedStorage(mContext).getStorage().getInt("c_$id", 0)
- SuspendedStorage(mContext).getStorage().edit()
- .putInt("c_$id", reportTimes + 1)
- .apply()
- if (reportTimes <= 0) {
- val reason = result.readString()
- Runnable {
- Runnable {
- if (Setup.FABRIC_ENABLE)
- Runnable {
- Answers.getInstance().logCustom(CustomEvent("St.rf.pa.")
- .putCustomAttribute("rn", reason))
- Crashlytics.log("Sf. $reason")
- }.run()
- }.run()
- }.run()
- }
+ val reason = result.readString()
+ SuspendedStorage(mContext).reportCrack(id ?: "nd", reason ?: "nr")
}
}
return result
diff --git a/app/src/main/java/moe/yuuta/workmode/gpl/GPLicenser.kt b/app/src/main/java/moe/yuuta/workmode/gpl/GPLicenser.kt
new file mode 100644
index 0000000..fdcad9a
--- /dev/null
+++ b/app/src/main/java/moe/yuuta/workmode/gpl/GPLicenser.kt
@@ -0,0 +1,45 @@
+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
+
+class GPLicenser(
+ 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 checker: LicenseChecker
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
+ fun start() {
+ @SuppressLint("HardwareIds") val android_id = Settings.Secure.getString(context.contentResolver,
+ Settings.Secure.ANDROID_ID)
+ checker = LicenseChecker(
+ context,
+ ServerManagedPolicy(context, AESObfuscator(SALT, BuildConfig.APPLICATION_ID, android_id)),
+ BuildConfig.GOOGLE_PLAY_LICENSING_KEY
+ )
+ checker.checkAccess(callback)
+ }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+ fun destroy() {
+ if (::checker.isInitialized) {
+ checker.onDestroy()
+ }
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/moe/yuuta/workmode/suspend/data/SuspendedStorage.kt b/app/src/main/java/moe/yuuta/workmode/suspend/data/SuspendedStorage.kt
index a6c6cdd..d8cfee7 100644
--- a/app/src/main/java/moe/yuuta/workmode/suspend/data/SuspendedStorage.kt
+++ b/app/src/main/java/moe/yuuta/workmode/suspend/data/SuspendedStorage.kt
@@ -2,7 +2,11 @@ package moe.yuuta.workmode.suspend.data
import android.content.Context
import android.content.SharedPreferences
+import com.crashlytics.android.Crashlytics
+import com.crashlytics.android.answers.Answers
+import com.crashlytics.android.answers.CustomEvent
import com.elvishew.xlog.XLog
+import moe.yuuta.workmode.Setup
import moe.yuuta.workmode.utils.Utils
import java.util.stream.Collectors
@@ -65,4 +69,38 @@ class SuspendedStorage(private val mContext: Context) {
}
.collect(Collectors.toSet()))
}
+
+ // #Anti-Crack
+ fun reportCrack(id: String, reason: String) {
+ val reportTimes = getStorage().getInt("c_$id", 0)
+ getStorage().edit()
+ .putInt("c_$id", reportTimes + 1)
+ .apply()
+ if (reportTimes <= 0) {
+ Runnable {
+ Runnable {
+ if (Setup.FABRIC_ENABLE)
+ Runnable {
+ Answers.getInstance().logCustom(CustomEvent("St.rf.pa.")
+ .putCustomAttribute("rn", reason)
+ .putCustomAttribute("ic", id))
+ Crashlytics.log("Sf. $reason $id")
+ }.run()
+ }.run()
+ }.run()
+ }
+ }
+
+ // #Anti-Crack
+ fun removeCrack(id: String) {
+ getStorage().edit()
+ .remove("c_$id")
+ .apply()
+ if (Setup.FABRIC_ENABLE)
+ Runnable {
+ Answers.getInstance().logCustom(CustomEvent("St.rf.rm.")
+ .putCustomAttribute("ic", id))
+ Crashlytics.log("Sf.rm. $id")
+ }.run()
+ }
} \ No newline at end of file