package com.notifyhub.viewer.ui import android.Manifest import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import com.google.firebase.messaging.FirebaseMessaging import com.notifyhub.viewer.NotizViewerApp import com.notifyhub.viewer.R import com.notifyhub.viewer.data.AuthRepository import com.notifyhub.viewer.databinding.ActivityHomeBinding import com.notifyhub.viewer.push.NotizMessagingService import com.notifyhub.viewer.util.deviceName import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext class HomeActivity : AppCompatActivity() { private lateinit var binding: ActivityHomeBinding private lateinit var app: NotizViewerApp override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) app = application as NotizViewerApp if (!app.preferences.isLoggedIn()) { startActivity(Intent(this, LoginActivity::class.java)) finish() return } binding = ActivityHomeBinding.inflate(layoutInflater) setContentView(binding.root) val pages = buildPageList() val pagerAdapter = object : FragmentStateAdapter(this) { override fun getItemCount(): Int = pages.size override fun createFragment(position: Int): Fragment = pages[position].fragment } binding.viewPager.adapter = pagerAdapter TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -> tab.text = getString(pages[position].titleRes) }.attach() NotizMessagingService.ensureChannel(this) requestNotificationPermission() registerPushToken() binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { (pages[position].fragment as? Refreshable)?.refresh() } }) } private fun buildPageList(): List { val items = mutableListOf() items.add(PageItem(R.string.tab_home, HomeFragment())) if (app.preferences.hasPage("messages")) { items.add(PageItem(R.string.tab_messages, MessagesFragment())) } if (app.preferences.hasPage("alerts")) { items.add(PageItem(R.string.tab_alerts, AlertsFragment())) } items.add(PageItem(R.string.tab_account, AccountFragment())) return items } private fun requestNotificationPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.POST_NOTIFICATIONS), 100) } } private fun registerPushToken() { lifecycleScope.launch { try { val token = withContext(Dispatchers.IO) { FirebaseMessaging.getInstance().token.result } val repo = AuthRepository(app.api, app.preferences, deviceName()) withContext(Dispatchers.IO) { repo.registerPushToken(token) } } catch (_: Exception) { // Firebase not configured (no google-services.json). Push silently disabled. } } } private data class PageItem(val titleRes: Int, val fragment: Fragment) interface Refreshable { fun refresh() } companion object { fun deepLinkIntent(context: Context, type: String, alertId: Int?, messageId: Int?): Intent { val intent = Intent(context, HomeActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP intent.putExtra(EXTRA_PUSH_TYPE, type) alertId?.let { intent.putExtra(EXTRA_ALERT_ID, it) } messageId?.let { intent.putExtra(EXTRA_MESSAGE_ID, it) } return intent } const val EXTRA_PUSH_TYPE = "extra_push_type" const val EXTRA_ALERT_ID = "extra_alert_id" const val EXTRA_MESSAGE_ID = "extra_message_id" } }