MainActivity.kt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. package com.vpn.fastestvpnservice
  2. import android.app.LocaleManager
  3. import android.content.Context
  4. import android.content.Intent
  5. import android.content.pm.ActivityInfo
  6. import android.content.pm.PackageInfo
  7. import android.content.pm.PackageManager
  8. import android.net.Uri
  9. import android.os.Build
  10. import android.os.Bundle
  11. import android.os.LocaleList
  12. import android.provider.Settings
  13. import android.util.Log
  14. import android.view.WindowInsets
  15. import android.view.WindowInsetsController
  16. import android.view.WindowManager
  17. import android.widget.Toast
  18. import androidx.activity.compose.setContent
  19. import androidx.activity.viewModels
  20. import androidx.annotation.RequiresApi
  21. import androidx.compose.foundation.isSystemInDarkTheme
  22. import androidx.compose.runtime.getValue
  23. import androidx.compose.runtime.mutableStateOf
  24. import androidx.compose.runtime.remember
  25. import androidx.compose.ui.graphics.toArgb
  26. import androidx.compose.ui.platform.LocalContext
  27. import androidx.compose.ui.res.colorResource
  28. import androidx.core.app.ActivityCompat
  29. import androidx.core.view.WindowCompat
  30. import androidx.fragment.app.FragmentManager
  31. import androidx.navigation.compose.rememberNavController
  32. import com.vpn.fastestvpnservice.activities.DockActivity
  33. import com.vpn.fastestvpnservice.activities.SplashActivity2
  34. import com.vpn.fastestvpnservice.beans.isDarkTheme
  35. import com.vpn.fastestvpnservice.beans.themesList
  36. import com.vpn.fastestvpnservice.broadcasts.ConnectivityReceiver
  37. import com.vpn.fastestvpnservice.constants.AppEnum
  38. import com.vpn.fastestvpnservice.fragments.LoginFragment
  39. import com.vpn.fastestvpnservice.fragments.TvHomeFragment
  40. import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
  41. import com.vpn.fastestvpnservice.interfaces.CallBacks
  42. import com.vpn.fastestvpnservice.interfaces.OnBackPressedOnTV
  43. import com.vpn.fastestvpnservice.interfaces.UpdateServersOnProtocol
  44. import com.vpn.fastestvpnservice.interfaces.VPNConnectionCallBacks
  45. import com.vpn.fastestvpnservice.navigation.SetUpNavGraph
  46. import com.vpn.fastestvpnservice.navigation.SetUpNavGraphTV
  47. import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.isSwitch
  48. import com.vpn.fastestvpnservice.screens.helpScreensAll.fileChooserCallback
  49. import com.vpn.fastestvpnservice.ui.theme.FastestVPNTheme
  50. import com.vpn.fastestvpnservice.utils.CustomExceptionHandler
  51. import com.vpn.fastestvpnservice.utils.StaticMethods
  52. import com.vpn.fastestvpnservice.viewmodels.LoginViewModel
  53. import de.blinkt.openvpn.core.App
  54. open class MainActivity : DockActivity(), ConnectivityReceiver.ConnectivityReceiverListener {
  55. val loginViewModel: LoginViewModel by viewModels()
  56. override fun onCreate(savedInstanceState: Bundle?) {
  57. super.onCreate(savedInstanceState)
  58. // if (Thread.getDefaultUncaughtExceptionHandler() !is CustomExceptionHandler) {
  59. // Thread.setDefaultUncaughtExceptionHandler(
  60. // CustomExceptionHandler(this,"112","newverson","minhaj"));
  61. // }
  62. requestedOrientation = if (App.isAndroidTvBox) {
  63. /* This for Android-TV,Box APK */
  64. ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
  65. } else {
  66. /* This for Normal APK */
  67. if (StaticMethods.isTV(this)) {
  68. ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
  69. } else {
  70. ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
  71. }
  72. }
  73. // setContentView(R.layout.activity_main)
  74. val basePreferenceHelper = BasePreferenceHelper(baseContext)
  75. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
  76. if (ActivityCompat.checkSelfPermission(
  77. this,
  78. android.Manifest.permission.POST_NOTIFICATIONS
  79. ) != PackageManager.PERMISSION_GRANTED
  80. ) {
  81. requestPermissions(arrayOf(android.Manifest.permission.POST_NOTIFICATIONS), 1);
  82. }
  83. }
  84. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && Settings.canDrawOverlays(this)) {
  85. isSwitch.value = true
  86. basePreferenceHelper.saveLaunchState(true)
  87. }
  88. WindowCompat.setDecorFitsSystemWindows(window, false)
  89. setContent {
  90. val context = LocalContext.current
  91. // val basePreferenceHelper = BasePreferenceHelper(context)
  92. val selectedTheme = basePreferenceHelper.getTheme()
  93. val isSystemInDarkTheme = isSystemInDarkTheme()
  94. val systemTheme by remember { mutableStateOf(isSystemInDarkTheme) }
  95. if (selectedTheme == themesList[0]) {
  96. isDarkTheme.value = systemTheme
  97. } else {
  98. isDarkTheme.value = selectedTheme == themesList[2]
  99. }
  100. if (StaticMethods.isTV(baseContext)) {
  101. Log.d("test_platform_android", "TV")
  102. // val intent = Intent(context, SplashActivity::class.java)
  103. // context.startActivity(intent)
  104. // finish()
  105. // true false
  106. isDarkTheme.value = true
  107. FastestVPNTheme(isDarkTheme.value) {
  108. // window.statusBarColor = colorResource(id = R.color.blue_text).toArgb()
  109. val navController = rememberNavController()
  110. SetUpNavGraphTV(navHostController = navController, this)
  111. // SetUpNavGraph(navHostController = navController, this)
  112. }
  113. } else {
  114. Log.d("test_platform_android", "Mobile")
  115. FastestVPNTheme(isDarkTheme.value) {
  116. window.statusBarColor = colorResource(id = R.color.blue_text).toArgb()
  117. val navController = rememberNavController()
  118. SetUpNavGraph(navHostController = navController, this)
  119. }
  120. }
  121. }
  122. // hideSystemUI()
  123. // val bundle = intent.extras
  124. // bundle.let {
  125. // it?.getString(AppEnum.SCREEN_NAME.key).let {
  126. // it?.let {
  127. // Log.d("test_nav_tv", "bundle $it")
  128. // initFragment(it)
  129. // }
  130. // }
  131. // ?: kotlin.run {
  132. // basePreferenceHelper?.getUser()?.let {
  133. // Log.d("test_nav_tv", "kotlin.run")
  134. // initFragment(AppEnum.HOME_SCREEN.key)
  135. // }
  136. // }
  137. // }
  138. FragmentManager.enableDebugLogging(true)
  139. }
  140. // override fun onBackPressed() {
  141. // super.onBackPressed()
  142. // Toast.makeText(
  143. // baseContext, "onBackPressed()", Toast.LENGTH_SHORT
  144. // ).show()
  145. // }
  146. fun hideSystemUI() {
  147. //Hides the ugly action bar at the top
  148. actionBar?.hide()
  149. //Hide the status bars
  150. WindowCompat.setDecorFitsSystemWindows(window, false)
  151. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
  152. window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
  153. } else {
  154. window.insetsController?.apply {
  155. hide(WindowInsets.Type.statusBars())
  156. systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
  157. }
  158. }
  159. }
  160. override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  161. super.onActivityResult(requestCode, resultCode, data)
  162. if (requestCode == 0) {
  163. // Log.d("test_file_chat", "onActivityResult: ${fileChooserCallback.toString()}")
  164. fileChooserCallback?.onReceiveValue(null)
  165. } else {
  166. fileChooserCallback?.onReceiveValue(arrayOf(Uri.parse(data?.dataString)))
  167. }
  168. fileChooserCallback = null
  169. if (requestCode == SCREEN_OVERLAY) {
  170. val basePreferenceHelper = BasePreferenceHelper(this)
  171. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && Settings.canDrawOverlays(this)) {
  172. isSwitch.value = true
  173. basePreferenceHelper.saveLaunchState(true)
  174. }
  175. }
  176. }
  177. override fun getContainerId(): Int {
  178. return R.id.mainFrameLayout
  179. }
  180. // override fun getContainerId(): Int {
  181. // return 0
  182. // }
  183. override fun onDestroy() {
  184. super.onDestroy()
  185. val basePreferenceHelper = BasePreferenceHelper(baseContext)
  186. if (!StaticMethods.isTV(this)) {
  187. basePreferenceHelper.clearServerObject()
  188. }
  189. Log.d("test_conn_ser_obj", "onDestroy() called")
  190. }
  191. fun getCallingIntent(_context: Context?): Intent {
  192. return Intent(_context, MainActivity::class.java)
  193. }
  194. fun initFragment(key: String) {
  195. Log.d("test_nav_tv", "initFragment() => $key")
  196. // val fragmentNavigator: FragmentNavigator = FragmentNavigator()
  197. when (key) {
  198. AppEnum.LOGIN_SCREEN.key -> {
  199. // val i = Intent(this, SplashActivity2::class.java)
  200. // startActivity(i)
  201. fragmentNavigator.replaceFragmentWithBackStack(LoginFragment.newInstance())
  202. }
  203. AppEnum.HOME_SCREEN.key -> {
  204. // fragmentNavigator.clearAllFragments()
  205. if (App.isAndroidTvBox) {
  206. /* Android-TV,Box APK */
  207. fragmentNavigator.replaceFragmentWithBackStackTv(
  208. TvHomeFragment.newInstance(),
  209. "tv_home"
  210. )
  211. } else {
  212. /* Normal APK*/
  213. if (StaticMethods.isTV(this)) {
  214. Log.d("test_nav_tv", "isTV =>")
  215. val i = Intent(this, SplashActivity2::class.java)
  216. startActivity(i)
  217. // fragmentNavigator.replaceFragmentWithBackStackTv(TvHomeFragment.newInstance(), "tv_home")
  218. } else {
  219. fragmentNavigator.replaceFragmentWithBackStack(TvHomeFragment.newInstance())
  220. }
  221. }
  222. }
  223. // AppEnum.SIGNUP_SCREEN.key -> {
  224. // fragmentNavigator.replaceFragment(SignUpFragment.newInstance())
  225. // }
  226. AppEnum.HELP_SCREEN.key -> {
  227. // fragmentNavigator.replaceFragment(
  228. // WebViewFragment.newInstance(
  229. // AppConstant.FAQ_WEBVIEW_URL, getString(R.string.help_faq)
  230. // )
  231. // )
  232. }
  233. }
  234. }
  235. companion object {
  236. var isWGDown: Boolean = true
  237. var isAutoEnabled: Boolean = false
  238. var isSnrNotify: Boolean = false
  239. var isSelectedServersShown: Boolean = false
  240. var vpnConnectionCallBacks: VPNConnectionCallBacks? = null
  241. var isStopSubscriptionNavigation: Boolean = true
  242. var updateServersOnProtocol: UpdateServersOnProtocol? = null
  243. var callBacks: CallBacks? = null
  244. var onBackPressedOnTV: OnBackPressedOnTV? = null
  245. val SCREEN_OVERLAY = 12345
  246. }
  247. override fun onNetworkConnectionChanged(isConnected: Boolean) {
  248. }
  249. // override fun onBackPressed() {
  250. // super.onBackPressed()
  251. //
  252. // if (StaticMethods.isTV(this))
  253. // {
  254. // Log.d("test_backTV", "TV Back!!")
  255. //// this@MainActivity.finishAffinity()
  256. // }
  257. // }
  258. }
  259. // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) // commenting now...
  260. // {
  261. // ActivityCompat.requestPermissions(this,
  262. // arrayOf(
  263. // android.Manifest.permission.ACCESS_FINE_LOCATION,
  264. // android.Manifest.permission.ACCESS_COARSE_LOCATION
  265. // ),
  266. // PackageManager.PERMISSION_GRANTED
  267. // )
  268. // }
  269. // else {
  270. // ActivityCompat.requestPermissions(this,
  271. // arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION,
  272. // android.Manifest.permission.ACCESS_COARSE_LOCATION
  273. // ),
  274. // PackageManager.PERMISSION_GRANTED
  275. // )
  276. // }