diff options
author | YuutaW <17158086+Trumeet@users.noreply.github.com> | 2019-02-28 19:50:55 -0800 |
---|---|---|
committer | YuutaW <17158086+Trumeet@users.noreply.github.com> | 2019-02-28 19:50:55 -0800 |
commit | 39de35e09424c573670d4c56742c17a3bdbe8108 (patch) | |
tree | 7b339eae41a14d0e54da967b65c2c78e66fcd9f0 /app/src/main/java/moe/yuuta/workmode | |
parent | 1ff7d4d73a0c7d89487f40ccdab7433685e2200b (diff) | |
download | WorkMode-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')
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 |