package be.mygod.vpnhotspot import android.os.Bundle import android.view.MenuItem import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.lifecycle.observe import be.mygod.vpnhotspot.client.ClientViewModel import be.mygod.vpnhotspot.client.ClientsFragment import be.mygod.vpnhotspot.databinding.ActivityMainBinding import be.mygod.vpnhotspot.manage.TetheringFragment import be.mygod.vpnhotspot.net.IpNeighbour import be.mygod.vpnhotspot.net.wifi.WifiDoubleLock import be.mygod.vpnhotspot.util.ServiceForegroundConnector import be.mygod.vpnhotspot.util.Services import be.mygod.vpnhotspot.widget.SmartSnackbar import com.google.android.material.bottomnavigation.BottomNavigationView import java.net.Inet4Address class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener { lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.navigation.setOnNavigationItemSelectedListener(this) if (savedInstanceState == null) displayFragment(TetheringFragment()) val model by viewModels() lifecycle.addObserver(model) if (Services.p2p != null) ServiceForegroundConnector(this, model, RepeaterService::class) model.clients.observe(this) { clients -> val count = clients.count { it.ip.any { (ip, state) -> ip is Inet4Address && state == IpNeighbour.State.VALID } } if (count > 0) binding.navigation.getOrCreateBadge(R.id.navigation_clients).apply { backgroundColor = ContextCompat.getColor(this@MainActivity, R.color.colorSecondary) badgeTextColor = ContextCompat.getColor(this@MainActivity, R.color.primary_text_default_material_light) number = count } else binding.navigation.removeBadge(R.id.navigation_clients) } SmartSnackbar.Register(binding.fragmentHolder) WifiDoubleLock.ActivityListener(this) } override fun onNavigationItemSelected(item: MenuItem) = when (item.itemId) { R.id.navigation_clients -> { if (!item.isChecked) { item.isChecked = true displayFragment(ClientsFragment()) } true } R.id.navigation_tethering -> { if (!item.isChecked) { item.isChecked = true displayFragment(TetheringFragment()) } true } R.id.navigation_settings -> { if (!item.isChecked) { item.isChecked = true displayFragment(SettingsPreferenceFragment()) } true } else -> false } private fun displayFragment(fragment: Fragment) = supportFragmentManager.beginTransaction().replace(R.id.fragmentHolder, fragment).commitAllowingStateLoss() }