mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-23 19:15:58 +00:00
add basic auth (PIN)
This commit is contained in:
@@ -24,18 +24,21 @@ android {
|
|||||||
versionCode = 27
|
versionCode = 27
|
||||||
versionName = "5.2"
|
versionName = "5.2"
|
||||||
multiDexEnabled = false
|
multiDexEnabled = false
|
||||||
signingConfig = signingConfigs.getByName("testkey")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
project.gradle.startParameter.excludedTaskNames.add("lint")
|
//project.gradle.startParameter.excludedTaskNames.add("lint")
|
||||||
isMinifyEnabled = true
|
isMinifyEnabled = true
|
||||||
isShrinkResources = true
|
isShrinkResources = true
|
||||||
proguardFiles(
|
proguardFiles(
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||||
"proguard-rules.pro"
|
"proguard-rules.pro"
|
||||||
)
|
)
|
||||||
|
signingConfig = signingConfigs.getByName("testkey")
|
||||||
|
}
|
||||||
|
debug {
|
||||||
|
signingConfig = signingConfigs.getByName("testkey")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compileOptions {
|
compileOptions {
|
||||||
@@ -75,4 +78,5 @@ dependencies {
|
|||||||
implementation(libs.androidx.navigation.compose)
|
implementation(libs.androidx.navigation.compose)
|
||||||
implementation(libs.shizuku.provider)
|
implementation(libs.shizuku.provider)
|
||||||
implementation(libs.shizuku.api)
|
implementation(libs.shizuku.api)
|
||||||
|
implementation(libs.androidx.biometric)
|
||||||
}
|
}
|
||||||
@@ -45,7 +45,10 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name=".AuthActivity"
|
||||||
|
android:theme="@style/Theme.OwnDroid">
|
||||||
|
</activity>
|
||||||
<receiver
|
<receiver
|
||||||
android:name=".Receiver"
|
android:name=".Receiver"
|
||||||
android:description="@string/app_name"
|
android:description="@string/app_name"
|
||||||
|
|||||||
92
app/src/main/java/com/bintianqi/owndroid/Auth.kt
Normal file
92
app/src/main/java/com/bintianqi/owndroid/Auth.kt
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
package com.bintianqi.owndroid
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.activity.compose.setContent
|
||||||
|
import androidx.activity.enableEdgeToEdge
|
||||||
|
import androidx.biometric.BiometricManager
|
||||||
|
import androidx.biometric.BiometricPrompt
|
||||||
|
import androidx.biometric.BiometricPrompt.AuthenticationCallback
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
|
import androidx.compose.material3.Button
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.core.view.WindowCompat
|
||||||
|
import androidx.fragment.app.FragmentActivity
|
||||||
|
import com.bintianqi.owndroid.ui.theme.OwnDroidTheme
|
||||||
|
|
||||||
|
var authenticated = false
|
||||||
|
|
||||||
|
class AuthActivity: FragmentActivity(){
|
||||||
|
@SuppressLint("UnrememberedMutableState")
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
enableEdgeToEdge()
|
||||||
|
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
val mainActivityIntent = Intent(applicationContext, MainActivity::class.java)
|
||||||
|
val sharedPref = applicationContext.getSharedPreferences("data", Context.MODE_PRIVATE)
|
||||||
|
val callback = object: AuthenticationCallback() {
|
||||||
|
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
|
||||||
|
super.onAuthenticationSucceeded(result)
|
||||||
|
authenticated = true
|
||||||
|
startActivity(mainActivityIntent)
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
|
||||||
|
super.onAuthenticationError(errorCode, errString)
|
||||||
|
Toast.makeText(applicationContext, errString, Toast.LENGTH_SHORT).show()
|
||||||
|
/*if (errString.toString().isNotEmpty()) {
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setContent {
|
||||||
|
val materialYou = mutableStateOf(sharedPref.getBoolean("material_you",true))
|
||||||
|
val blackTheme = mutableStateOf(sharedPref.getBoolean("black_theme", false))
|
||||||
|
OwnDroidTheme(materialYou.value, blackTheme.value) {
|
||||||
|
Auth(this, callback)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun Auth(activity: FragmentActivity, callback: AuthenticationCallback) {
|
||||||
|
Column(
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
|
verticalArrangement = Arrangement.Center,
|
||||||
|
modifier = Modifier.fillMaxSize()
|
||||||
|
){
|
||||||
|
Text(text = "Authenticate", style = MaterialTheme.typography.headlineLarge)
|
||||||
|
Button(
|
||||||
|
onClick = {
|
||||||
|
authWithBiometricPrompt(activity, callback)
|
||||||
|
}
|
||||||
|
){
|
||||||
|
Text(text = "Start")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun authWithBiometricPrompt(activity: FragmentActivity, callback: AuthenticationCallback) {
|
||||||
|
val executor = ContextCompat.getMainExecutor(activity.applicationContext)
|
||||||
|
val biometricPrompt = BiometricPrompt(activity, executor, callback)
|
||||||
|
val promptInfo = BiometricPrompt.PromptInfo.Builder()
|
||||||
|
.setAllowedAuthenticators(BiometricManager.Authenticators.DEVICE_CREDENTIAL)
|
||||||
|
.setTitle("Auth")
|
||||||
|
.setConfirmationRequired(true)
|
||||||
|
.setSubtitle("Enter password")
|
||||||
|
.build()
|
||||||
|
biometricPrompt.authenticate(promptInfo)
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
|
|||||||
import android.app.admin.DevicePolicyManager
|
import android.app.admin.DevicePolicyManager
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Build.VERSION
|
import android.os.Build.VERSION
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
@@ -33,6 +34,7 @@ import androidx.compose.ui.res.painterResource
|
|||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.core.view.WindowCompat
|
import androidx.core.view.WindowCompat
|
||||||
|
import androidx.fragment.app.FragmentActivity
|
||||||
import androidx.navigation.NavHostController
|
import androidx.navigation.NavHostController
|
||||||
import androidx.navigation.compose.NavHost
|
import androidx.navigation.compose.NavHost
|
||||||
import androidx.navigation.compose.composable
|
import androidx.navigation.compose.composable
|
||||||
@@ -45,9 +47,13 @@ import java.util.Locale
|
|||||||
|
|
||||||
var backToHome = false
|
var backToHome = false
|
||||||
@ExperimentalMaterial3Api
|
@ExperimentalMaterial3Api
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : FragmentActivity() {
|
||||||
@SuppressLint("UnrememberedMutableState")
|
@SuppressLint("UnrememberedMutableState")
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
if(!authenticated){
|
||||||
|
startActivity(Intent(applicationContext, AuthActivity::class.java))
|
||||||
|
finish()
|
||||||
|
}
|
||||||
enableEdgeToEdge()
|
enableEdgeToEdge()
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@@ -96,18 +102,18 @@ fun MyScaffold(materialYou:MutableState<Boolean>, blackTheme:MutableState<Boolea
|
|||||||
popEnterTransition = Animations.navHostPopEnterTransition,
|
popEnterTransition = Animations.navHostPopEnterTransition,
|
||||||
popExitTransition = Animations.navHostPopExitTransition
|
popExitTransition = Animations.navHostPopExitTransition
|
||||||
){
|
){
|
||||||
composable(route = "HomePage", content = { HomePage(navCtrl, pkgName)})
|
composable(route = "HomePage"){ HomePage(navCtrl, pkgName) }
|
||||||
composable(route = "SystemManage", content = { SystemManage(navCtrl) })
|
composable(route = "SystemManage"){ SystemManage(navCtrl) }
|
||||||
composable(route = "ManagedProfile", content = {ManagedProfile(navCtrl)})
|
composable(route = "ManagedProfile"){ ManagedProfile(navCtrl) }
|
||||||
composable(route = "Permissions", content = { DpmPermissions(navCtrl)})
|
composable(route = "Permissions"){ DpmPermissions(navCtrl) }
|
||||||
composable(route = "ApplicationManage", content = { ApplicationManage(navCtrl, pkgName, dialogStatus)})
|
composable(route = "ApplicationManage"){ ApplicationManage(navCtrl, pkgName, dialogStatus)}
|
||||||
composable(route = "UserRestriction", content = { UserRestriction(navCtrl)})
|
composable(route = "UserRestriction"){ UserRestriction(navCtrl) }
|
||||||
composable(route = "UserManage", content = { UserManage(navCtrl)})
|
composable(route = "UserManage"){ UserManage(navCtrl) }
|
||||||
composable(route = "Password", content = { Password(navCtrl)})
|
composable(route = "Password"){ Password(navCtrl) }
|
||||||
composable(route = "AppSetting", content = { AppSetting(navCtrl, materialYou, blackTheme)})
|
composable(route = "AppSetting"){ AppSetting(navCtrl, materialYou, blackTheme) }
|
||||||
composable(route = "Network", content = {Network(navCtrl)})
|
composable(route = "Network"){ Network(navCtrl) }
|
||||||
composable(route = "PackageSelector"){PackageSelector(navCtrl, pkgName)}
|
composable(route = "PackageSelector"){ PackageSelector(navCtrl, pkgName) }
|
||||||
composable(route = "PermissionPicker"){PermissionPicker(navCtrl)}
|
composable(route = "PermissionPicker"){ PermissionPicker(navCtrl) }
|
||||||
}
|
}
|
||||||
LaunchedEffect(Unit){
|
LaunchedEffect(Unit){
|
||||||
val profileInited = sharedPref.getBoolean("ManagedProfileActivated",false)
|
val profileInited = sharedPref.getBoolean("ManagedProfileActivated",false)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ navigation-compose = "2.7.7"
|
|||||||
material3 = "1.2.1"
|
material3 = "1.2.1"
|
||||||
accompanist-drawablepainter = "0.35.0-alpha"
|
accompanist-drawablepainter = "0.35.0-alpha"
|
||||||
shizuku = "13.1.5"
|
shizuku = "13.1.5"
|
||||||
|
biometric = "1.2.0-alpha05"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" }
|
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" }
|
||||||
@@ -16,6 +17,7 @@ androidx-ui-graphics = { module = "androidx.compose.ui:ui-graphics" }
|
|||||||
androidx-ui = { module = "androidx.compose.ui:ui" }
|
androidx-ui = { module = "androidx.compose.ui:ui" }
|
||||||
|
|
||||||
accompanist-drawablepainter = { module = "com.google.accompanist:accompanist-drawablepainter", version.ref = "accompanist-drawablepainter" }
|
accompanist-drawablepainter = { module = "com.google.accompanist:accompanist-drawablepainter", version.ref = "accompanist-drawablepainter" }
|
||||||
|
androidx-biometric = { group = "androidx.biometric", name = "biometric", version.ref = "biometric" }
|
||||||
|
|
||||||
shizuku-provider = { module = "dev.rikka.shizuku:provider", version.ref = "shizuku" }
|
shizuku-provider = { module = "dev.rikka.shizuku:provider", version.ref = "shizuku" }
|
||||||
shizuku-api = { module = "dev.rikka.shizuku:api", version.ref = "shizuku" }
|
shizuku-api = { module = "dev.rikka.shizuku:api", version.ref = "shizuku" }
|
||||||
|
|||||||
Reference in New Issue
Block a user