From f0abc000769ebe1f57ce755e75f862b656ece90e Mon Sep 17 00:00:00 2001 From: BinTianqi <1220958406@qq.com> Date: Sun, 24 Mar 2024 17:48:28 +0800 Subject: [PATCH] copy code to activate privilege --- app/build.gradle.kts | 1 - .../com/binbin/androidowner/MainActivity.kt | 2 +- .../java/com/binbin/androidowner/Setting.kt | 12 +++++--- .../java/com/binbin/androidowner/Utils.kt | 23 +++++++++++++++ .../binbin/androidowner/dpm/ManagedProfile.kt | 11 +++---- .../binbin/androidowner/dpm/Permissions.kt | 8 ++--- .../com/binbin/androidowner/ui/Components.kt | 29 +++++++++++++++++++ app/src/main/res/drawable/check_fill0.xml | 9 ++++++ .../main/res/drawable/content_copy_fill0.xml | 9 ++++++ .../main/res/drawable/filter_alt_fill0.xml | 9 ++++++ app/src/main/res/values/strings.xml | 1 + 11 files changed, 99 insertions(+), 15 deletions(-) create mode 100644 app/src/main/res/drawable/check_fill0.xml create mode 100644 app/src/main/res/drawable/content_copy_fill0.xml create mode 100644 app/src/main/res/drawable/filter_alt_fill0.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 31d9b0e..e3e90ca 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -23,7 +23,6 @@ android { buildTypes { release { isMinifyEnabled = true - isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/app/src/main/java/com/binbin/androidowner/MainActivity.kt b/app/src/main/java/com/binbin/androidowner/MainActivity.kt index 6f35e86..de575bc 100644 --- a/app/src/main/java/com/binbin/androidowner/MainActivity.kt +++ b/app/src/main/java/com/binbin/androidowner/MainActivity.kt @@ -83,6 +83,7 @@ fun MyScaffold(){ val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) val focusMgr = LocalFocusManager.current + SetDarkTheme() NavHost( navController = navCtrl, startDestination = "HomePage", @@ -129,7 +130,6 @@ private fun HomePage(navCtrl:NavHostController){ stringResource(if(VERSION.SDK_INT>=24&&myDpm.isManagedProfile(myComponent)){R.string.work_profile_owner}else{R.string.profile_owner}) } else if(myDpm.isAdminActive(myComponent)){"Device Admin"}else{""} - SetDarkTheme() Column(modifier = Modifier.statusBarsPadding().verticalScroll(rememberScrollState())) { Spacer(Modifier.padding(vertical = 25.dp)) Text(text = stringResource(R.string.app_name), style = typography.headlineLarge, modifier = Modifier.padding(start = 10.dp), color = colorScheme.onBackground) diff --git a/app/src/main/java/com/binbin/androidowner/Setting.kt b/app/src/main/java/com/binbin/androidowner/Setting.kt index d4d3797..054683d 100644 --- a/app/src/main/java/com/binbin/androidowner/Setting.kt +++ b/app/src/main/java/com/binbin/androidowner/Setting.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.Scaffold import androidx.compose.material3.Text @@ -16,6 +17,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -78,10 +80,12 @@ private fun Settings(){ R.string.dynamic_color, stringResource(R.string.dynamic_color_desc),null, {sharedPref.getBoolean("dynamicColor",false)},{sharedPref.edit().putBoolean("dynamicColor",it).apply()} ) - SwitchItem( - R.string.blackTheme, stringResource(R.string.blackTheme_desc),null, - {sharedPref.getBoolean("blackTheme",false)},{sharedPref.edit().putBoolean("blackTheme",it).apply()} - ) + if(colorScheme.background!=Color(0xFF000000)){ + SwitchItem( + R.string.blackTheme, stringResource(R.string.blackTheme_desc),null, + {sharedPref.getBoolean("blackTheme",false)},{sharedPref.edit().putBoolean("blackTheme",it).apply()} + ) + } Box(modifier = Modifier.padding(10.dp)){ Information { Text(text = stringResource(R.string.need_relaunch)) diff --git a/app/src/main/java/com/binbin/androidowner/Utils.kt b/app/src/main/java/com/binbin/androidowner/Utils.kt index 9f16913..bb243cc 100644 --- a/app/src/main/java/com/binbin/androidowner/Utils.kt +++ b/app/src/main/java/com/binbin/androidowner/Utils.kt @@ -1,8 +1,13 @@ package com.binbin.androidowner +import android.content.ClipData +import android.content.ClipboardManager import android.content.Context +import android.content.Intent import android.net.Uri +import android.os.Build.VERSION import android.widget.Toast +import androidx.core.content.ContextCompat.startActivity import java.io.FileNotFoundException import java.io.IOException import java.io.InputStream @@ -44,3 +49,21 @@ fun Set.toText():String{ } return output } + +fun writeClipBoard(context: Context, string: String):Boolean{ + val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + try { + if(VERSION.SDK_INT>=23){ + val hasPermission: Boolean = clipboardManager.hasPrimaryClip() + if(!hasPermission) { + val intent = Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS) + intent.setData(Uri.parse("package:"+context.packageName)) + startActivity(context,intent,null) + } + } + clipboardManager.setPrimaryClip(ClipData.newPlainText("", string)) + }catch(e:Exception){ + return false + } + return true +} diff --git a/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt b/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt index 134b947..d76fc9e 100644 --- a/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt +++ b/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt @@ -84,19 +84,19 @@ private fun Home(navCtrl: NavHostController){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ Text(text = stringResource(R.string.work_profile), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp)) if(VERSION.SDK_INT>=30&&isProfileOwner(myDpm)&&myDpm.isManagedProfile(myComponent)){ - SubPageItem(R.string.org_owned_work_profile,""){navCtrl.navigate("OrgOwnedWorkProfile")} + SubPageItem(R.string.org_owned_work_profile,"",R.drawable.corporate_fare_fill0){navCtrl.navigate("OrgOwnedWorkProfile")} } if(VERSION.SDK_INT<24||(VERSION.SDK_INT>=24&&myDpm.isProvisioningAllowed(ACTION_PROVISION_MANAGED_PROFILE))){ - SubPageItem(R.string.create_work_profile,""){navCtrl.navigate("CreateWorkProfile")} + SubPageItem(R.string.create_work_profile,"",R.drawable.work_fill0){navCtrl.navigate("CreateWorkProfile")} } if(VERSION.SDK_INT>=30&&isProfileOwner(myDpm)&&myDpm.isManagedProfile(myComponent)&&myDpm.isOrganizationOwnedDeviceWithManagedProfile){ - SubPageItem(R.string.suspend_personal_app,""){navCtrl.navigate("SuspendPersonalApp")} + SubPageItem(R.string.suspend_personal_app,"",R.drawable.block_fill0){navCtrl.navigate("SuspendPersonalApp")} } if(isProfileOwner(myDpm)&&(VERSION.SDK_INT<24||(VERSION.SDK_INT>=24&&myDpm.isManagedProfile(myComponent)))){ - SubPageItem(R.string.intent_filter,""){navCtrl.navigate("IntentFilter")} + SubPageItem(R.string.intent_filter,"",R.drawable.filter_alt_fill0){navCtrl.navigate("IntentFilter")} } if(VERSION.SDK_INT>=31&&(isProfileOwner(myDpm)&&myDpm.isManagedProfile(myComponent))){ - SubPageItem(R.string.org_id,""){navCtrl.navigate("OrgID")} + SubPageItem(R.string.org_id,"",R.drawable.corporate_fare_fill0){navCtrl.navigate("OrgID")} } Spacer(Modifier.padding(vertical = 30.dp)) } @@ -154,6 +154,7 @@ private fun OrgOwnedProfile(){ color = colorScheme.onTertiaryContainer ) } + CopyTextButton(myContext, R.string.copy_code, stringResource(R.string.activate_org_profile_command, Binder.getCallingUid()/100000)) } } } diff --git a/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt b/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt index 559b08a..18d6562 100644 --- a/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt +++ b/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt @@ -36,10 +36,7 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.R -import com.binbin.androidowner.ui.Animations -import com.binbin.androidowner.ui.Information -import com.binbin.androidowner.ui.SubPageItem -import com.binbin.androidowner.ui.TopBar +import com.binbin.androidowner.ui.* import com.binbin.androidowner.ui.theme.bgColor import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -219,6 +216,7 @@ private fun DeviceAdmin(navCtrl: NavHostController){ SelectionContainer { Text(text = stringResource(R.string.activate_device_admin_command)) } + CopyTextButton(myContext, R.string.copy_code, stringResource(R.string.activate_device_admin_command)) } } } @@ -242,6 +240,7 @@ private fun ProfileOwner(){ SelectionContainer{ Text(text = stringResource(R.string.activate_profile_owner_command)) } + CopyTextButton(myContext, R.string.copy_code, stringResource(R.string.activate_profile_owner_command)) } } } @@ -271,6 +270,7 @@ private fun DeviceOwner(navCtrl: NavHostController){ SelectionContainer{ Text(text = stringResource(R.string.activate_device_owner_command)) } + CopyTextButton(myContext, R.string.copy_code, stringResource(R.string.activate_device_owner_command)) } } } diff --git a/app/src/main/java/com/binbin/androidowner/ui/Components.kt b/app/src/main/java/com/binbin/androidowner/ui/Components.kt index 330cbf4..867a44a 100644 --- a/app/src/main/java/com/binbin/androidowner/ui/Components.kt +++ b/app/src/main/java/com/binbin/androidowner/ui/Components.kt @@ -1,8 +1,10 @@ package com.binbin.androidowner.ui import android.content.Context +import android.widget.Toast import androidx.annotation.DrawableRes import androidx.annotation.StringRes +import androidx.compose.animation.animateContentSize import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape @@ -22,6 +24,9 @@ import androidx.navigation.NavBackStackEntry import androidx.navigation.NavHostController import com.binbin.androidowner.R import com.binbin.androidowner.ui.theme.bgColor +import com.binbin.androidowner.writeClipBoard +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch @Composable fun SubPageItem( @@ -161,3 +166,27 @@ fun TopBar( colors = TopAppBarDefaults.topAppBarColors(containerColor = bgColor) ) } + +@Composable +fun CopyTextButton(context: Context, @StringRes label: Int, content: String){ + var ok by remember{mutableStateOf(false)} + val scope = rememberCoroutineScope() + Button( + onClick = { + if(!ok){ + scope.launch{ + if(writeClipBoard(context,content)){ ok = true; delay(2000); ok = false } + else{ Toast.makeText(context,context.getString(R.string.fail),Toast.LENGTH_SHORT).show() } + } + } + } + ){ + Row( + verticalAlignment = Alignment.CenterVertically, modifier = Modifier.animateContentSize() + ){ + Icon(painter = painterResource(if(ok){R.drawable.check_fill0}else{R.drawable.content_copy_fill0}),contentDescription = null) + Spacer(modifier = Modifier.padding(horizontal = 2.dp)) + Text(text = stringResource(if(ok){R.string.success}else{label})) + } + } +} diff --git a/app/src/main/res/drawable/check_fill0.xml b/app/src/main/res/drawable/check_fill0.xml new file mode 100644 index 0000000..f97e17d --- /dev/null +++ b/app/src/main/res/drawable/check_fill0.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/content_copy_fill0.xml b/app/src/main/res/drawable/content_copy_fill0.xml new file mode 100644 index 0000000..b63f25b --- /dev/null +++ b/app/src/main/res/drawable/content_copy_fill0.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/filter_alt_fill0.xml b/app/src/main/res/drawable/filter_alt_fill0.xml new file mode 100644 index 0000000..dfe0043 --- /dev/null +++ b/app/src/main/res/drawable/filter_alt_fill0.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0d7be3f..e35d66b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -41,6 +41,7 @@ 请再试一次 效果未知 选项 + 复制代码 Device admin