@@ -31,12 +31,15 @@ import androidx.appcompat.app.AppCompatActivity
3131import androidx.cardview.widget.CardView
3232import androidx.core.content.edit
3333import androidx.core.net.toUri
34+ import androidx.core.view.ViewCompat
35+ import androidx.core.view.WindowInsetsCompat
3436import androidx.core.view.children
3537import androidx.core.view.get
3638import androidx.core.view.isGone
3739import androidx.core.view.isInvisible
3840import androidx.core.view.isVisible
3941import androidx.core.view.marginStart
42+ import androidx.core.view.updateLayoutParams
4043import androidx.fragment.app.FragmentActivity
4144import androidx.lifecycle.ViewModelProvider
4245import androidx.navigation.NavController
@@ -274,6 +277,8 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
274277
275278 const val LAST_INSTAGRAM_DIALOG_SHOW_TIME = " last_instagram_dialog_show_time"
276279 const val INSTAGRAM_ALREADY_FOLLOWED = " instagram_already_followed"
280+ const val LAST_TELEGRAM_DIALOG_SHOW_TIME = " last_telegram_dialog_show_time"
281+ const val TELEGRAM_ALREADY_JOINED = " telegram_already_joined"
277282
278283 /* *
279284 * @return true if the str has launched an app task (be it successful or not)
@@ -501,6 +506,13 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
501506 R .id.navigation_player
502507 ).contains(destination.id)
503508
509+ binding?.bannerContainer?.isVisible =
510+ ! listOf (
511+ R .id.navigation_results_phone,
512+ R .id.navigation_results_tv,
513+ R .id.navigation_player
514+ ).contains(destination.id)
515+
504516 val isNavVisible = listOf (
505517 R .id.navigation_home,
506518 R .id.navigation_search,
@@ -560,6 +572,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
560572 binding?.apply {
561573 navRailView.isVisible = isNavVisible && isLandscape()
562574 navView.isVisible = isNavVisible && ! isLandscape()
575+ navViewContainer.isVisible = isNavVisible && ! isLandscape()
563576 navHostFragment.apply {
564577 val marginPx = resources.getDimensionPixelSize(R .dimen.nav_rail_view_width)
565578 layoutParams = (navHostFragment.layoutParams as ViewGroup .MarginLayoutParams ).apply {
@@ -1192,23 +1205,31 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
11921205 val currentTime = System .currentTimeMillis()
11931206
11941207 // Show only if setup is done and not already followed
1195- if (! hasDoneSetup || alreadyFollowed) return
1208+ if (! hasDoneSetup || alreadyFollowed) {
1209+ showTelegramFollowDialog()
1210+ return
1211+ }
11961212
11971213 // Show only if it's a new day (at least 24 hours passed) or first time (lastShowTime == 0)
11981214 val oneDayMillis = 24 * 60 * 60 * 1000
1199- if (lastShowTime != 0L && currentTime - lastShowTime < oneDayMillis) return
1215+ if (lastShowTime != 0L && currentTime - lastShowTime < oneDayMillis) {
1216+ showTelegramFollowDialog()
1217+ return
1218+ }
12001219
12011220 val dialog = Dialog (this , R .style.DialogHalfFullscreen )
12021221 val dialogView = layoutInflater.inflate(R .layout.instagram_follow_dialog, null )
12031222 dialog.setContentView(dialogView)
12041223 dialog.window?.setBackgroundDrawableResource(android.R .color.transparent)
12051224
12061225 val followButton = dialogView.findViewById< com.google.android.material.button.MaterialButton > (R .id.follow_button)
1207- val dismissButton = dialogView.findViewById < com.google.android.material.button. MaterialButton > ( R .id.dismiss_button)
1226+
12081227 val alreadyFollowedCheckbox = dialogView.findViewById<CheckBox >(R .id.already_followed_checkbox)
12091228
1210- dismissButton.setOnClickListener {
1211- dialog.dismiss()
1229+
1230+
1231+ dialog.setOnDismissListener {
1232+ showTelegramFollowDialog()
12121233 }
12131234
12141235 // Only show checkbox if it's NOT the first time (lastShowTime != 0)
@@ -1246,6 +1267,65 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
12461267 dialog.show()
12471268 }
12481269
1270+ private fun showTelegramFollowDialog () {
1271+ val alreadyJoined = getKey(TELEGRAM_ALREADY_JOINED , false ) ? : false
1272+ val lastShowTime = getKey<Long >(LAST_TELEGRAM_DIALOG_SHOW_TIME ) ? : 0L
1273+ val hasDoneSetup = getKey(HAS_DONE_SETUP_KEY , false ) ? : false
1274+ val currentTime = System .currentTimeMillis()
1275+
1276+ // Show only if setup is done and not already joined
1277+ if (! hasDoneSetup || alreadyJoined) return
1278+
1279+ // Show only if it's a new day (at least 24 hours passed) or first time (lastShowTime == 0)
1280+ val oneDayMillis = 24 * 60 * 60 * 1000
1281+ if (lastShowTime != 0L && currentTime - lastShowTime < oneDayMillis) return
1282+
1283+ val dialog = Dialog (this , R .style.DialogHalfFullscreen )
1284+ val dialogView = layoutInflater.inflate(R .layout.telegram_follow_dialog, null )
1285+ dialog.setContentView(dialogView)
1286+ dialog.window?.setBackgroundDrawableResource(android.R .color.transparent)
1287+
1288+ val joinButton = dialogView.findViewById< com.google.android.material.button.MaterialButton > (R .id.join_button)
1289+
1290+ val alreadyJoinedCheckbox = dialogView.findViewById<CheckBox >(R .id.already_joined_checkbox)
1291+
1292+
1293+
1294+ // Only show checkbox if it's NOT the first time (lastShowTime != 0)
1295+ if (lastShowTime != 0L ) {
1296+ alreadyJoinedCheckbox.isVisible = true
1297+ }
1298+
1299+ alreadyJoinedCheckbox.setOnCheckedChangeListener { _, isChecked ->
1300+ if (isChecked) {
1301+ joinButton.text = " DISMISS"
1302+ } else {
1303+ joinButton.text = " JOIN NOW"
1304+ }
1305+ }
1306+
1307+ joinButton.setOnClickListener {
1308+ if (alreadyJoinedCheckbox.isChecked) {
1309+ setKey(TELEGRAM_ALREADY_JOINED , true )
1310+ dialog.dismiss()
1311+ } else {
1312+ // Open Telegram URL
1313+ try {
1314+ val intent = Intent (Intent .ACTION_VIEW , " https://t.me/pluginstreamofficial" .toUri())
1315+ startActivity(intent)
1316+ } catch (e: Exception ) {
1317+ logError(e)
1318+ }
1319+ dialog.dismiss()
1320+ }
1321+ }
1322+
1323+ // Update last show time
1324+ setKey(LAST_TELEGRAM_DIALOG_SHOW_TIME , currentTime)
1325+
1326+ dialog.show()
1327+ }
1328+
12491329 @Suppress(" DEPRECATION_ERROR" )
12501330 override fun onCreate (savedInstanceState : Bundle ? ) {
12511331 app.initClient(this )
@@ -1348,12 +1428,22 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
13481428 }
13491429
13501430 binding?.apply {
1351- fixSystemBarsPadding(
1352- navView,
1353- heightResId = R .dimen.nav_view_height,
1354- padTop = false ,
1355- overlayCutout = false
1356- )
1431+ // Apply insets to the container for floating bottom nav
1432+ ViewCompat .setOnApplyWindowInsetsListener(navViewContainer) { view, windowInsets ->
1433+ val insets = windowInsets.getInsets(WindowInsetsCompat .Type .systemBars())
1434+
1435+ // Set the container margins based on system bars for modern floating look
1436+ // This removes the "extra space" below the card while keeping it floating above the system bars
1437+ view.updateLayoutParams<ViewGroup .MarginLayoutParams > {
1438+ // Margin should be system bar height + our desired floating margin (12dp)
1439+ // If system bar height is 0 (gesture nav), it will still have 12dp margin
1440+ bottomMargin = insets.bottom + 12 .toPx
1441+ leftMargin = insets.left + 24 .toPx
1442+ rightMargin = insets.right + 24 .toPx
1443+ }
1444+
1445+ WindowInsetsCompat .CONSUMED
1446+ }
13571447
13581448 fixSystemBarsPadding(
13591449 navRailView,
@@ -1734,20 +1824,13 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa
17341824 val navController = navHostFragment.navController
17351825
17361826 navController.addOnDestinationChangedListener { _: NavController , navDestination: NavDestination , bundle: Bundle ? ->
1827+ updateNavBar(navDestination)
17371828 // Intercept search and add a query
17381829 if (navDestination.id == R .id.navigation_setup_language || navDestination.id == R .id.navigation_setup_extensions || navDestination.id == R .id.navigation_setup_provider_languages || navDestination.id == R .id.navigation_setup_media || navDestination.id == R .id.navigation_setup_layout) {
1739- binding?.bannerContainer?.visibility = View .GONE
1740- binding?.navView?.visibility = View .GONE
1741- binding?.navRailView?.visibility = View .GONE
1742- } else {
1743- binding?.bannerContainer?.visibility = View .VISIBLE
1744- if (isLayout(PHONE )) {
1745- binding?.navView?.visibility = View .VISIBLE
1746- binding?.navRailView?.visibility = View .GONE
1747- } else {
1748- binding?.navView?.visibility = View .GONE
1749- binding?.navRailView?.visibility = View .VISIBLE
1750- }
1830+ binding?.bannerContainer?.isVisible = false
1831+ binding?.navView?.isVisible = false
1832+ binding?.navViewContainer?.isVisible = false
1833+ binding?.navRailView?.isVisible = false
17511834 }
17521835 if (navDestination.matchDestination(R .id.navigation_search) && ! nextSearchQuery.isNullOrBlank()) {
17531836 bundle?.apply {
0 commit comments