summaryrefslogtreecommitdiff
path: root/app/src/main/java
diff options
context:
space:
mode:
authorTyler Nijmeh <tylernij@gmail.com>2021-03-30 19:43:10 -0700
committerTyler Nijmeh <tylernij@gmail.com>2021-03-30 19:43:10 -0700
commit3636c8c51cc9221db8ef4ade6c4231b68bd553ba (patch)
treef0fc5675e508a13bcae5414b7ce70311449a8dd4 /app/src/main/java
parent00acb7483a1c207670062d15991a82266b91735c (diff)
Add permission validation
Signed-off-by: Tyler Nijmeh <tylernij@gmail.com>
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/com/draco/buoy/MainActivity.kt11
-rw-r--r--app/src/main/java/com/draco/buoy/utils/PermissionUtils.kt11
-rw-r--r--app/src/main/java/com/draco/buoy/viewmodels/MainActivityViewModel.kt7
-rw-r--r--app/src/main/java/com/draco/buoy/viewmodels/PermissionActivityViewModel.kt48
-rw-r--r--app/src/main/java/com/draco/buoy/views/MainActivity.kt28
-rw-r--r--app/src/main/java/com/draco/buoy/views/PermissionActivity.kt41
6 files changed, 135 insertions, 11 deletions
diff --git a/app/src/main/java/com/draco/buoy/MainActivity.kt b/app/src/main/java/com/draco/buoy/MainActivity.kt
deleted file mode 100644
index 18eb9db..0000000
--- a/app/src/main/java/com/draco/buoy/MainActivity.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.draco.buoy
-
-import androidx.appcompat.app.AppCompatActivity
-import android.os.Bundle
-
-class MainActivity : AppCompatActivity() {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- }
-} \ No newline at end of file
diff --git a/app/src/main/java/com/draco/buoy/utils/PermissionUtils.kt b/app/src/main/java/com/draco/buoy/utils/PermissionUtils.kt
new file mode 100644
index 0000000..13dc385
--- /dev/null
+++ b/app/src/main/java/com/draco/buoy/utils/PermissionUtils.kt
@@ -0,0 +1,11 @@
+package com.draco.buoy.utils
+
+import android.content.Context
+import android.content.pm.PackageManager
+
+class PermissionUtils {
+ companion object {
+ fun isPermissionsGranted(context: Context, permission: String): Boolean =
+ context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/com/draco/buoy/viewmodels/MainActivityViewModel.kt b/app/src/main/java/com/draco/buoy/viewmodels/MainActivityViewModel.kt
new file mode 100644
index 0000000..443b494
--- /dev/null
+++ b/app/src/main/java/com/draco/buoy/viewmodels/MainActivityViewModel.kt
@@ -0,0 +1,7 @@
+package com.draco.buoy.viewmodels
+
+import android.app.Application
+import androidx.lifecycle.AndroidViewModel
+
+class MainActivityViewModel(application: Application) : AndroidViewModel(application) {
+} \ No newline at end of file
diff --git a/app/src/main/java/com/draco/buoy/viewmodels/PermissionActivityViewModel.kt b/app/src/main/java/com/draco/buoy/viewmodels/PermissionActivityViewModel.kt
new file mode 100644
index 0000000..7ee2e58
--- /dev/null
+++ b/app/src/main/java/com/draco/buoy/viewmodels/PermissionActivityViewModel.kt
@@ -0,0 +1,48 @@
+package com.draco.buoy.viewmodels
+
+import android.app.Application
+import androidx.lifecycle.AndroidViewModel
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.viewModelScope
+import com.draco.buoy.utils.PermissionUtils
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+
+class PermissionActivityViewModel(application: Application) : AndroidViewModel(application) {
+ private val _permissionGranted = MutableLiveData(false)
+ val permissionGranted: LiveData<Boolean> = _permissionGranted
+
+ private fun askRootPermission() {
+ try {
+ ProcessBuilder(
+ "su",
+ "-c",
+ "pm grant com.draco.purr android.permission.WRITE_SECURE_SETTINGS"
+ ).start()
+ } catch (_: Exception) {}
+ }
+
+ private fun isWriteSecureSettingsPermissionGranted(): Boolean {
+ val context = getApplication<Application>().applicationContext
+ return PermissionUtils.isPermissionsGranted(context, android.Manifest.permission.WRITE_SECURE_SETTINGS)
+ }
+
+ private fun startPermissionCheckLoop() {
+ viewModelScope.launch(Dispatchers.IO) {
+ while (!isWriteSecureSettingsPermissionGranted())
+ delay(100)
+ _permissionGranted.postValue(true)
+ }
+ }
+
+ init {
+ if (!isWriteSecureSettingsPermissionGranted()) {
+ viewModelScope.launch(Dispatchers.IO) {
+ askRootPermission()
+ }
+ startPermissionCheckLoop()
+ }
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/com/draco/buoy/views/MainActivity.kt b/app/src/main/java/com/draco/buoy/views/MainActivity.kt
new file mode 100644
index 0000000..10a56b9
--- /dev/null
+++ b/app/src/main/java/com/draco/buoy/views/MainActivity.kt
@@ -0,0 +1,28 @@
+package com.draco.buoy.views
+
+import android.content.Intent
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import androidx.activity.viewModels
+import com.draco.buoy.R
+import com.draco.buoy.utils.PermissionUtils
+import com.draco.buoy.viewmodels.MainActivityViewModel
+
+class MainActivity : AppCompatActivity() {
+ private val viewModel: MainActivityViewModel by viewModels()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+
+ if (!PermissionUtils.isPermissionsGranted(this, android.Manifest.permission.WRITE_SECURE_SETTINGS)) {
+ goToPermissionActivity()
+ return
+ }
+ }
+
+ private fun goToPermissionActivity() {
+ val intent = Intent(this, PermissionActivity::class.java)
+ startActivity(intent)
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/com/draco/buoy/views/PermissionActivity.kt b/app/src/main/java/com/draco/buoy/views/PermissionActivity.kt
new file mode 100644
index 0000000..d3b8b62
--- /dev/null
+++ b/app/src/main/java/com/draco/buoy/views/PermissionActivity.kt
@@ -0,0 +1,41 @@
+package com.draco.buoy.views
+
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context
+import android.os.Bundle
+import android.widget.TextView
+import androidx.activity.viewModels
+import androidx.appcompat.app.AppCompatActivity
+import com.draco.buoy.R
+import com.draco.buoy.viewmodels.PermissionActivityViewModel
+import com.google.android.material.snackbar.Snackbar
+
+class PermissionActivity : AppCompatActivity() {
+ private val viewModel: PermissionActivityViewModel by viewModels()
+
+ private lateinit var command: TextView
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_permission)
+
+ command = findViewById(R.id.command)
+
+ command.setOnClickListener {
+ val clipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
+ val clip = ClipData.newPlainText("ADB Command", command.text.toString())
+ clipboardManager.setPrimaryClip(clip)
+
+ Snackbar.make(command, R.string.copied, Snackbar.LENGTH_SHORT).show()
+ }
+
+ viewModel.permissionGranted.observe(this) {
+ if (it == true)
+ finish()
+ }
+ }
+
+ /* Disallow exit */
+ override fun onBackPressed() {}
+} \ No newline at end of file