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" }