diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 23a1f96c4cdec13a2a0dbd16bb24f02e1dc54a8a..ea0a4f57ea2aa6e613f0226e1daa46a09b08e554 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -127,6 +127,7 @@ android { } dependencies { + implementation(libs.androidx.browser) compileOnly(fileTree(mapOf("dir" to "../prebuilts", "include" to listOf("*.jar")))) implementation(libs.androidx.core.ktx) diff --git a/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt b/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt index 5b2649c6965c2c5e0568202a63f9481e6ae4f052..2e3d3219dda456d1670bf093eea92b8949c0b898 100644 --- a/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt +++ b/app/src/main/java/foundation/e/parentalcontrol/MainActivity.kt @@ -11,6 +11,7 @@ import android.app.admin.DevicePolicyManager import android.content.ComponentName import android.content.Context import android.content.Intent +import android.net.Uri import android.os.Build import android.os.Bundle import android.os.Handler @@ -21,7 +22,9 @@ import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.BackHandler import androidx.activity.compose.setContent +import androidx.browser.customtabs.CustomTabsIntent import androidx.compose.foundation.clickable +import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -57,14 +60,19 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -539,14 +547,7 @@ class MainActivity : ComponentActivity() { ) } - Text( - text = stringResource(R.string.activate_admin_summary), - color = colorResource(foundation.e.elib.R.color.e_primary_text_color), - fontSize = 15.sp, - maxLines = Int.MAX_VALUE, - overflow = TextOverflow.Clip, - modifier = Modifier.padding(bottom = Dimens.SCREEN_PADDING / 2) - ) + ActivateAdminSummary() var checkedState by remember { mutableStateOf(false) } var moveToNext by remember { mutableStateOf(false) } @@ -576,6 +577,56 @@ class MainActivity : ComponentActivity() { } } + @Composable + fun ActivateAdminSummary() { + val clipboardManager = LocalClipboardManager.current + + Text( + text = stringResource(R.string.activate_admin_summary), + color = colorResource(foundation.e.elib.R.color.e_primary_text_color), + fontSize = 15.sp, + maxLines = Int.MAX_VALUE, + overflow = TextOverflow.Clip, + modifier = Modifier.padding(bottom = Dimens.SCREEN_PADDING / 2) + ) + + val docUrl = stringResource(R.string.e_foundation_docs_link) + Text( + text = docUrl, + fontSize = 15.sp, + color = colorResource(foundation.e.elib.R.color.e_accent), + maxLines = Int.MAX_VALUE, + overflow = TextOverflow.Clip, + style = TextStyle(textDecoration = TextDecoration.Underline), + modifier = + Modifier.padding(bottom = 8.dp).pointerInput(Unit) { + detectTapGestures( + onTap = { + try { + val customTabsIntent = + CustomTabsIntent.Builder().setShowTitle(true).build() + customTabsIntent.launchUrl(mActivity, Uri.parse(docUrl)) + } catch (e: Exception) { + // Fallback to default browser + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(docUrl)) + startActivity(intent) + } + }, + onLongPress = { + // Copy to clipboard + clipboardManager.setText(AnnotatedString(docUrl)) + Toast.makeText( + mActivity, + getString(R.string.link_copied_to_clipboard), + Toast.LENGTH_SHORT + ) + .show() + } + ) + } + ) + } + @Composable fun ActivateAdmin() { BackHandler(onBack = { onExitApp() }) @@ -671,14 +722,7 @@ class MainActivity : ComponentActivity() { ) } - Text( - text = stringResource(R.string.activate_admin_summary), - color = colorResource(foundation.e.elib.R.color.e_primary_text_color), - fontSize = 15.sp, - maxLines = Int.MAX_VALUE, - overflow = TextOverflow.Clip, - modifier = Modifier.padding(bottom = Dimens.SCREEN_PADDING / 2) - ) + ActivateAdminSummary() ToggleWithText( text = stringResource(R.string.activate_parental_control), diff --git a/app/src/main/res/values/config.xml b/app/src/main/res/values/config.xml index ab9dff673a20397eca010620ae536667cf6c6c01..939211153c1e27b96581e79e0002641e53fa6480 100644 --- a/app/src/main/res/values/config.xml +++ b/app/src/main/res/values/config.xml @@ -1,4 +1,5 @@ family.cloudflare-dns.com + https://doc.e.foundation/support-topics/parental-control \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4e351205c204bb2884a740bad058788816ba0699..a220f475aff3d0685c1c53a517f94f5636283b14 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,7 +17,7 @@ Must be at least 8 characters Enter the same password Enter the same pin - This app offers protection against inappropriate content for your children and teenagers. You can activate this feature when lending your phone to your kid or if this is their device. + This app offers protection against inappropriate content for your children and teenagers. You can activate this feature when lending your phone to your kid or if this is their device. To know more about it please go to Activate Parental Control Age group of the child Please select the age group of your child so the protection enabled by Parental Control is appropriate. @@ -47,4 +47,5 @@ "Security > More security settings > Device admin apps" "Security > Device admin apps" Open settings + Link copied to clipboard \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1d00e5903ec07887b13ca5da362642f0036d31da..12c8c4ee0d18d6a2dfa27fa0ab6aafea85cd202e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,6 +11,7 @@ material = "1.12.0" parentalcontroldata = "1.0.0" spotless = "6.19.0" elib = "0.0.1-alpha11" +browser = "1.8.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -26,6 +27,7 @@ material = { module = "com.google.android.material:material", version.ref = "mat parentalcontroldata = { module = "foundation.e.apps:ParentalControlData", version.ref = "parentalcontroldata" } spotless = { module = "com.diffplug.spotless:spotless-plugin-gradle", version.ref = "spotless" } elib = { module = "foundation.e:elib", version.ref = "elib" } +androidx-browser = { group = "androidx.browser", name = "browser", version.ref = "browser" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }