@@ -8,9 +8,6 @@ import android.content.pm.ApplicationInfo
88import android.content.pm.PackageManager
99import android.util.Log
1010import android.widget.Toast
11- import androidx.compose.animation.animateContentSize
12- import androidx.compose.animation.core.LinearOutSlowInEasing
13- import androidx.compose.animation.core.tween
1411import androidx.compose.foundation.Image
1512import androidx.compose.foundation.clickable
1613import androidx.compose.foundation.layout.Arrangement
@@ -31,9 +28,11 @@ import androidx.compose.material.icons.Icons
3128import androidx.compose.material.icons.filled.Search
3229import androidx.compose.material.icons.filled.Settings
3330import androidx.compose.material.icons.outlined.Security
31+ import androidx.compose.material3.AlertDialog
3432import androidx.compose.material3.CircularProgressIndicator
3533import androidx.compose.material3.ExperimentalMaterial3Api
3634import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
35+ import androidx.compose.material3.FilledTonalButton
3736import androidx.compose.material3.Icon
3837import androidx.compose.material3.IconButton
3938import androidx.compose.material3.MaterialTheme
@@ -44,6 +43,7 @@ import androidx.compose.material3.SearchBarDefaults
4443import androidx.compose.material3.Surface
4544import androidx.compose.material3.Switch
4645import androidx.compose.material3.Text
46+ import androidx.compose.material3.TextButton
4747import androidx.compose.material3.TopAppBarDefaults
4848import androidx.compose.runtime.Composable
4949import androidx.compose.runtime.LaunchedEffect
@@ -64,6 +64,7 @@ import androidx.compose.ui.text.font.FontWeight
6464import androidx.compose.ui.text.style.TextOverflow
6565import androidx.compose.ui.unit.dp
6666import androidx.core.graphics.drawable.toBitmap
67+ import androidx.core.net.toUri
6768import androidx.lifecycle.viewmodel.compose.viewModel
6869import androidx.navigation.NavController
6970import dev.pranav.applock.R
@@ -231,6 +232,65 @@ fun MainScreen(
231232 )
232233 }
233234
235+ val appLockRepository = context.appLockRepository()
236+
237+ var showCommunityLink by remember { mutableStateOf(appLockRepository.isShowCommunityLink()) }
238+
239+ if (showCommunityLink && ! showAccessibilityDialog && ! showShizukuDialog && ! showUsageStatsDialog && ! showAntiUninstallAccessibilityDialog && ! showAntiUninstallDeviceAdminDialog) {
240+ AlertDialog (
241+ onDismissRequest = { appLockRepository.setCommunityLinkShown(true ) },
242+ title = { Text (" Join the Community" ) },
243+ text = { Text (" Join our discord community for updates and support." ) },
244+ confirmButton = {
245+ TextButton (onClick = {
246+ appLockRepository.setCommunityLinkShown(true )
247+ showCommunityLink = false
248+ context.startActivity(
249+ Intent (
250+ Intent .ACTION_VIEW ,
251+ " https://discord.gg/46wCMRVAre" .toUri()
252+ )
253+ )
254+ }) {
255+ Text (" Join Discord" )
256+ }
257+ },
258+ dismissButton = {
259+ TextButton (onClick = { appLockRepository.setCommunityLinkShown(true ) }) {
260+ Text (" Dismiss" )
261+ }
262+ }
263+ )
264+ }
265+
266+ var showDonateDialog by remember { mutableStateOf(appLockRepository.isShowDonateLink()) }
267+ if (showDonateDialog && ! showAccessibilityDialog && ! showShizukuDialog && ! showUsageStatsDialog && ! showAntiUninstallAccessibilityDialog && ! showAntiUninstallDeviceAdminDialog && ! showCommunityLink) {
268+ AlertDialog (
269+ onDismissRequest = { showDonateDialog = false },
270+ title = { Text (" Support Development" ) },
271+ text = { Text (" Hi, I'm Pranav, the developer of App Lock. I'm a student developer passionate about creating useful apps. If you find it helpful, please consider supporting its development with a small donation. Any amount is greatly appreciated and helps me continue to improve the app and work on new features. Thank you for your support!" ) },
272+ confirmButton = {
273+ FilledTonalButton (
274+ onClick = {
275+ context.startActivity(
276+ Intent (
277+ Intent .ACTION_VIEW ,
278+ " https://paypal.me/pranavpurwar" .toUri()
279+ )
280+ )
281+ showDonateDialog = false
282+ }
283+ ) { Text (" Donate" ) }
284+ },
285+ dismissButton = {
286+ TextButton (onClick = {
287+ showDonateDialog = false
288+ }) { Text (" Cancel" ) }
289+ },
290+ containerColor = MaterialTheme .colorScheme.surfaceContainer
291+ )
292+ }
293+
234294 Scaffold (
235295 modifier = Modifier
236296 .fillMaxSize()
@@ -384,13 +444,7 @@ private fun MainContent(
384444 viewModel = viewModel,
385445 onClick = { isChecked ->
386446 onAppToggle(appInfo, isChecked)
387- },
388- modifier = Modifier .animateContentSize(
389- animationSpec = tween(
390- durationMillis = 300 ,
391- easing = LinearOutSlowInEasing
392- )
393- )
447+ }
394448 )
395449 }
396450 }
@@ -429,8 +483,7 @@ private fun EmptySearchState(modifier: Modifier = Modifier) {
429483private fun AppItem (
430484 appInfo : ApplicationInfo ,
431485 viewModel : MainViewModel ,
432- onClick : (Boolean ) -> Unit ,
433- modifier : Modifier = Modifier
486+ onClick : (Boolean ) -> Unit
434487) {
435488 val context = LocalContext .current
436489 val packageManager = context.packageManager
0 commit comments