diff options
Diffstat (limited to 'app/src/main/java')
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 |
