Sfoglia il codice sorgente

working on TV fragment nav

Khubaib 1 anno fa
parent
commit
d68e1a6b6b
38 ha cambiato i file con 4052 aggiunte e 125 eliminazioni
  1. 1 1
      .idea/deploymentTargetDropDown.xml
  2. 7 1
      app/build.gradle.kts
  3. 16 34
      app/src/main/AndroidManifest.xml
  4. 135 55
      app/src/main/java/com/vpn/fastestvpnservice/MainActivity.kt
  5. 40 0
      app/src/main/java/com/vpn/fastestvpnservice/activities/DockActivity.java
  6. 33 22
      app/src/main/java/com/vpn/fastestvpnservice/activities/SplashActivity.kt
  7. 22 0
      app/src/main/java/com/vpn/fastestvpnservice/activities/SplashActivity2.kt
  8. 118 0
      app/src/main/java/com/vpn/fastestvpnservice/fragments/BaseFragment.java
  9. 224 0
      app/src/main/java/com/vpn/fastestvpnservice/fragments/LoginFragment.kt
  10. 446 0
      app/src/main/java/com/vpn/fastestvpnservice/fragments/TvHomeFragment.kt
  11. 490 0
      app/src/main/java/com/vpn/fastestvpnservice/fragments/TvServerListFragment.kt
  12. 176 0
      app/src/main/java/com/vpn/fastestvpnservice/helpers/FragmentNavigator.java
  13. 9 0
      app/src/main/java/com/vpn/fastestvpnservice/interfaces/CallBacks.kt
  14. 18 0
      app/src/main/java/com/vpn/fastestvpnservice/utils/SnackBarUtils.kt
  15. 16 0
      app/src/main/java/com/vpn/fastestvpnservice/utils/Utils.kt
  16. 49 0
      app/src/main/java/com/vpn/fastestvpnservice/viewmodels/ProfileViewModel.kt
  17. 18 0
      app/src/main/java/com/vpn/fastestvpnservice/views/CustomValidation.java
  18. 1 1
      app/src/main/java/de/blinkt/openvpn/core/App.java
  19. 6 0
      app/src/main/res/anim/fade_in.xml
  20. 7 0
      app/src/main/res/color/textviewhover.xml
  21. 3 5
      app/src/main/res/layout-land/activity_splash.xml
  22. 199 0
      app/src/main/res/layout-land/activity_splash2.xml
  23. 385 0
      app/src/main/res/layout-land/fragment_home.xml
  24. 199 0
      app/src/main/res/layout-land/fragment_login.xml
  25. 279 0
      app/src/main/res/layout-land/fragment_server_list.xml
  26. 5 5
      app/src/main/res/layout/activity_splash.xml
  27. 206 0
      app/src/main/res/layout/activity_splash2.xml
  28. 366 0
      app/src/main/res/layout/fragment_home.xml
  29. 206 0
      app/src/main/res/layout/fragment_login.xml
  30. 109 0
      app/src/main/res/layout/fragment_server_list.xml
  31. 90 0
      app/src/main/res/layout/item_favourites.xml
  32. 78 0
      app/src/main/res/layout/item_server.xml
  33. 70 0
      app/src/main/res/layout/item_server_fast.xml
  34. 25 0
      app/src/main/res/layout/item_server_tab.xml
  35. BIN
      app/src/main/res/mipmap-hdpi/ic_map.png
  36. BIN
      app/src/main/res/mipmap-mdpi/ic_map.png
  37. BIN
      app/src/main/res/mipmap-xhdpi/ic_map.png
  38. 0 1
      app/src/main/res/values/strings.xml

+ 1 - 1
.idea/deploymentTargetDropDown.xml

@@ -18,7 +18,7 @@
               </deviceKey>
             </Target>
           </runningDeviceTargetSelectedWithDropDown>
-          <timeTargetWasSelectedWithDropDown value="2024-04-25T15:03:42.462350525Z" />
+          <timeTargetWasSelectedWithDropDown value="2024-04-26T19:40:32.507946415Z" />
         </State>
       </entry>
     </value>

+ 7 - 1
app/build.gradle.kts

@@ -55,6 +55,8 @@ android {
     }
     buildFeatures {
         compose = true
+        viewBinding = true
+        dataBinding = true
     }
     composeOptions {
         kotlinCompilerExtensionVersion = "1.5.1"
@@ -129,7 +131,11 @@ dependencies {
 
     // android view
     implementation("androidx.constraintlayout:constraintlayout:2.0.4")
-
+    implementation("androidx.activity:activity:1.8.0")
+    val leanback_version = "1.0.0"
+    implementation("androidx.leanback:leanback:$leanback_version")
+    implementation("androidx.leanback:leanback-preference:$leanback_version")
+    implementation("com.skyfishjy.ripplebackground:library:1.0.1")
 
     testImplementation("junit:junit:4.13.2")
     androidTestImplementation("androidx.test.ext:junit:1.1.5")

+ 16 - 34
app/src/main/AndroidManifest.xml

@@ -11,15 +11,13 @@
 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
     <uses-permission android:name="com.android.vending.BILLING" />
-
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-
     <uses-permission android:name="android.webkit.PermissionRequest" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@@ -32,17 +30,19 @@
     <application
         android:name="de.blinkt.openvpn.core.App"
         android:allowBackup="true"
+        android:banner="@drawable/logo_banner"
         android:dataExtractionRules="@xml/data_extraction_rules"
         android:fullBackupContent="@xml/backup_rules"
-        android:banner="@drawable/logo_banner"
         android:icon="@drawable/app_logo_square"
         android:label="@string/app_name"
         android:roundIcon="@drawable/app_logo_round"
         android:supportsRtl="true"
-        android:theme="@style/Theme.FastestVPN"
-        tools:targetApi="31"
+        android:theme="@style/Theme.AppCompat.NoActionBar"
         android:usesCleartextTraffic="true"
-        >
+        tools:targetApi="31">
+        <activity
+            android:name=".activities.SplashActivity2"
+            android:exported="false" />
         <activity
             android:name=".MainActivity"
             android:exported="true"
@@ -55,20 +55,9 @@
                 <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
             </intent-filter>
         </activity>
-
         <activity
             android:name=".activities.SplashActivity"
-            android:exported="true">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-
-                <category android:name="android.intent.category.DEFAULT" />
-
-                <!--                <category android:name="android.intent.category.LAUNCHER" />-->
-<!--                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />-->
-            </intent-filter>
-        </activity>
-
+            android:exported="false" />
 
         <activity
             android:name="org.strongswan.android.ui.VpnProfileControlActivity"
@@ -88,7 +77,6 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
-
         <activity
             android:name="de.blinkt.openvpn.LaunchVPN"
             android:excludeFromRecents="true"
@@ -110,7 +98,6 @@
                 <action android:name="android.net.VpnService" />
             </intent-filter>
         </service>
-
         <service
             android:name=".fcm.PetsFirebaseMessagingService"
             android:enabled="true"
@@ -119,7 +106,6 @@
                 <action android:name="com.google.firebase.MESSAGING_EVENT" />
             </intent-filter>
         </service>
-
         <service
             android:name="de.blinkt.openvpn.core.OpenVPNService"
             android:exported="true"
@@ -129,7 +115,6 @@
                 <action android:name="android.net.VpnService" />
             </intent-filter>
         </service>
-
         <service
             android:name="de.blinkt.openvpn.api.ExternalOpenVPNService"
             android:exported="true"
@@ -139,12 +124,10 @@
                 <action android:name="de.blinkt.openvpn.api.IOpenVPNAPIService" />
             </intent-filter>
         </service>
-
         <service
             android:name="org.strongswan.android.logic.VpnStateService"
-            android:foregroundServiceType="specialUse"
-            android:exported="true" />
-
+            android:exported="true"
+            android:foregroundServiceType="specialUse" />
         <service
             android:name="org.strongswan.android.logic.CharonVpnService"
             android:exported="true"
@@ -157,8 +140,8 @@
 
         <receiver
             android:name=".widgets.SimpleAppWidget"
-            android:permission="android.permission.BIND_VPN_SERVICE"
-            android:exported="false">
+            android:exported="false"
+            android:permission="android.permission.BIND_VPN_SERVICE">
             <intent-filter>
                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
             </intent-filter>
@@ -168,12 +151,11 @@
                 android:resource="@xml/simple_app_widget_info" />
         </receiver>
 
-        <service android:name=".utils.WireGuardService"
-            android:exported="true"
+        <service
+            android:name=".utils.WireGuardService"
             android:enabled="true"
-            android:foregroundServiceType="specialUse"
-            />
-
+            android:exported="true"
+            android:foregroundServiceType="specialUse" />
     </application>
 
 </manifest>

+ 135 - 55
app/src/main/java/com/vpn/fastestvpnservice/MainActivity.kt

@@ -2,61 +2,66 @@ package com.vpn.fastestvpnservice
 
 import android.content.Context
 import android.content.Intent
+import android.content.pm.ActivityInfo
 import android.content.pm.PackageManager
 import android.net.Uri
 import android.os.Build
 import android.os.Bundle
 import android.util.Log
+import android.view.View
+import android.view.WindowManager
 import androidx.activity.ComponentActivity
 import androidx.activity.compose.setContent
 import androidx.activity.viewModels
 import androidx.compose.foundation.isSystemInDarkTheme
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.material.ripple.LocalRippleTheme
-import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.Surface
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.colorResource
-import androidx.compose.ui.tooling.preview.Preview
 import androidx.core.app.ActivityCompat
-import androidx.lifecycle.LifecycleOwner
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.get
-import androidx.lifecycle.viewmodel.compose.viewModel
 import androidx.navigation.compose.rememberNavController
+import com.vpn.fastestvpnservice.activities.DockActivity
 import com.vpn.fastestvpnservice.activities.SplashActivity
-import de.blinkt.openvpn.core.App
+import com.vpn.fastestvpnservice.activities.SplashActivity2
 import com.vpn.fastestvpnservice.beans.isDarkTheme
-import com.vpn.fastestvpnservice.beans.selectedtheme
 import com.vpn.fastestvpnservice.beans.themesList
+import com.vpn.fastestvpnservice.broadcasts.ConnectivityReceiver
+import com.vpn.fastestvpnservice.constants.AppConstant
+import com.vpn.fastestvpnservice.constants.AppEnum
+import com.vpn.fastestvpnservice.fragments.LoginFragment
+import com.vpn.fastestvpnservice.fragments.TvHomeFragment
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
+import com.vpn.fastestvpnservice.helpers.FragmentNavigator
 import com.vpn.fastestvpnservice.interfaces.VPNConnectionCallBacks
 import com.vpn.fastestvpnservice.navigation.SetUpNavGraph
 import com.vpn.fastestvpnservice.screens.helpScreensAll.fileChooserCallback
-import com.vpn.fastestvpnservice.sealedClass.Screen
 import com.vpn.fastestvpnservice.ui.theme.FastestVPNTheme
 import com.vpn.fastestvpnservice.utils.StaticMethods
-import com.vpn.fastestvpnservice.viewmodels.BillingViewModel
 import com.vpn.fastestvpnservice.viewmodels.LoginViewModel
-import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
-import com.vpn.fastestvpnservice.viewmodels.SubscriptionViewModel
+import de.blinkt.openvpn.core.App
+import kotlinx.coroutines.delay
 
-class MainActivity : ComponentActivity() {
+open class MainActivity : DockActivity(), ConnectivityReceiver.ConnectivityReceiverListener {
     val loginViewModel: LoginViewModel by viewModels()
 
-
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
+        requestedOrientation = if (App.isAndroidTvBox) {
+            /* This for Android-TV,Box APK */
+            ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+        } else {
+            /* This for Normal APK */
+            if (StaticMethods.isTV(this)) {
+                ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+            } else {
+                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+            }
+        }
+
+        val basePreferenceHelper = BasePreferenceHelper(baseContext)
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
             if (ActivityCompat.checkSelfPermission(
                     this,
@@ -67,34 +72,8 @@ class MainActivity : ComponentActivity() {
             }
         }
 
-//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)       // commenting now...
-//        {
-//            ActivityCompat.requestPermissions(this,
-//                arrayOf(
-//                    android.Manifest.permission.ACCESS_FINE_LOCATION,
-//                    android.Manifest.permission.ACCESS_COARSE_LOCATION
-//                ),
-//                PackageManager.PERMISSION_GRANTED
-//            )
-//        }
-//        else {
-//            ActivityCompat.requestPermissions(this,
-//                arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION,
-//                    android.Manifest.permission.ACCESS_COARSE_LOCATION
-//                ),
-//                PackageManager.PERMISSION_GRANTED
-//            )
-//        }
-
-        if (StaticMethods.isTV(baseContext)) {
-            Log.d("test_platform_android", "TV")
-            val intent = Intent(this, SplashActivity::class.java)
-            startActivity(intent)
-        } else {
-            Log.d("test_platform_android", "Mobile")
-            setContent {
+        setContent {
                 val context = LocalContext.current
-
                 val basePreferenceHelper = BasePreferenceHelper(context)
                 val selectedTheme = basePreferenceHelper.getTheme()
 
@@ -108,14 +87,35 @@ class MainActivity : ComponentActivity() {
                     isDarkTheme.value = selectedTheme == themesList[2]
                 }
 
-                FastestVPNTheme(isDarkTheme.value) {
-                    window.statusBarColor = colorResource(id = R.color.blue_text).toArgb()
-                    val navController = rememberNavController()
-                    SetUpNavGraph(navHostController = navController, this)
+                if (StaticMethods.isTV(baseContext)) {
+                    Log.d("test_platform_android", "TV")
+                    val intent = Intent(context, SplashActivity::class.java)
+                    context.startActivity(intent)
+                } else {
+                    Log.d("test_platform_android", "Mobile")
+                    FastestVPNTheme(isDarkTheme.value) {
+                        window.statusBarColor = colorResource(id = R.color.blue_text).toArgb()
+                        val navController = rememberNavController()
+                        SetUpNavGraph(navHostController = navController, this)
+                    }
                 }
 
             }
 
+        val bundle = intent.extras
+        bundle.let {
+            it?.getString(AppEnum.SCREEN_NAME.key).let {
+                it?.let {
+                    Log.d("test_nav_tv", "bundle $it")
+                    initFragment(it)
+                }
+            }
+//                ?: kotlin.run {
+//                basePreferenceHelper?.getUser()?.let {
+//                    Log.d("test_nav_tv", "kotlin.run")
+//                    initFragment(AppEnum.HOME_SCREEN.key)
+//                }
+//            }
         }
     }
 
@@ -132,6 +132,14 @@ class MainActivity : ComponentActivity() {
         fileChooserCallback = null
     }
 
+    override fun getContainerId(): Int {
+        return R.id.activity_main
+    }
+
+//    override fun getContainerId(): Int {
+//        return 0
+//    }
+
     override fun onDestroy() {
         super.onDestroy()
 
@@ -141,9 +149,51 @@ class MainActivity : ComponentActivity() {
 
     }
 
-    fun getCallingIntent(_context: Context?): Intent {
-        return Intent(_context, MainActivity::class.java)
+
+
+     fun initFragment(key: String) {
+        Log.d("test_nav_tv", "initFragment() => $key")
+//        val fragmentNavigator: FragmentNavigator = FragmentNavigator()
+        when (key) {
+            AppEnum.LOGIN_SCREEN.key -> {
+                val i = Intent(this, SplashActivity2::class.java)
+                startActivity(i)
+//                fragmentNavigator.replaceFragmentWithBackStack(LoginFragment.newInstance())
+            }
+            AppEnum.HOME_SCREEN.key -> {
+//                fragmentNavigator.clearAllFragments()
+
+                if (App.isAndroidTvBox)
+                {
+                    /* Android-TV,Box APK */
+                    fragmentNavigator.replaceFragmentWithBackStackTv(TvHomeFragment.newInstance(), "tv_home")
+                }
+                else {
+                    /* Normal APK*/
+                    if (StaticMethods.isTV(this)) {
+                        Log.d("test_nav_tv", "isTV =>")
+                        val i = Intent(this, SplashActivity2::class.java)
+                        startActivity(i)
+//                        fragmentNavigator.replaceFragmentWithBackStackTv(TvHomeFragment.newInstance(), "tv_home")
+                    } else {
+                        fragmentNavigator.replaceFragmentWithBackStack(TvHomeFragment.newInstance())
+                    }
+                }
+            }
+//            AppEnum.SIGNUP_SCREEN.key -> {
+//                fragmentNavigator.replaceFragment(SignUpFragment.newInstance())
+//            }
+            AppEnum.HELP_SCREEN.key -> {
+//                fragmentNavigator.replaceFragment(
+//                    WebViewFragment.newInstance(
+//                        AppConstant.FAQ_WEBVIEW_URL, getString(R.string.help_faq)
+//                    )
+//                )
+            }
+        }
     }
+
+
     companion object {
         var isWGDown: Boolean = true
         var isAutoEnabled: Boolean = false
@@ -151,6 +201,36 @@ class MainActivity : ComponentActivity() {
         var isSelectedServersShown: Boolean = false
         var vpnConnectionCallBacks: VPNConnectionCallBacks? = null
         var isStopSubscriptionNavigation: Boolean = true
+
+        fun getCallingIntent(_context: Context?): Intent {
+            return Intent(_context, MainActivity::class.java)
+        }
+
+        fun test() {
+            Log.d("test_nav_tv", "test function")
+        }
+    }
+
+    override fun onNetworkConnectionChanged(isConnected: Boolean) {
+        TODO("Not yet implemented")
     }
 }
 
+//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)       // commenting now...
+//        {
+//            ActivityCompat.requestPermissions(this,
+//                arrayOf(
+//                    android.Manifest.permission.ACCESS_FINE_LOCATION,
+//                    android.Manifest.permission.ACCESS_COARSE_LOCATION
+//                ),
+//                PackageManager.PERMISSION_GRANTED
+//            )
+//        }
+//        else {
+//            ActivityCompat.requestPermissions(this,
+//                arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION,
+//                    android.Manifest.permission.ACCESS_COARSE_LOCATION
+//                ),
+//                PackageManager.PERMISSION_GRANTED
+//            )
+//        }

+ 40 - 0
app/src/main/java/com/vpn/fastestvpnservice/activities/DockActivity.java

@@ -0,0 +1,40 @@
+package com.vpn.fastestvpnservice.activities;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import androidx.activity.ComponentActivity;
+import androidx.annotation.IdRes;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.vpn.fastestvpnservice.helpers.FragmentNavigator;
+
+
+public abstract class DockActivity extends ComponentActivity {
+
+    FragmentNavigator mFragmentNavigator;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mFragmentNavigator = new FragmentNavigator();
+        registerControllers();
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        mFragmentNavigator.unRegister();
+    }
+
+    private void registerControllers() {
+        mFragmentNavigator.register(getFragmentNavigator().getFragmentManager(), getContainerId());
+    }
+
+    public FragmentNavigator getFragmentNavigator() {
+        return mFragmentNavigator;
+    }
+
+    public abstract @IdRes
+    int getContainerId();
+}

+ 33 - 22
app/src/main/java/com/vpn/fastestvpnservice/activities/SplashActivity.kt

@@ -1,21 +1,20 @@
 package com.vpn.fastestvpnservice.activities
 
+import android.content.Intent
 import android.os.Bundle
-import android.os.Handler
-import android.view.View
-import android.view.animation.AnimationUtils
+import android.util.Log
 import androidx.activity.ComponentActivity
+import androidx.appcompat.app.AppCompatActivity
 import com.vpn.fastestvpnservice.MainActivity
+import com.vpn.fastestvpnservice.MainActivity.Companion.getCallingIntent
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.constants.AppEnum
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
-import com.vpn.fastestvpnservice.helpers.UIHelper
 import com.vpn.fastestvpnservice.utils.StaticMethods
-import com.vpn.fastestvpnservice.viewmodels.LoginViewModel
 import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
 import de.blinkt.openvpn.core.App
 
-class SplashActivity : ComponentActivity() {
+class SplashActivity : MainActivity() {
 
     lateinit var splashViewModel: SplashViewModel
     lateinit var prefHelper: BasePreferenceHelper
@@ -23,8 +22,12 @@ class SplashActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_splash)
+        Log.d("test_nav_tv", "SplashActivity called")
 
-//        prefHelper = BasePreferenceHelper(baseContext)
+        prefHelper = BasePreferenceHelper(baseContext)
+
+//        val i = Intent(this, SplashActivity2::class.java)
+//        startActivity(i)
 //        splashViewModel = SplashViewModel(this)
 //
 //        window.decorView.systemUiVisibility =
@@ -63,38 +66,46 @@ class SplashActivity : ComponentActivity() {
 //                }
 //            }
 //        })
-//        moveToLogin()
+        moveToLogin()
 
     }
 
     private fun moveToLogin() {
+        Log.d("test_nav_tv", "moveToLogin() called")
         if (prefHelper.getUser() == null) {
+            Log.d("test_nav_tv", "getUser() null")
 
             if (App.isAndroidTvBox) {
                 /* Since this for specific android-tvbox, so only login_fragment*/
-//                startActivity(
-//                    MainActivity.getCallingIntent(this).putExtra(
-//                        AppEnum.SCREEN_NAME.key,
-//                        AppEnum.LOGIN_SCREEN.key
-//                    )
-//                )
+                startActivity(
+                    getCallingIntent(this).putExtra(
+                        AppEnum.SCREEN_NAME.key,
+                        AppEnum.LOGIN_SCREEN.key
+                    )
+                )
             }
             else {
                 if (StaticMethods.isTV(this)) {
-//                    startActivity(
-//                        getCallingIntent(this).putExtra(
-//                            AppEnum.SCREEN_NAME.key,
-//                            AppEnum.LOGIN_SCREEN.key
-//                        )
-//                    )
+                    Log.d("test_nav_tv", "getUser() null : TV")
+                    startActivity(
+                        getCallingIntent(this).putExtra(
+                            AppEnum.SCREEN_NAME.key,
+                            AppEnum.LOGIN_SCREEN.key
+                        )
+                    )
                 }
             }
 
         } else {
-            splashViewModel.serverDataApi()
+            Log.d("test_nav_tv", "getUser() =>")
+//            splashViewModel.serverDataApi()
+            initFragment(AppEnum.LOGIN_SCREEN.key)
+//            val i = Intent(this, SplashActivity2::class.java)
+//            startActivity(i)
+
 //            startActivity(
 //                getCallingIntent(this@SplashActivity).putExtra(
-//                    AppEnum.SCREEN_NAME.key, AppEnum.HOME_SCREEN.key
+//                    AppEnum.SCREEN_NAME.key, AppEnum.LOGIN_SCREEN.key
 //                )
 //            )
             finish()

+ 22 - 0
app/src/main/java/com/vpn/fastestvpnservice/activities/SplashActivity2.kt

@@ -0,0 +1,22 @@
+package com.vpn.fastestvpnservice.activities
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import com.vpn.fastestvpnservice.R
+
+class SplashActivity2 : ComponentActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+//        enableEdgeToEdge()
+        setContentView(R.layout.activity_splash2)
+//        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
+//            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
+//            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
+//            insets
+//        }
+    }
+}

+ 118 - 0
app/src/main/java/com/vpn/fastestvpnservice/fragments/BaseFragment.java

@@ -0,0 +1,118 @@
+package com.vpn.fastestvpnservice.fragments;
+
+
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.vpn.fastestvpnservice.MainActivity;
+import com.vpn.fastestvpnservice.activities.DockActivity;
+import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper;
+import com.vpn.fastestvpnservice.helpers.FragmentNavigator;
+import com.vpn.fastestvpnservice.views.CustomValidation;
+
+import de.blinkt.openvpn.core.App;
+
+
+public abstract class BaseFragment extends Fragment {
+
+    protected BasePreferenceHelper prefHelper;
+    public CustomValidation customValidation;
+    protected InputMethodManager imm;
+    protected DockActivity dockActivity;
+    private final int mLayoutRes = -1;
+    private FragmentNavigator mFragmentNavigator;
+
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        imm = (InputMethodManager) App.getApplication().getSystemService(Context.INPUT_METHOD_SERVICE);
+        setHasOptionsMenu(true);
+
+        Log.d("onScreen: ", this.getClass().getName());
+    }
+
+    protected MainActivity getMainActivity() {
+        return (MainActivity) getMainActivity();
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        if (mLayoutRes == -1)
+            throw new RuntimeException("You have to call setContentView!");
+
+
+        return inflater.inflate(mLayoutRes, container, false);
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        prefHelper = new BasePreferenceHelper(getActivity());
+        customValidation = new CustomValidation();
+
+    }
+
+    @Override
+    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        dockActivity = (DockActivity) getMainActivity();
+        mFragmentNavigator = dockActivity.getFragmentNavigator();
+
+        setListeners();
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case android.R.id.home:
+                mFragmentNavigator.popBackStack();
+                return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    public void onDestroyView() {
+//        if (getActivity() instanceof MainActivity) {
+//            getMainActivity().hideLoading();
+//        }
+        super.onDestroyView();
+        hideKeyBoard();
+    }
+
+    protected void hideKeyBoard() {
+        View view = dockActivity.getCurrentFocus();
+        if (view != null) {
+            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
+        }
+    }
+
+    protected void setListeners() {
+
+    }
+
+    public FragmentNavigator getFragmentNavigator() {
+        return mFragmentNavigator;
+    }
+
+    abstract public void setTitleBar();
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        setTitleBar();
+    }
+
+}

+ 224 - 0
app/src/main/java/com/vpn/fastestvpnservice/fragments/LoginFragment.kt

@@ -0,0 +1,224 @@
+package com.vpn.fastestvpnservice.fragments
+
+import android.content.Intent
+import android.os.Bundle
+import android.text.InputType
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.webkit.WebViewFragment
+import android.widget.Toast
+import androidx.lifecycle.Observer
+import com.google.firebase.BuildConfig
+import com.vpn.fastestvpnservice.R
+import com.vpn.fastestvpnservice.beans.DataResponse
+import com.vpn.fastestvpnservice.beans.UserResponse
+import com.vpn.fastestvpnservice.constants.AppConstant
+import com.vpn.fastestvpnservice.databinding.FragmentLoginBinding
+
+import com.vpn.fastestvpnservice.utils.SnackBarUtils
+import com.vpn.fastestvpnservice.utils.StaticMethods
+import com.vpn.fastestvpnservice.viewmodels.LoginViewModel
+import com.vpn.fastestvpnservice.widgets.SimpleAppWidget
+import de.blinkt.openvpn.core.App
+
+
+class LoginFragment : BaseFragment() {
+
+    lateinit var loginViewModel: LoginViewModel
+//    lateinit var upgradePriceViewModel: UpgradePriceViewModel
+    var isPasswordVisible = false
+    var isTv = false
+    lateinit var loginBinding: FragmentLoginBinding
+
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+    ): View? {
+        loginBinding = FragmentLoginBinding.inflate(inflater)
+        return loginBinding.root
+//        return inflater.inflate(R.layout.fragment_login, container, false)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+//        etEmail.setText("mohammad.asif@abtach.org")
+//        etPassword.setText("Mohammad@3")
+
+//        etEmail.setText("sagartestaccount@gmail.com")
+//        etPassword.setText("test112233")
+
+//        etEmail.setText("testontv@yopmail.com")
+//        etPassword.setText("test")
+
+        if (StaticMethods.isTV(requireActivity())) {
+            isTv = true
+            loginBinding.etEmail.background = resources.getDrawable(R.drawable.edittext_selector_state)
+            loginBinding.etPassword.background = resources.getDrawable(R.drawable.edittext_selector_state)
+            loginBinding.tvLogin.background = resources.getDrawable(R.drawable.button_selector_state)
+        }
+
+        loginViewModel = LoginViewModel()
+//        upgradePriceViewModel = UpgradePriceViewModel(requireActivity())
+
+//        viewModelObserver()
+//        clickListeners()
+    }
+
+    fun clickListeners() {
+
+//        loginBinding.tvSignup.setOnClickListener {
+//            fragmentNavigator.replaceFragmentWithBackStack(SignUpFragment.newInstance())
+//        }
+
+        loginBinding.tvLogin.setOnClickListener {
+            if (customValidation.isValidText(loginBinding.etEmail, "Email") && customValidation.isValidText(
+                    loginBinding.etPassword, "Password"
+                ) && customValidation.isValidPassword(loginBinding.etPassword)
+            ) {
+//                if (isVisible) mainActivity.showLoading()
+                if (isTv)
+                {
+                    loginViewModel.loginRequest(
+                        loginBinding.etEmail.text.toString(),
+                        loginBinding.etPassword.text.toString(),
+                        "tv",
+                        android.os.Build.VERSION.RELEASE,
+                        BuildConfig.VERSION_NAME
+                    )
+                }
+                else {
+                    loginViewModel.loginRequest(
+                        loginBinding.etEmail.text.toString(),
+                        loginBinding.etPassword.text.toString(),
+                        "android",
+                        android.os.Build.VERSION.RELEASE,
+                        BuildConfig.VERSION_NAME
+                    )
+                }
+
+            }
+        }
+
+//        loginBinding.tvForgotPassword.setOnClickListener {
+//            fragmentNavigator.replaceFragmentWithBackStack(
+//                .newInstance(
+//                    AppConstant.CHANGE_PASSWORD_URL, getString(R.string.forgot_password)
+//                )
+//            )
+//        }
+
+        loginBinding.ivEye.setOnClickListener(View.OnClickListener {
+            if (isPasswordVisible) {
+                loginBinding.ivEye.setImageResource(R.drawable.ic_hide_password)
+                loginBinding.etPassword.inputType =
+                    InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
+                loginBinding.etPassword.setSelection(loginBinding.etPassword.text.toString().length)
+            } else {
+                loginBinding.ivEye.setImageResource(R.drawable.ic_show_password)
+                loginBinding.etPassword.inputType = InputType.TYPE_CLASS_TEXT
+                loginBinding.etPassword.setSelection(loginBinding.etPassword.text.toString().length)
+            }
+            isPasswordVisible = !isPasswordVisible
+        })
+
+    }
+
+    fun viewModelObserver() {
+        loginViewModel.mutableLiveDataUserResponse.observe(
+            mainActivity,
+            Observer<DataResponse<UserResponse>> {
+
+//                if (isVisible) mainActivity.hideLoading()
+                it?.let {
+                    if (it.status) {
+
+                        it.data?.let {
+
+                            prefHelper.savePassword(loginBinding.etPassword?.text.toString())
+                            prefHelper.saveUser(it)
+                            it.wireguard?.let { it1 -> prefHelper.saveWireGuard(it1) }
+                            it.product?.let { it1 -> prefHelper.saveProduct(it1) }
+                            prefHelper.saveEnabledProtocols(it.enabled_protocols)
+                            prefHelper.saveAvailableProtocols(it.available_protocols)
+                            prefHelper.saveXPlatformToken(it.userinfo?.email + "_" + System.currentTimeMillis())
+                            prefHelper.saveAdBlockState(false)
+
+                            it.servers?.let {
+                                prefHelper.saveServerData(it)
+                            }
+
+                            Log.d("bearer token", it.token.toString())
+
+//                            upgradePriceViewModel.getProducts()
+
+                            prefHelper.getFcmToken().let {
+                                loginViewModel.sendFcmToken(it)
+                                Log.d("fcm token get", prefHelper.getFcmToken())
+                            }
+
+//                            prefHelper.saveRadioBtnSplitPos(0)
+
+                            val widgetIntent = Intent(context, SimpleAppWidget::class.java)
+                            widgetIntent.action = SimpleAppWidget.ACTION_LOGIN
+                            context?.sendBroadcast(widgetIntent)
+
+                            fragmentNavigator.clearAllFragments()
+
+                            if (App.isAndroidTvBox)
+                            {
+                                /* Android-TV,Box APK */
+                                fragmentNavigator.replaceFragmentWithBackStackTv(TvHomeFragment.newInstance(), "tv_home")
+                            }
+                            else {
+                                /* Normal APK */
+                                if (isTv) {
+                                    fragmentNavigator.replaceFragmentWithBackStackTv(
+                                        TvHomeFragment.newInstance(), "tv_home")
+                                }
+                                else {
+                                    fragmentNavigator.replaceFragmentWithBackStack(
+                                        TvHomeFragment.newInstance()
+                                    )
+                                }
+                            }
+                        }
+                    } else {
+                        SnackBarUtils.showSnackBar(view, it.message, Toast.LENGTH_SHORT)
+//                        UIHelper.showToast(it.message)
+                    }
+                }
+            })
+
+        loginViewModel.mutableLiveDataUserResponseErrorStatus.observe(mainActivity, Observer{
+            if (it) {
+//                if (isVisible) mainActivity.hideLoading()
+                SnackBarUtils.showSnackBar(view, getString(R.string.something_went_wrong), Toast.LENGTH_SHORT)
+            }
+        })
+
+        loginViewModel.mutableLiveDataFcm.observe(
+            mainActivity,
+            Observer {
+                it.message?.let { it1 -> Log.d(tag, "message of fcm" + it1) }
+            }
+        )
+
+    }
+
+    override fun setTitleBar() {
+//        setupUI((mainActivity).titleBar, (mainActivity).bottomBar)
+    }
+
+//    private fun setupUI(titleBar: TitleBar, bottomBar: BottomBar) {
+//        titleBar.hideTitleBar()
+//        bottomBar.hideBottomBar()
+//    }
+
+    companion object {
+        fun newInstance(): LoginFragment {
+            return LoginFragment()
+        }
+    }
+}

+ 446 - 0
app/src/main/java/com/vpn/fastestvpnservice/fragments/TvHomeFragment.kt

@@ -0,0 +1,446 @@
+package com.vpn.fastestvpnservice.fragments
+
+import android.content.DialogInterface
+import android.graphics.Color
+import android.location.Location
+import android.os.Bundle
+import android.os.Handler
+import android.view.*
+import android.view.animation.Animation
+import android.view.animation.AnimationUtils
+import android.widget.Toast
+import androidx.lifecycle.Observer
+import com.google.android.material.snackbar.Snackbar
+import com.vpn.fastestvpnservice.R
+import com.vpn.fastestvpnservice.beans.Protocol
+import com.vpn.fastestvpnservice.beans.Server
+import com.vpn.fastestvpnservice.constants.AppEnum
+import com.vpn.fastestvpnservice.databinding.FragmentHomeBinding
+import com.vpn.fastestvpnservice.interfaces.CallBacks
+import com.vpn.fastestvpnservice.interfaces.VPNConnectionCallBacks
+import com.vpn.fastestvpnservice.utils.SnackBarUtils
+import com.vpn.fastestvpnservice.utils.StaticMethods
+import com.vpn.fastestvpnservice.utils.Utils
+import com.vpn.fastestvpnservice.utils.VPNConnectionsUtil
+import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
+import com.vpn.fastestvpnservice.viewmodels.ProfileViewModel
+import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
+import com.wireguard.android.backend.GoBackend
+import de.blinkt.openvpn.core.App
+
+
+class TvHomeFragment : BaseFragment(), VPNConnectionCallBacks, CallBacks {
+
+    lateinit var serverViewModel: ServerListViewModel
+    lateinit var homeViewModel: HomeViewModel
+    lateinit var profileViewModel: ProfileViewModel
+    var serverobj: Server? = null
+    lateinit var vpnConnectionsUtil: VPNConnectionsUtil
+    lateinit var tvHomeBinding: FragmentHomeBinding
+
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+    ): View? {
+        tvHomeBinding = FragmentHomeBinding.inflate(inflater)
+        return tvHomeBinding.root
+
+//        return inflater.inflate(R.layout.fragment_home, container, false)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+//        vpnConnectionsUtil = VPNConnectionsUtil(requireActivity(), this)
+//        vpnConnectionsUtil.initUI()
+
+        if (StaticMethods.isTV(activity)) {
+            tvHomeBinding.ivConnect.background = resources.getDrawable(R.drawable.connect_btn_state)
+            tvHomeBinding.tvLogoutTv?.background = resources.getDrawable(R.drawable.button_selector_state)
+            tvHomeBinding.tvNearestServer.background = resources.getDrawable(R.drawable.button_selector_state_tv)
+
+        }
+
+//        callBacks = this
+        clickListeners()
+        viewModelObserver()
+        showServers()
+    }
+
+    companion object {
+        var isTvHome: Boolean = true
+        var isFirstStepFragment: Boolean = false
+        var isSecondStepFragment: Boolean = false
+        var isThirdStepFragment: Boolean = false
+        var isFourthStepFragment: Boolean = false
+
+        fun newInstance(): TvHomeFragment {
+            return TvHomeFragment()
+        }
+    }
+
+    fun clickListeners() {
+        tvHomeBinding.ivConnect.setOnClickListener {
+            prefHelper.setServerObject(serverobj)
+//            vpnConnectionsUtil.connectVpn()
+        }
+
+        tvHomeBinding.tvLogoutTv?.setOnClickListener {
+//            showExitPopup(requireActivity())
+        }
+
+        val serverDataLocation = prefHelper.getServerData().get(0).servers
+        val ipinfodata = prefHelper.getIpinfo()
+
+        val distinctdatanotnull = serverDataLocation?.filter {
+            it.lt != null && it.lg != null
+        }
+
+        val distinctdata = distinctdatanotnull?.distinctBy {
+            it.lt
+        }
+
+        val distinctdataCountry = distinctdata?.distinctBy {
+            it.country
+        }
+
+        val distinctdatanotsame = distinctdataCountry?.filter {
+            ipinfodata?.countryCode != it.iso && ipinfodata?.country != it.country
+        }
+
+        val result = FloatArray(1)
+        val ipinfo = prefHelper.getIpinfo()
+
+        distinctdatanotsame?.forEachIndexed { index, server ->
+            val lat1 = ipinfo?.latitute
+            val lon1 = ipinfo?.longitude
+            val lat2 = server.lt
+            val lon2 = server.lg
+
+            if (lat1 != null && lat2!= null && lon1!= null && lon2!= null)
+            {
+                Location.distanceBetween(lat1, lon1, lat2, lon2, result)
+            }
+
+            val distance: Float = result[0]
+            distinctdatanotsame.get(index).distance = distance
+
+        }
+
+        val sortedDistance = distinctdatanotsame?.sortedBy {
+            it.distance
+        }
+
+        val sortedDistanceFast: MutableList<Server> = ArrayList<Server>()
+
+        for (i in 0..2)
+        {
+            if (sortedDistance != null) {
+                sortedDistanceFast.add(sortedDistance.get(i))
+            }
+        }
+
+        tvHomeBinding.tvNearestServer?.setOnClickListener {
+            if (App.connection_status == App.CONNECTION_STATE_DISCONNECTED || App.connection_status == App.CONNECTION_STATE_DOWN_WG)
+            {
+                val animation: Animation = AnimationUtils.loadAnimation(context, R.anim.fade_in)
+                tvHomeBinding.tvNearestServer?.startAnimation(animation)
+
+                sortedDistanceFast.get(0).let {
+                    onServerSelected(it)
+                }
+            }
+            else if (serverobj?.country != sortedDistanceFast.get(0).country)
+            {
+                val animation: Animation = AnimationUtils.loadAnimation(context, R.anim.fade_in)
+                tvHomeBinding.tvNearestServer?.startAnimation(animation)
+
+                sortedDistanceFast.get(0).let {
+                    onServerSelected(it)
+                }
+            }
+        }
+
+    }
+    fun viewModelObserver() {
+        serverViewModel = ServerListViewModel(requireActivity())
+        profileViewModel = ProfileViewModel()
+//        homeViewModel = HomeViewModel()
+
+        var filterServerByConnectionCount = Server()
+        if (prefHelper.getServerObject() != null) {
+            filterServerByConnectionCount = prefHelper.getServerObject()!!
+        } else {
+            filterServerByConnectionCount = serverViewModel.filterServerByConnectionCount(
+                prefHelper.getServerData().get(0).servers!!
+            )
+        }
+
+//        callBacks?.onServerSelected(filterServerByConnectionCount)
+
+        homeViewModel.mutableLiveDataIpInfo.observe(mainActivity, Observer {
+
+            it?.let {
+                tvHomeBinding.tvIp?.text = "IP: ${it.query}"
+
+                if (it.country != null)
+                {
+                    tvHomeBinding.tvCountry?.text ="${it.country}"
+                }
+                else if (it.city != null){
+                    tvHomeBinding.tvCountry?.text ="${it.city}, ${it.country}"
+                }
+                tvHomeBinding.cardCountryImg?.visibility = View.VISIBLE
+                tvHomeBinding.ivCountry?.setImageDrawable(
+                    Utils.getCountryFlag(mainActivity, it.countryCode?.toLowerCase().toString())
+                )
+            }
+
+        })
+
+        profileViewModel.mutableLiveDataLogoutTv.observe(requireActivity(), Observer {
+            if (isVisible)
+//                mainActivity.hideLoading()
+            if (it) {
+                prefHelper.clearAllData()
+                fragmentNavigator.replaceFragment(LoginFragment.newInstance())
+            }
+            else {
+                SnackBarUtils.showSnackBar(view, getString(R.string.something_went_wrong), Snackbar.LENGTH_SHORT)
+            }
+        })
+
+//        homeViewModel.mutableLiveDataValidate.observe(mainActivity, Observer {
+//            it?.let {
+//                it.status.let { status ->
+//                    if (!status) {
+//                        prefHelper.clearAllData()
+//                        fragmentNavigator.replaceFragment(LoginFragment.newInstance())
+//
+//                    }
+//                }
+//            }
+//        })
+
+    }
+    fun showServers() {
+//        requireActivity().supportFragmentManager.beginTransaction()
+
+        try {
+//            requireActivity().supportFragmentManager.beginTransaction()
+//                .replace(
+//                    R.id.server_container,
+//                    TvServerListFragment.newInstance(),
+//                    "TvServerListFragment"
+//                )
+//                .commit()
+            tvHomeBinding.serverContainer?.visibility = View.VISIBLE
+        }
+        catch (e: Exception) {
+            e.printStackTrace()
+        }
+
+    }
+
+//    fun showExitPopup(activity: Activity) {
+//        val priceDialog = Dialog(activity)
+//        priceDialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
+//        priceDialog.setContentView(R.layout.dialogs_exit)
+//        priceDialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+//        priceDialog.setCancelable(true)
+//        priceDialog.show()
+//        val tvYes = priceDialog.findViewById<View>(R.id.tvYes) as TextView
+//        val tvNo = priceDialog.findViewById<View>(R.id.tvNo) as TextView
+//        tvYes.setOnClickListener {
+//            priceDialog.dismiss()
+//            if (isVisible)
+//                mainActivity.showLoading()
+////            if (App.connection_status == App.CONNECTION_STATE_CONNECTED || App.connection_status == App.CONNECTION_STATE_CONNECTED_2) {
+//////                vpnConnectionsUtil.connectVpn()
+////                ivConnect.performClick()
+////            }
+//
+//            if (App.connection_status == App.CONNECTION_STATE_CONNECTED || App.connection_status == App.CONNECTION_STATE_CONNECTED_2 || App.connection_status == App.CONNECTION_STATE_UP_WG) {
+//                Handler(Looper.getMainLooper()).postDelayed({
+//                    ivConnect?.performClick()
+//                }, 500)
+//            }
+//
+//            profileViewModel.logout()
+//        }
+//        tvNo.setOnClickListener { priceDialog.dismiss() }
+//    }
+
+    override fun onChangeProtocol(protocol: Protocol) {
+        prefHelper.saveProtocol(protocol)
+    }
+
+    override fun onServerSelected(server: Server) {
+//        fragmentNavigator?.let {
+//            if (it.topFragment is ServerListFragment) {
+//                fragmentNavigator.popBackStack()
+//            }
+//        }
+
+        serverobj?.let {
+            if (vpnConnectionsUtil.isVPNConnected()) {
+                if (serverobj?.id != server.id) {
+//                    DialogFactory.createDialog(requireActivity(),
+//                        serverobj?.server_name,
+//                        server.server_name,
+//                        object : DialogInterface.OnClickListener {
+//                            override fun onClick(dialog: DialogInterface?, which: Int) {
+//                                setData(server)
+//                                vpnConnectionsUtil.stopVpn()
+//                                Handler().postDelayed(Runnable {
+//                                    tvHomeBinding.ivConnect?.performClick()
+//                                }, 500)
+//                            }
+//                        },
+//                        object : DialogInterface.OnClickListener {
+//                            override fun onClick(dialog: DialogInterface?, which: Int) {
+//                               dialog?.dismiss()
+//                            }
+//                        })
+                } else {
+                    setData(server)
+                }
+            } else {
+
+                setData(server)
+//                ivConnect?.performClick()
+
+                if (fragmentNavigator.topFragment is TvHomeFragment) {
+                    vpnConnectionsUtil.stopVpn()
+                    Handler().postDelayed(Runnable {
+                        tvHomeBinding.ivConnect?.performClick()
+                    }, 500)
+                }
+
+            }
+
+        } ?: kotlin.run {
+            setData(server)
+        }
+    }
+
+    fun setData(server: Server) {
+        serverobj = server
+
+        tvHomeBinding.tvServer?.text = server.server_name ?: server.name
+        tvHomeBinding.ivCountry?.setImageDrawable(
+            Utils.getCountryFlag(mainActivity, server.iso?.toLowerCase().toString())
+        )
+    }
+
+    override fun setTitleBar() {
+//        setupUI((mainActivity).titleBar, (mainActivity).bottomBar)
+    }
+
+//    private fun setupUI(titleBar: TitleBar, bottomBar: BottomBar) {
+//        titleBar.hideTitleBar()
+//        bottomBar.hideBottomBar()
+//    }
+
+    override fun onResume() {
+        super.onResume()
+
+        prefHelper.getProduct()?.identifier?.let {
+            if (it == AppEnum.FREE.key) {
+                SnackBarUtils.showSnackBar(
+                    view, getString(R.string.account_not_subscribed), Snackbar.LENGTH_LONG)
+            }
+        }
+
+        try {
+            App.backend?.runningTunnelNames
+        } catch (e: Exception) {
+            val back = GoBackend(requireContext())
+            App.setBackend(back)
+            App.backend = App.getBackend()
+        }
+
+        vpnConnectionsUtil.onResumeCallBack()
+
+        homeViewModel.validatePassword(
+            prefHelper?.getUser()?.userinfo?.email.toString(),
+            prefHelper?.getPassword().toString(),
+            "tv",
+            android.os.Build.VERSION.RELEASE
+        )
+    }
+
+    override fun onPause() {
+        super.onPause()
+
+        vpnConnectionsUtil.onPauseCallBack()
+    }
+
+    override fun onStop() {
+        super.onStop()
+        vpnConnectionsUtil.onStopCallBack()
+    }
+
+    override fun onVpnConnecting() {
+        tvHomeBinding.tvConnectStatus?.let {
+            it.text = resources.getString(R.string.connecting_new)
+        }
+
+    }
+
+    override fun onVpnConnected() {
+        tvHomeBinding.tvConnectStatus?.let {
+            it.text = resources.getString(R.string.connected)
+            it.setTextColor(Color.parseColor("#fdb900"))
+
+            tvHomeBinding.ivConnect.setImageResource(R.drawable.ic_connect_y_new)
+            tvHomeBinding.root.background = resources.getDrawable(R.drawable.gradient_list_button)
+        }
+
+        prefHelper.getServerObject().let { server ->
+            tvHomeBinding.tvIp?.let {
+                it.text = "IP: ${server?.ip}"
+                if (server!!.city == null)
+                {
+                    tvHomeBinding.tvCountry.text ="${server?.country}"
+                }
+                else{
+                    tvHomeBinding.tvCountry.text ="${server.city}, ${server?.country}"
+                }
+                tvHomeBinding.cardCountryImg.visibility = View.VISIBLE
+                tvHomeBinding.ivCountry.setImageDrawable(
+                    Utils.getCountryFlag(mainActivity, server?.iso?.toLowerCase().toString())
+                )
+            }
+        }
+    }
+
+    override fun onVpnDisconnected() {
+        tvHomeBinding.tvConnectStatus?.let {
+            it.text = resources.getString(R.string.disconnected)
+            it.setTextColor(resources.getColor(R.color.white_half))
+
+            tvHomeBinding.root.setBackgroundColor(resources.getColor(R.color.connect_button_color))
+            tvHomeBinding.ivConnect.setImageResource(R.drawable.ic_connect_n_new)
+        }
+    }
+
+    override fun onGetIp() {
+        if (App.connection_status != App.CONNECTION_STATE_CONNECTED) {
+            homeViewModel.getIp()
+        }
+    }
+
+    override fun onServerNotResponding() {
+        if (prefHelper.getProtocol().index == 0) {
+//            vpnConnectionsUtil.stopVpn()
+            vpnConnectionsUtil.startTcpUDP()
+        }
+        else{
+            Toast.makeText(
+                requireActivity(),
+                getString(R.string.server_not_responding),
+                Toast.LENGTH_SHORT
+            ).show()
+        }
+    }
+}

+ 490 - 0
app/src/main/java/com/vpn/fastestvpnservice/fragments/TvServerListFragment.kt

@@ -0,0 +1,490 @@
+package com.vpn.fastestvpnservice.fragments
+
+import android.view.*
+
+
+class TvServerListFragment : BaseFragment()
+//    , UpdateServersOnProtocol
+{
+
+    //    lateinit var serverListViewModel: ServerListViewModel
+//    lateinit var serverAdapter: ServerAdapter
+//    lateinit var dedicatedServerAdapter: ServerAdapter
+//    lateinit var streamingServerAdapter: ServerAdapter
+//    lateinit var dvpnServerAdapter: ServerAdapter
+//    lateinit var p2pServerAdapter: ServerAdapter
+//    lateinit var favouritesAdapter: FavouritesAdapter
+//    lateinit var settingsAdapter: SettingsAdapter
+//    var settingsList = ArrayList<SettingsData>()
+//
+//    var isServersEnabled: Boolean = false
+//    var isDedicatedEnabled: Boolean = false
+//    var isStreamingEnabled: Boolean = false
+//    var isDvpnEnabled: Boolean = false
+//    var isP2PEnabled: Boolean = false
+//
+//    override fun onCreateView(
+//        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+//    ): View? {
+//        return inflater.inflate(R.layout.fragment_server_list, container, false)
+//    }
+//
+//    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+//        super.onViewCreated(view, savedInstanceState)
+////        GuidedStepSupportFragment.addAsRoot(requireActivity(), FirstStepFragment(), android.R.id.content)
+////        GuidedStepSupportFragment.add(fragmentManager, FirstStepFragment(), android.R.id.content)
+//
+//        serverListViewModel = ServerListViewModel(mainActivity)
+//        MainActivity.updateServersOnProtocol = this
+//
+//        setAdaptersCallBack()
+//        setAdapters()
+//        clickListeners()
+//    }
+//
+//    fun setAdaptersCallBack() {
+//        val serversData = prefHelper.getServerData()
+//
+//        serversData.forEachIndexed { index, serverData ->
+////            Log.d("servers testing tv 123", "$index,${serverData.name},${serverData.servers?.size}")
+//
+//            if (serverData.name?.equals("Servers") == true)
+//            {
+//                prefHelper.getServerData().get(index).servers?.let { serversList ->
+//                    serverAdapter = ServerAdapter(
+//                        mainActivity,
+//                        R.layout.item_server,
+//                        prefHelper.getServerData().get(index).servers?.let {
+//                            serverListViewModel.filterServersWithTvCountries(
+//                                it
+//                            )
+//                        }
+//                    )
+//
+//                    val data = serverListViewModel.filterServersWithTvCountries(serversList)
+//                    if (data.size > 0)
+//                    {
+////                        tvcountries.text = serverData.name
+//                        tvcountries?.text = "Top Locations"
+//                        isServersEnabled = true
+//                    }
+//                    else {
+//                        tvcountries?.text = ""
+//                        isServersEnabled = false
+//                    }
+//
+//                    serverAdapter.selectedPosition = 55
+//                    rv_servers?.layoutManager =
+//                        LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
+//                    rv_servers?.adapter = serverAdapter
+//                }
+//            }
+//            else if (serverData.name?.equals("Dedicated IP") == true)
+//            {
+//                prefHelper.getServerData().get(index).servers?.let { dedicated ->
+//
+////                    Log.d("ser_test_ded", "Dedicated IP $isDedicatedEnabled")
+//                    dedicatedServerAdapter = ServerAdapter(
+//                        mainActivity,
+//                        R.layout.item_server,
+//                        prefHelper.getServerData().get(index).servers?.let {
+//                            serverListViewModel.filterServersByISOTV(
+//                                it
+//                            )
+//                        }
+//                    )
+//
+//                    val data = serverListViewModel.filterServersByISOTV(dedicated)
+//                    if (data.size > 0)
+//                    {
+////                        Log.d("ser_test_ded", "Dedicated size>0 $isDedicatedEnabled")
+//
+//                        tv_dedicatedip_servers_tv?.text = serverData.name
+//                        isDedicatedEnabled = true
+//                    }
+//                    else {
+//                        tv_dedicatedip_servers_tv?.text = ""
+//                        isDedicatedEnabled = false
+//                    }
+//
+////                    Log.d("ser_test_ded", "Dedicated size=0 $isDedicatedEnabled")
+//                    dedicatedServerAdapter.selectedPosition = 55
+//                    rv_dedicatedip_servers_tv?.layoutManager =
+//                        LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
+//                    rv_dedicatedip_servers_tv?.adapter = dedicatedServerAdapter
+//
+//                }
+//            }
+//            else if (serverData.name?.equals("Streaming") == true)
+//            {
+//                prefHelper.getServerData().get(index).servers?.let { streaming ->
+//                    streamingServerAdapter = ServerAdapter(
+//                        mainActivity,
+//                        R.layout.item_server,
+//                        prefHelper.getServerData().get(index).servers?.let {
+//                            serverListViewModel.filterServersByStreamingServersTV(
+//                                it
+//                            )
+//                        }
+//                    )
+//
+//                    val data = serverListViewModel.filterServersByStreamingServersTV(streaming)
+//                    if (data.size > 0)
+//                    {
+//                        tvstreaming?.text = serverData.name
+//                        isStreamingEnabled = true
+//                    }
+//                    else {
+//                        tvstreaming?.text = ""
+//                        isStreamingEnabled = false
+//                    }
+//
+//                    streamingServerAdapter.selectedPosition = 55
+//                    rv_streaming?.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
+//                    rv_streaming?.adapter = streamingServerAdapter
+//                }
+//            }
+//            else if (serverData.name?.equals("D-VPN") == true)
+//            {
+//                prefHelper.getServerData().get(index).servers?.let { dvpn ->
+//                    dvpnServerAdapter = ServerAdapter(
+//                        mainActivity,
+//                        R.layout.item_server,
+//                        prefHelper.getServerData().get(index).servers?.let {
+//                            serverListViewModel.filterServersByISOTV(
+//                                it
+//                            )
+//                        }
+//                    )
+//
+//                    val data = serverListViewModel.filterServersByISOTV(dvpn)
+//                    if (data.size > 0)
+//                    {
+//                        tvdvpn?.text = serverData.name
+//                        isDvpnEnabled = true
+//                    }
+//                    else {
+//                        tvdvpn?.text = ""
+//                        isDvpnEnabled = false
+//                    }
+//
+//                    dvpnServerAdapter.selectedPosition = 55
+//                    rv_dvpn?.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
+//                    rv_dvpn?.adapter = dvpnServerAdapter
+//
+//                }
+//            }
+//            else if (serverData.name?.equals("P2P") == true)
+//            {
+//                prefHelper.getServerData().get(index).servers?.let { p2p ->
+//                    p2pServerAdapter = ServerAdapter(
+//                        mainActivity,
+//                        R.layout.item_server,
+//                        prefHelper.getServerData().get(index).servers?.let {
+//                            serverListViewModel.filterServersByISOTV(
+//                                it
+//                            )
+//                        }
+//                    )
+//
+//                    val data = serverListViewModel.filterServersByISOTV(p2p)
+//                    if (data.size > 0)
+//                    {
+//                        tvp2p?.text = serverData.name
+//                        isP2PEnabled = true
+//                    }
+//                    else {
+//                        tvp2p?.text = ""
+//                        isP2PEnabled = false
+//                    }
+//
+//                    p2pServerAdapter.selectedPosition = 55
+//                    rv_p2p?.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
+//                    rv_p2p?.adapter = p2pServerAdapter
+//                }
+//            }
+//        }
+//    }
+//    fun setAdapters() {
+//
+//        /*Favourite List*/
+//        favouritesAdapter = FavouritesAdapter(
+//            mainActivity, R.layout.item_favourites, serverListViewModel.getFavList()
+//        )
+//        rvList_favourite.layoutManager =
+//            LinearLayoutManager(mainActivity, LinearLayoutManager.HORIZONTAL, false)
+//        rvList_favourite.adapter = favouritesAdapter
+//
+//        /*Settings List*/
+//
+//        settingsList.add(SettingsData("vpn_key_24", "Protocol"))
+//        settingsList.add(SettingsData("ic_splittunneling", "Split Tunneling"))
+////        settingsList.add(SettingsData("ic_killswitch", "Kill Switch"))
+//
+//        settingsAdapter = SettingsAdapter(
+//            mainActivity, R.layout.item_settings_tv, settingsList
+//        )
+//
+//        rv_settings?.layoutManager =
+//            LinearLayoutManager(mainActivity, LinearLayoutManager.HORIZONTAL, false)
+//        rv_settings?.adapter = settingsAdapter
+//
+//    }
+//
+//    fun clickListeners() {
+//
+//        if (isServersEnabled)
+//        {
+//            serverAdapter.setOnItemClickListener { adapter, view, position ->
+//
+//                serverAdapter.getItem(position)?.let {
+//                    if (it.enable == 1) {
+//                        MainActivity.callBacks?.onServerSelected(it)
+//                    }
+//                }
+//            }
+//        }
+//
+//        if (isDedicatedEnabled)
+//        {
+//            dedicatedServerAdapter.setOnItemClickListener { adapter, view, position ->
+//
+//                dedicatedServerAdapter.getItem(position)?.let {
+//                    if (it.enable == 1) {
+//                        MainActivity.callBacks?.onServerSelected(it)
+//                    }
+//                }
+//            }
+//        }
+//
+//        if (isStreamingEnabled)
+//        {
+//            streamingServerAdapter.setOnItemClickListener { adapter, view, position ->
+//
+//                streamingServerAdapter.getItem(position)?.let {
+//                    if (it.enable == 1)
+//                    {
+//                        MainActivity.callBacks?.onServerSelected(it)
+//                    }
+//                }
+//            }
+//        }
+//
+//        if (isDvpnEnabled)
+//        {
+//            dvpnServerAdapter.setOnItemClickListener { adapter, view, position ->
+//
+//                dvpnServerAdapter.getItem(position)?.let {
+//                    if (it.enable == 1) {
+//                        MainActivity.callBacks?.onServerSelected(it)
+//                    }
+//                }
+//            }
+//        }
+//
+//        if (isP2PEnabled)
+//        {
+//            p2pServerAdapter.setOnItemClickListener { adapter, view, position ->
+//
+//                p2pServerAdapter.getItem(position)?.let {
+//                    if (it.enable == 1) {
+//                        MainActivity.callBacks?.onServerSelected(it)
+//                    }
+//                }
+//            }
+//        }
+//
+////        if (isRecommendedEnabled)
+////        {
+////            recommendedAdapter.setOnItemClickListener { adapter, view, position ->
+////                recommendedAdapter.getItem(position)
+////                    ?.let { MainActivity.callBacks?.onServerSelected(it) }
+////            }
+////        }
+//
+////        rv_servers?.setOnFocusChangeListener { views, b ->
+////            if (b) {
+////                card_bg.background = views.resources.getDrawable(R.drawable.itemserver_background_tv)
+////            } else {
+////                card_bg.background = views.resources.getDrawable(R.drawable.itemserver_background_tv)
+////            }
+////        }
+//
+//        settingsAdapter.setOnItemClickListener { adapter, view, position ->
+//            if (position == 0)
+//            {
+//
+////                showProtocolPopup(requireActivity())
+//
+//                GuidedStepSupportFragment.add(fragmentManager,
+//                    FirstStepFragment(), android.R.id.content)
+//
+////                GuidedStepSupportFragment.addAsRoot(requireActivity(),
+////                    FirstStepFragment(), android.R.id.content)
+//
+//            }
+//            else if (position == 1)
+//            {
+//
+//                val appsName: ArrayList<SelectApplicationEntry> = ArrayList()
+//                val appsPackageName: ArrayList<String> = ArrayList()
+//
+//                val mPackageManager: PackageManager = requireContext().packageManager
+//                val context: Context = requireContext()
+//
+//                for (info in mPackageManager.getInstalledApplications(PackageManager.GET_META_DATA))
+//                {
+//
+//                    if (info.flags and ApplicationInfo.FLAG_SYSTEM == 0) { // good
+//
+//                        if (mPackageManager.checkPermission(android.Manifest.permission.INTERNET, info.packageName
+//                            ) == PackageManager.PERMISSION_GRANTED)
+//                        {
+//                            if (info.packageName == context.packageName) continue
+//                            val entry = SelectApplicationEntry(mPackageManager, info)
+//                            appsName.add(entry)
+//                        }
+//                    }
+//
+//                    if (info.flags and ApplicationInfo.FLAG_UPDATED_SYSTEM_APP != 0) { // ok but some different also apps
+//                    if (mPackageManager.checkPermission(android.Manifest.permission.INTERNET, info.packageName
+//                        ) == PackageManager.PERMISSION_GRANTED)
+//                    {
+//                        if (info.packageName == context.packageName) continue
+//                        val entry = SelectApplicationEntry(mPackageManager, info)
+//                        appsName.add(entry)
+//                    }
+//                    }
+//                }
+//
+//                var tempTvApps = ArrayList<String>()
+//                var tempTvIcon = ArrayList<Drawable>()
+//                var bitmapList: ArrayList<Bitmap> = ArrayList()
+//
+//                appsName.forEach {
+//                    it.getInfo()?.packageName?.let {
+//                            it1 -> appsPackageName.add(it1)
+//                    }
+//                    tempTvApps.add(it.toString())
+//                    it.getIcon()?.let { it1 -> tempTvIcon.add(it1) }
+//                }
+//
+////                Log.d("apps in tv appsName", appsName.get(0).getIcon().toString() + " " + appsName.get(0))
+////                Log.d("apps in tv appsPackage", appsPackageName.toString() + " " + appsPackageName.size)
+////                Log.d("apps in tv tempTvApps", tempTvApps.toString() + " " + tempTvApps.size)
+////                Log.d("apps in tv tempTvIcon", tempTvIcon.toString() + " " + tempTvIcon.size)
+//
+//                prefHelper.setSplitTunnelTvAppsName(tempTvApps)
+//                prefHelper.setSplitTunnelTvAppsPackageName(appsPackageName)
+//
+////                prefHelper.setEnableTvAppsSplit(tempTvApps)
+//
+//                GuidedStepSupportFragment.add(fragmentManager,
+//                    SecondStepFragment(tempTvIcon, true), android.R.id.content)
+//
+//                //        if (info.flags and ApplicationInfo.FLAG_SYSTEM != 0) {   // not ok
+////                        Log.d("apps in tv 2", info.packageName)
+////                    }
+////                    if (info.flags and ApplicationInfo.FLAG_UPDATED_SYSTEM_APP == 0) {  // not ok
+////                        Log.d("apps in tv 3", info.packageName)
+////                    }
+////                GuidedStepSupportFragment.addAsRoot(requireActivity(), FirstStepFragment(), android.R.id.content)
+//            }
+//
+//        }
+//
+//        favouritesAdapter.setOnItemClickListener { adapter, view, position ->
+//            favouritesAdapter.getItem(position)?.let {
+//                MainActivity.callBacks?.onServerSelected(it)
+//            }
+//        }
+//
+//        favouritesAdapter.setOnItemLongClickListener { adapter, view, position ->
+//            favUnFav(favouritesAdapter.getItem(position)!!)
+//            true
+//        }
+//    }
+//
+//    fun favUnFav(server: Server) {
+//
+//        serverListViewModel.favAndUnFav(server)
+//
+//        favouritesAdapter.data.clear()
+//        favouritesAdapter.setNewData(serverListViewModel.getFavList())
+//        favouritesAdapter.notifyDataSetChanged()
+//    }
+//
+//    fun showProtocolPopup(activity: Activity) {
+//        val priceDialog = Dialog(activity)
+//        priceDialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
+//        priceDialog.setContentView(R.layout.dialog_protocol)
+//        priceDialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+//        priceDialog.setCancelable(true)
+//        priceDialog.show()
+//
+//        val tvAuto = priceDialog.findViewById<View>(R.id.radioBtnAutoTv) as RadioButton
+//        val tvWg = priceDialog.findViewById<View>(R.id.radioBtnWGTv) as RadioButton
+//        val tvIkev = priceDialog.findViewById<View>(R.id.radioBtnIKEVTv) as RadioButton
+//        val tvTcp = priceDialog.findViewById<View>(R.id.radioBtnTCPTv) as RadioButton
+//        val tvUdp = priceDialog.findViewById<View>(R.id.radioBtnUDPTv) as RadioButton
+//
+//        prefHelper.getProtocol().let {
+//            when (it.index) {
+//                0 -> {
+//                    tvAuto.isChecked = true
+//                }
+//                1 -> {
+//                    tvWg.isChecked = true
+//                }
+//                2 -> {
+//                    tvIkev.isChecked = true
+//                }
+//                3 -> {
+//                    tvTcp.isChecked = true
+//                }
+//                4 -> {
+//                    tvUdp.isChecked = true
+//                }
+//            }
+//        }
+//
+//        tvAuto.setOnClickListener { priceDialog.dismiss()
+//             MainActivity.callBacks?.onChangeProtocol(Protocol(AppEnum.AUTO_PROTOCOL.title, AppEnum.IKEV2_PROTOCOL.key,0))
+//        }
+//        tvWg.setOnClickListener { priceDialog.dismiss()
+//            MainActivity.callBacks?.onChangeProtocol(Protocol(AppEnum.WG_PROTOCOL.title, AppEnum.WG_PROTOCOL.key,1))
+//        }
+//        tvIkev.setOnClickListener { priceDialog.dismiss()
+//            MainActivity.callBacks?.onChangeProtocol(Protocol(AppEnum.IKEV2_PROTOCOL.title, AppEnum.IKEV2_PROTOCOL.key,2))
+//        }
+//        tvTcp.setOnClickListener { priceDialog.dismiss()
+//            MainActivity.callBacks?.onChangeProtocol(Protocol(AppEnum.TCP_PROTOCOL.title, AppEnum.TCP_PROTOCOL.key,3))
+//        }
+//        tvUdp.setOnClickListener { priceDialog.dismiss()
+//            MainActivity.callBacks?.onChangeProtocol(Protocol(AppEnum.UDP_PROTOCOL.title, AppEnum.UDP_PROTOCOL.key,4))
+//        }
+//    }
+//
+//    override fun setTitleBar() {
+//        setupUI((mainActivity).titleBar, (mainActivity).bottomBar)
+//    }
+//
+//    private fun setupUI(titleBar: TitleBar, bottomBar: BottomBar) {
+//        titleBar.hideTitleBar()
+//        bottomBar.hideBottomBar()
+//    }
+//
+//    companion object {
+//        fun newInstance(): TvServerListFragment {
+//            return TvServerListFragment()
+//        }
+//    }
+//
+//    override fun updateServersOnCallback() {
+//        setAdaptersCallBack()
+//        clickListeners()
+//    }
+    override fun setTitleBar() {
+        TODO("Not yet implemented")
+    }
+}

+ 176 - 0
app/src/main/java/com/vpn/fastestvpnservice/helpers/FragmentNavigator.java

@@ -0,0 +1,176 @@
+package com.vpn.fastestvpnservice.helpers;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
+import com.vpn.fastestvpnservice.fragments.BaseFragment;
+
+public class FragmentNavigator {
+
+
+    //_____________________ Private variables ____________________//
+    private FragmentManager mFragmentManager;
+    private int mContainerId;
+    public FragmentNavigator() {
+    }
+
+    /**
+     * The method register this class in your activity or fragment
+     *
+     * @param fragmentManager - fragment manager or child fragment manager
+     * @param containerId     - id container for fragments
+     */
+    public void register(FragmentManager fragmentManager, int containerId) {
+        this.mFragmentManager = fragmentManager;
+        this.mContainerId = containerId;
+    }
+
+    public void unRegister() {
+        this.mFragmentManager = null;
+    }
+
+    public int getContainerId() {
+        return mContainerId;
+    }
+
+    /**
+     * The method clear all fragments in fragment manager
+     */
+    public void clearAllFragments() {
+        int entryCount = mFragmentManager.getBackStackEntryCount();
+        if (entryCount <= 0)
+            return;
+
+        FragmentManager.BackStackEntry entry = mFragmentManager.getBackStackEntryAt(0);
+        int id = entry.getId();
+        mFragmentManager.popBackStackImmediate(id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+    }
+
+    public void clearBackStackToFragmentOrShow(BaseFragment _baseFragment) {
+        int entryCount = mFragmentManager.getBackStackEntryCount();
+        String tag = _baseFragment.getClass().toString();
+        FragmentManager.BackStackEntry searchedEntry = null;
+        for (int i = 0; i < entryCount; ++i) {
+            FragmentManager.BackStackEntry entry = mFragmentManager.getBackStackEntryAt(i);
+            if (entry.getName().equals(tag)) {
+                searchedEntry = mFragmentManager.getBackStackEntryAt(i);
+                break;
+            }
+        }
+
+        if (searchedEntry != null)
+            mFragmentManager.popBackStackImmediate(searchedEntry.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
+
+        showFragment(_baseFragment);
+    }
+
+    public FragmentManager getFragmentManager() {
+        return mFragmentManager;
+    }
+
+    /**
+     * The method return true - if back stack not empty and true another. And call back stack in fragment manager
+     */
+    public boolean popBackStack() {
+        return mFragmentManager.popBackStackImmediate();
+    }
+
+    /**
+     * The method work replace fragment with back stack (key = class model fragment)
+     *
+     * @param baseFragment - fragment for adding
+     */
+    public void showFragment(BaseFragment baseFragment) {
+        if (mFragmentManager != null)
+            getTransaction()
+                    .replace(mContainerId, baseFragment)
+                    .addToBackStack(baseFragment.getClass().toString())
+                    .commit();
+    }
+
+    /**
+     * The method work replace fragment without back stack
+     *
+     * @param baseFragment - fragment for replacing
+     */
+    public void replaceFragment(BaseFragment baseFragment) {
+        if (mFragmentManager != null)
+            getTransaction()
+                    .replace(mContainerId, baseFragment)
+                    .commit();
+    }
+
+    public void replaceFragmentWithLoss(BaseFragment baseFragment) {
+        if (mFragmentManager != null)
+            getTransaction()
+                    .replace(mContainerId, baseFragment)
+                    .commitAllowingStateLoss();
+    }
+
+    public void replaceFragmentWithBackStack(BaseFragment baseFragment) {
+        if (mFragmentManager != null)
+            getTransaction()
+                    .replace(mContainerId, baseFragment)
+                    .addToBackStack(baseFragment.getClass().getSimpleName())
+                    .commit();
+    }
+
+    public void replaceFragmentWithBackStackTv(BaseFragment baseFragment, String tag) {
+        if (mFragmentManager != null)
+            getTransaction()
+                    .replace(mContainerId, baseFragment, tag)
+                    .addToBackStack(baseFragment.getClass().getSimpleName())
+                    .commit();
+    }
+
+    public void removeFragment(BaseFragment baseFragment) {
+        if (mFragmentManager != null)
+            getTransaction().remove(baseFragment).commit();
+    }
+
+    public void addFragment(BaseFragment baseFragment) {
+        if (mFragmentManager != null)
+            getTransaction()
+                    .add(mContainerId, baseFragment)
+                    .addToBackStack(baseFragment.getClass().getSimpleName())
+                    .commit();
+    }
+
+    public void addFragmentTv(Fragment baseFragment) {
+        if (mFragmentManager != null)
+            getTransaction()
+                    .add(mContainerId, baseFragment)
+                    .addToBackStack(baseFragment.getClass().getSimpleName())
+                    .commit();
+    }
+
+    public void showFragmentWithoutBackStack(BaseFragment baseFragment) {
+        if (mFragmentManager != null) {
+            clearAllFragments();
+            replaceFragment(baseFragment);
+        }
+    }
+
+    @NonNull
+    public BaseFragment getTopFragment() {
+        if (mFragmentManager == null)
+            throw new NullPointerException("FragmentManager in Navigator is null");
+
+        return (BaseFragment) mFragmentManager
+                .findFragmentById(mContainerId);
+    }
+
+    public int getFragmentCountInBackStack() {
+        return mFragmentManager.getBackStackEntryCount();
+    }
+
+    /**
+     * The method return fragment transaction
+     */
+    public FragmentTransaction getTransaction() {
+        return mFragmentManager.beginTransaction();
+    }
+
+}

+ 9 - 0
app/src/main/java/com/vpn/fastestvpnservice/interfaces/CallBacks.kt

@@ -0,0 +1,9 @@
+package com.vpn.fastestvpnservice.interfaces
+
+import com.vpn.fastestvpnservice.beans.Protocol
+import com.vpn.fastestvpnservice.beans.Server
+
+interface CallBacks {
+    fun onServerSelected(server: Server)
+    fun onChangeProtocol(protocol: Protocol)
+}

+ 18 - 0
app/src/main/java/com/vpn/fastestvpnservice/utils/SnackBarUtils.kt

@@ -0,0 +1,18 @@
+package com.vpn.fastestvpnservice.utils
+
+import android.graphics.Color
+import android.view.View
+import android.widget.TextView
+import com.google.android.material.R
+import com.google.android.material.snackbar.Snackbar
+
+object SnackBarUtils {
+    fun showSnackBar(rootView: View?, text: String?, duration: Int) {
+        val snack = Snackbar.make(rootView!!, text!!, duration)
+        val view = snack.view
+        val tv = view.findViewById<View>(R.id.snackbar_text) as TextView
+        tv.setTextColor(Color.BLACK)
+        view.setBackgroundColor(Color.parseColor("#FDB900"))
+        snack.show()
+    }
+}

+ 16 - 0
app/src/main/java/com/vpn/fastestvpnservice/utils/Utils.kt

@@ -3,6 +3,7 @@ package com.vpn.fastestvpnservice.utils
 import android.content.Context
 import android.graphics.drawable.Drawable
 import android.util.Log
+import androidx.appcompat.content.res.AppCompatResources
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.rememberUpdatedState
@@ -28,6 +29,21 @@ class Utils {
             return context.resources.getIdentifier(iso_gray, "drawable", context.packageName)
         }
 
+        fun getCountryFlag(context: Context, countryCode: String): Drawable? {
+            try{
+                return AppCompatResources.getDrawable(
+                    context, context.resources.getIdentifier(
+                        context.packageName + ":drawable/" + countryCode.toLowerCase(Locale.getDefault()),
+                        null,
+                        null
+                    )
+                )
+            }catch (e:java.lang.Exception){
+
+            }
+            return null
+        }
+
 //        @Composable
 //        fun OnLifecycleEvent(onEvent: (
 //            owner: LifecycleOwner,

+ 49 - 0
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/ProfileViewModel.kt

@@ -0,0 +1,49 @@
+package com.vpn.fastestvpnservice.viewmodels
+
+import android.util.Log
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+import com.vpn.fastestvpnservice.beans.DataResponse
+import com.vpn.fastestvpnservice.retrofit.RetrofitNetworkHandling
+import com.vpn.fastestvpnservice.retrofit.WebServiceFactory
+import retrofit2.Call
+
+class ProfileViewModel : ViewModel() {
+
+    var mutableLiveDataLogoutTv = MutableLiveData<Boolean>()
+
+    fun logout(){
+        WebServiceFactory.getInstance().logout().enqueue(RetrofitNetworkHandling<Any>(
+            object : RetrofitNetworkHandling.ResponseCallback<Any> {
+                override fun onSuccess(call: Call<Any>?, response: Any?) {
+                    try {
+                        Log.d("test_api_response","Response onSuccess: ${response.toString()}")
+                        val gson = Gson()
+                        val jsonString = gson.toJson(response)
+                        val type = object : TypeToken<DataResponse<Object>>() {}.type
+                        val data = gson.fromJson<DataResponse<Object>>(jsonString, type)
+                        mutableLiveDataLogoutTv.value = data.status == true
+
+                        Log.d("test_api_response","Response After onSuccess: ${response.toString()}")
+                    } catch (ex: Exception) {
+
+                    }
+
+                }
+
+                override fun onFail(call: Call<Any>?, response: Any?) {
+                    Log.d("test_api_response","Response onFail:")
+                    mutableLiveDataLogoutTv.value = false
+                }
+
+                override fun onError(call: Call<Any>?, response: Any?) {
+                    Log.d("test_api_response","Response onFail:")
+                    mutableLiveDataLogoutTv.value = false
+                }
+            })
+        )
+    }
+
+}

+ 18 - 0
app/src/main/java/com/vpn/fastestvpnservice/views/CustomValidation.java

@@ -34,6 +34,24 @@ public class CustomValidation {
 
     }
 
+    public boolean isValidText(EditText edittext, String fName) {
+        String validate = edittext.getText().toString();
+        validate = validate.replaceAll("\\s+", " ").trim();
+        if (validate.isEmpty()) {
+            edittext.setError(fName + " is Empty");
+            return false;
+        }
+        return true;
+    }
+    public boolean isValidPassword(EditText editText) {
+        String pass = editText.getText().toString().trim();
+        if (pass != null && pass.length() >= 3) {
+            return true;
+        }
+        editText.setError("Should be greater than 3!");
+        return false;
+
+    }
 
     public static boolean validateEmail(EditText editText, CustomTextInputLayout textInputLayout, String error) {
         String email = editText.getText().toString().trim();

+ 1 - 1
app/src/main/java/de/blinkt/openvpn/core/App.java

@@ -51,7 +51,7 @@ public class App extends /*com.orm.SugarApp*/ Application {
     public static boolean ShowDailyUsage = true;
 
     public static boolean isShowNotify = false;
-    public static final boolean isAndroidTvBox = true;
+    public static final boolean isAndroidTvBox = false;
 
     public static String device_id;
     public static long device_created;

+ 6 - 0
app/src/main/res/anim/fade_in.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/accelerate_interpolator"
+    android:fromAlpha="0.0" android:toAlpha="1.0"
+    android:duration="500" />

+ 7 - 0
app/src/main/res/color/textviewhover.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <!--<item android:color="@color/colorUniqueYellow" android:state_pressed="true"/>-->
+    <item android:color="@color/white" android:state_focused="true"/>
+    <item android:color="@color/white"/>
+    <!--colorUniqueYellow-->
+</selector>

+ 3 - 5
app/src/main/res/layout-land/activity_splash.xml

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <androidx.constraintlayout.widget.ConstraintLayout
+<androidx.constraintlayout.widget.ConstraintLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
         android:id="@+id/activity_main"
         android:layout_width="match_parent"
         android:padding="@dimen/x10dp"
@@ -44,5 +44,3 @@
             app:layout_constraintVertical_bias="1.0" />
 
     </androidx.constraintlayout.widget.ConstraintLayout>
-
-</layout>

+ 199 - 0
app/src/main/res/layout-land/activity_splash2.xml

@@ -0,0 +1,199 @@
+
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@drawable/bg_app"
+    android:fillViewport="false">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:padding="@dimen/x5dp">
+
+        <LinearLayout
+            android:id="@+id/linearLayout2"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/x30dp"
+            android:layout_marginTop="@dimen/x30dp"
+            android:layout_marginRight="@dimen/x30dp"
+            android:gravity="center"
+            android:orientation="vertical"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/imageView7">
+
+            <TextView
+                android:id="@+id/textView6"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="30dp"
+                android:fontFamily="@font/outfit_semibold"
+                android:text="Welcome back! S2"
+                android:textColor="@color/white"
+                android:layout_gravity="center"
+                android:textSize="20sp" />
+
+            <TextView
+                android:id="@+id/textView7"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="1pt"
+                android:alpha="0.5"
+                android:fontFamily="@font/outfit_regular"
+                android:text="Please login to your account."
+                android:textColor="@color/white"
+                android:textSize="16sp"
+                android:visibility="gone"
+                android:textStyle="normal" />
+
+            <LinearLayout
+                android:id="@+id/llemail"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="16dp"
+                android:background="@drawable/border_round_gray"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:layout_marginStart="@dimen/x150dp"
+                android:layout_marginEnd="@dimen/x150dp"
+                >
+
+                <EditText
+                    android:id="@+id/etEmail"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:background="@drawable/border_round_gray"
+                    android:drawablePadding="16dp"
+                    android:fontFamily="@font/outfit_regular"
+                    android:hint="@string/email"
+                    android:inputType="textEmailAddress"
+                    android:padding="18dp"
+                    android:textColor="@color/text_color_white"
+                    android:textColorHint="@color/text_color_white"
+                    android:textSize="16sp"
+                    >
+
+                </EditText>
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/llPassword"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="2pt"
+                android:background="@drawable/border_round_gray"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:layout_marginStart="@dimen/x150dp"
+                android:layout_marginEnd="@dimen/x150dp"
+                >
+
+                <EditText
+                    android:id="@+id/etPassword"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:background="#00000000"
+                    android:drawablePadding="16dp"
+                    android:focusable="true"
+                    android:fontFamily="@font/outfit_regular"
+                    android:hint="@string/pass"
+                    android:inputType="textPassword"
+                    android:padding="18dp"
+                    android:textColor="@color/text_color_white"
+                    android:textColorHint="@color/text_color_white"
+                    android:textSize="16sp" />
+
+                <ImageView
+                    android:id="@+id/ivEye"
+                    android:layout_width="32dp"
+                    android:layout_height="32dp"
+                    android:layout_marginStart="8dp"
+                    android:layout_marginEnd="16dp"
+                    android:visibility="gone"
+                    android:src="@drawable/ic_hide_password" />
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/x10dp"
+                android:orientation="horizontal"
+                android:weightSum="2">
+
+                <TextView
+                    android:id="@+id/tv_signup"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_weight="1"
+                    android:clickable="true"
+                    android:focusable="true"
+                    android:fontFamily="@font/outfit_regular"
+                    android:gravity="left"
+                    android:padding="@dimen/x5dp"
+                    android:text="@string/signup"
+                    android:textColor="@color/app_yellow_color"
+                    android:textSize="16dp"
+                    android:visibility="gone"
+                    android:textStyle="bold" />
+
+                <TextView
+                    android:id="@+id/tvForgotPassword"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:layout_weight="1"
+                    android:clickable="true"
+                    android:focusable="true"
+                    android:fontFamily="@font/outfit_regular"
+                    android:gravity="right"
+                    android:padding="@dimen/x5dp"
+                    android:text="@string/forgot_password"
+                    android:textColor="@color/app_yellow_color"
+                    android:textSize="16dp"
+                    android:visibility="gone"
+                    android:textStyle="bold" />
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <Button
+            android:id="@+id/tvLogin"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x20dp"
+            android:background="@drawable/button_selector_state"
+            android:focusable="true"
+            android:fontFamily="@font/outfit_regular"
+            android:gravity="center"
+            android:letterSpacing="0.1"
+            android:shadowColor="@color/white"
+            android:text="@string/login"
+            android:textAllCaps="false"
+            android:textColor="@color/textviewhover"
+            android:textSize="16sp"
+            android:visibility="visible"
+            android:layout_marginStart="@dimen/x150dp"
+            android:layout_marginEnd="@dimen/x150dp"
+            app:layout_constraintEnd_toEndOf="@+id/linearLayout2"
+            app:layout_constraintStart_toStartOf="@+id/linearLayout2"
+            app:layout_constraintTop_toBottomOf="@+id/linearLayout2" />
+
+        <ImageView
+            android:id="@+id/imageView7"
+            android:layout_width="60dp"
+            android:layout_height="60dp"
+            android:layout_marginTop="@dimen/x30dp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:srcCompat="@drawable/ic_logo1" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</ScrollView>

+ 385 - 0
app/src/main/res/layout-land/fragment_home.xml

@@ -0,0 +1,385 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@drawable/bg_app"
+    android:focusable="true"
+    android:clickable="true"
+    android:orientation="vertical">
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fillViewport="false"
+        >
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="5dp"
+            >
+
+
+
+    <ImageView
+        android:id="@+id/imageView6"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:src="@mipmap/ic_map"
+        android:focusable="true"
+        android:clickable="true"
+        android:focusableInTouchMode="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.0"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tvIp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:fontFamily="@font/outfit_regular"
+        android:maxLines="2"
+        android:text="Finding IP ..."
+        android:textColor="@color/white"
+        android:visibility="visible"
+        android:textSize="18sp"
+        app:layout_constraintEnd_toEndOf="@+id/connectRippleEffect"
+        app:layout_constraintStart_toStartOf="@+id/connectRippleEffect"
+        app:layout_constraintTop_toTopOf="parent"
+        />
+
+    <LinearLayout
+        android:id="@+id/ll_country"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:orientation="horizontal"
+        app:layout_constraintEnd_toEndOf="@+id/tvIp"
+        app:layout_constraintStart_toStartOf="@+id/tvIp"
+        app:layout_constraintTop_toBottomOf="@id/tvIp"
+        android:visibility="visible"
+        >
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/card_country_img"
+            android:layout_width="25dp"
+            android:layout_height="25dp"
+            android:layout_marginEnd="7dp"
+            android:visibility="gone"
+            app:cardBackgroundColor="@color/transparent"
+            app:cardCornerRadius="12.5dp">
+
+            <ImageView
+                android:id="@+id/iv_country"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:scaleType="centerCrop" />
+        </androidx.cardview.widget.CardView>
+
+        <TextView
+            android:id="@+id/tvCountry"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:fontFamily="@font/outfit_regular"
+            android:gravity="center"
+            android:maxLines="2"
+            android:text="Searching"
+            android:textColor="@color/white_half"
+            android:textSize="16sp" />
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/tv_connect_status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:fontFamily="@font/outfit_regular"
+        android:text="YOU ARE NOT CONNECTED"
+        android:textAllCaps="true"
+        android:textColor="@color/white_half"
+        android:textSize="@dimen/x12dp"
+        android:visibility="visible"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/divider2"
+        app:layout_constraintTop_toBottomOf="@id/ll_country"
+        />
+
+    <com.skyfishjy.library.RippleBackground
+        android:id="@+id/connectRippleEffect"
+        android:layout_width="200dp"
+        android:layout_height="200dp"
+        android:layout_marginEnd="24dp"
+        android:layout_marginTop="20dp"
+        android:gravity="center"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tv_connect_status"
+        app:rb_color="#ffffff"
+        app:rb_duration="1500"
+        app:rb_radius="16dp"
+        app:rb_rippleAmount="4"
+        android:visibility="visible"
+        app:rb_scale="4">
+
+        <!--        android:background="@drawable/gradient_list_button"-->
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_ivconnect"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            app:cardCornerRadius="100dp"
+            android:layout_marginTop="0dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.50"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <requestFocus />
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/root"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@color/connect_button_color">
+
+                <ImageView
+                    android:id="@+id/ivConnect"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_centerInParent="true"
+                    android:layout_gravity="center"
+                    android:focusableInTouchMode="false"
+                    android:focusable="true"
+                    android:focusedByDefault="true"
+                    android:clickable="true"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:srcCompat="@drawable/ic_connect_n_new" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+        </androidx.cardview.widget.CardView>
+
+    </com.skyfishjy.library.RippleBackground>
+
+    <LinearLayout
+        android:id="@+id/ll_fastest"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        app:layout_constraintStart_toStartOf="@id/divider2"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/connectRippleEffect"
+        android:orientation="horizontal"
+        android:layout_marginTop="15dp"
+        android:layout_marginStart="0dp"
+        android:layout_marginEnd="0dp"
+        android:gravity="center"
+        android:visibility="visible"
+        >
+
+        <TextView
+            android:id="@+id/tv_nearest_server"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Smart Connect"
+            android:padding="15dp"
+            android:paddingStart="25dp"
+            android:paddingEnd="35dp"
+            android:gravity="center"
+            android:visibility="visible"
+            android:clickable="true"
+            android:focusable="true"
+            android:layout_gravity="center"
+            android:fontFamily="@font/outfit_regular"
+            android:textColor="@color/white"
+            android:textSize="17sp"
+            android:background="@drawable/button_selector_state_tv"
+            android:drawablePadding="5dp"
+            app:drawableStartCompat="@drawable/flash" />
+
+        <TextView
+            android:id="@+id/tv_connect_fast_info"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/connect_fast_server_msg"
+            android:gravity="center"
+            android:visibility="gone"
+            android:clickable="true"
+            android:focusable="true"
+            android:layout_gravity="center"
+            android:fontFamily="@font/outfit_regular"
+            android:textColor="@color/white_half"
+            android:textSize="13sp"
+            android:paddingTop="8dp"
+            android:layout_marginTop="2dp"
+            android:layout_marginBottom="12dp"
+            />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/llServer"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:background="@drawable/round_blue_tvserver"
+        android:gravity="center"
+        android:orientation="horizontal"
+        android:padding="6dp"
+        android:paddingStart="16dp"
+        android:paddingEnd="16dp"
+        android:layout_marginStart="10dp"
+        android:layout_marginEnd="10dp"
+        android:visibility="visible"
+        android:layout_marginTop="10dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="@+id/divider2"
+        app:layout_constraintTop_toBottomOf="@id/ll_fastest"
+        app:layout_constraintBottom_toTopOf="@id/tv_logoutTv"
+        >
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/card_iv_country"
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            android:layout_marginEnd="4dp"
+            android:layout_marginTop="4dp"
+            android:layout_marginBottom="4dp"
+            app:cardBackgroundColor="@color/transparent"
+            app:cardCornerRadius="15dp">
+
+            <ImageView
+                android:id="@+id/ivCountry"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:elevation="0dp"
+                android:scaleType="fitXY" />
+        </androidx.cardview.widget.CardView>
+
+        <TextView
+            android:id="@+id/tvServer"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="8dp"
+            android:layout_weight="1"
+            android:fontFamily="@font/outfit_regular"
+            android:text="Select Server"
+            android:textColor="@color/white"
+            android:textSize="16sp" />
+
+        <ImageView
+            android:layout_width="24dp"
+            android:layout_height="24dp"
+            android:layout_marginStart="16dp"
+            android:layout_marginEnd="7dp"
+            android:visibility="gone"
+            android:src="@drawable/ic_arrow_right" />
+
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/tv_logoutTv"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:layout_marginStart="10dp"
+        android:layout_marginBottom="15dp"
+        android:layout_marginEnd="10dp"
+        android:background="@drawable/button_selector_state"
+        android:text="Logout"
+        android:gravity="center"
+        android:visibility="visible"
+        android:textSize="16sp"
+        android:focusable="true"
+        android:clickable="true"
+        android:focusableInTouchMode="false"
+        android:textColor="@color/app_blue_color"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="@id/divider2"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/llServer"
+        />
+
+    <Button
+        android:id="@+id/button2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="80dp"
+        android:text="Button"
+        android:visibility="gone"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.925"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <LinearLayout
+        android:id="@+id/navContainer"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:gravity="bottom"
+        android:orientation="vertical"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintVertical_bias="1.0" />
+
+    <FrameLayout
+        android:id="@+id/server_container"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:background="@color/transparent"
+        android:clickable="true"
+        android:focusable="true"
+        android:visibility="gone"
+        android:pointerIcon="hand"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/divider2"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintVertical_bias="1.0" />
+
+    <View
+        android:id="@+id/divider2"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:layout_marginTop="16dp"
+        android:layout_marginEnd="24dp"
+        android:layout_marginBottom="16dp"
+        android:background="?android:attr/listDivider"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/connectRippleEffect"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_protocolTv"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="15dp"
+        android:background="@drawable/button_selector_state"
+        android:text="Protocol"
+        android:gravity="center"
+        android:visibility="gone"
+        android:textSize="16sp"
+        android:textColor="@color/app_blue_color"
+        app:layout_constraintEnd_toStartOf="@id/tv_logoutTv"
+        app:layout_constraintStart_toStartOf="@id/connectRippleEffect"
+        app:layout_constraintTop_toBottomOf="@+id/tv_connect_status" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+    </ScrollView>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
+

+ 199 - 0
app/src/main/res/layout-land/fragment_login.xml

@@ -0,0 +1,199 @@
+
+<ScrollView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@drawable/bg_app"
+        android:fillViewport="false">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:padding="@dimen/x5dp">
+
+            <LinearLayout
+                android:id="@+id/linearLayout2"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/x30dp"
+                android:layout_marginTop="@dimen/x30dp"
+                android:layout_marginRight="@dimen/x30dp"
+                android:gravity="center"
+                android:orientation="vertical"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/imageView7">
+
+                <TextView
+                    android:id="@+id/textView6"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="30dp"
+                    android:fontFamily="@font/outfit_semibold"
+                    android:text="Welcome back!"
+                    android:textColor="@color/white"
+                    android:layout_gravity="center"
+                    android:textSize="20sp" />
+
+                <TextView
+                    android:id="@+id/textView7"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="1pt"
+                    android:alpha="0.5"
+                    android:fontFamily="@font/outfit_regular"
+                    android:text="Please login to your account."
+                    android:textColor="@color/white"
+                    android:textSize="16sp"
+                    android:visibility="gone"
+                    android:textStyle="normal" />
+
+                <LinearLayout
+                    android:id="@+id/llemail"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="16dp"
+                    android:background="@drawable/border_round_gray"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal"
+                    android:layout_marginStart="@dimen/x150dp"
+                    android:layout_marginEnd="@dimen/x150dp"
+                    >
+
+                    <EditText
+                        android:id="@+id/etEmail"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:background="@drawable/border_round_gray"
+                        android:drawablePadding="16dp"
+                        android:fontFamily="@font/outfit_regular"
+                        android:hint="@string/email"
+                        android:inputType="textEmailAddress"
+                        android:padding="18dp"
+                        android:textColor="@color/text_color_white"
+                        android:textColorHint="@color/text_color_white"
+                        android:textSize="16sp"
+                        >
+
+                    </EditText>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/llPassword"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="2pt"
+                    android:background="@drawable/border_round_gray"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal"
+                    android:layout_marginStart="@dimen/x150dp"
+                    android:layout_marginEnd="@dimen/x150dp"
+                    >
+
+                    <EditText
+                        android:id="@+id/etPassword"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:background="#00000000"
+                        android:drawablePadding="16dp"
+                        android:focusable="true"
+                        android:fontFamily="@font/outfit_regular"
+                        android:hint="@string/pass"
+                        android:inputType="textPassword"
+                        android:padding="18dp"
+                        android:textColor="@color/text_color_white"
+                        android:textColorHint="@color/text_color_white"
+                        android:textSize="16sp" />
+
+                    <ImageView
+                        android:id="@+id/ivEye"
+                        android:layout_width="32dp"
+                        android:layout_height="32dp"
+                        android:layout_marginStart="8dp"
+                        android:layout_marginEnd="16dp"
+                        android:visibility="gone"
+                        android:src="@drawable/ic_hide_password" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="@dimen/x10dp"
+                    android:orientation="horizontal"
+                    android:weightSum="2">
+
+                    <TextView
+                        android:id="@+id/tv_signup"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:layout_weight="1"
+                        android:clickable="true"
+                        android:focusable="true"
+                        android:fontFamily="@font/outfit_regular"
+                        android:gravity="left"
+                        android:padding="@dimen/x5dp"
+                        android:text="@string/signup"
+                        android:textColor="@color/app_yellow_color"
+                        android:textSize="16dp"
+                        android:visibility="gone"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/tvForgotPassword"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:layout_weight="1"
+                        android:clickable="true"
+                        android:focusable="true"
+                        android:fontFamily="@font/outfit_regular"
+                        android:gravity="right"
+                        android:padding="@dimen/x5dp"
+                        android:text="@string/forgot_password"
+                        android:textColor="@color/app_yellow_color"
+                        android:textSize="16dp"
+                        android:visibility="gone"
+                        android:textStyle="bold" />
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <Button
+                android:id="@+id/tvLogin"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/x20dp"
+                android:background="@drawable/button_selector_state"
+                android:focusable="true"
+                android:fontFamily="@font/outfit_regular"
+                android:gravity="center"
+                android:letterSpacing="0.1"
+                android:shadowColor="@color/white"
+                android:text="@string/login"
+                android:textAllCaps="false"
+                android:textColor="@color/textviewhover"
+                android:textSize="16sp"
+                android:visibility="visible"
+                android:layout_marginStart="@dimen/x150dp"
+                android:layout_marginEnd="@dimen/x150dp"
+                app:layout_constraintEnd_toEndOf="@+id/linearLayout2"
+                app:layout_constraintStart_toStartOf="@+id/linearLayout2"
+                app:layout_constraintTop_toBottomOf="@+id/linearLayout2" />
+
+            <ImageView
+                android:id="@+id/imageView7"
+                android:layout_width="60dp"
+                android:layout_height="60dp"
+                android:layout_marginTop="@dimen/x30dp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:srcCompat="@drawable/ic_logo1" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+    </ScrollView>

+ 279 - 0
app/src/main/res/layout-land/fragment_server_list.xml

@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.core.widget.NestedScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:pointerIcon="hand"
+    android:focusable="false"
+    android:clickable="false"
+    android:fillViewport="true">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:padding="@dimen/x5dp">
+
+        <TextView
+            android:id="@+id/tv_logoutTvs"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="15dp"
+            android:layout_marginStart="10dp"
+            android:background="@drawable/button_selector_state"
+            android:text="Logout"
+            android:gravity="center"
+            android:visibility="gone"
+            android:textSize="16sp"
+            android:focusable="true"
+            android:clickable="true"
+            android:focusableInTouchMode="true"
+            android:textColor="@color/app_blue_color"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintBottom_toTopOf="@+id/tvcountries"
+            />
+
+        <!-- Top Locations / Servers > </!-->
+        <TextView
+            android:id="@+id/tvcountries"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/x8dp"
+            android:layout_marginTop="@dimen/x8dp"
+            android:textSize="@dimen/x10dp"
+            android:text=""
+            android:pointerIcon="hand"
+            android:focusable="false"
+            android:clickable="false"
+            android:focusableInTouchMode="true"
+            android:textColor="@color/white"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/tv_logoutTvs"
+            />
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rv_servers"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x3dp"
+            android:orientation="horizontal"
+            android:pointerIcon="hand"
+            android:focusable="true"
+            android:clickable="true"
+            android:focusableInTouchMode="true"
+            android:nextFocusDown="@id/rv_dedicatedip_servers_tv"
+            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/tvcountries"
+            app:layout_constraintTop_toBottomOf="@+id/tvcountries"
+            tools:listitem="@layout/item_server"
+            >
+            <requestFocus />
+
+        </androidx.recyclerview.widget.RecyclerView>
+
+        <!-- Dedicated IP Servers > </!-->
+        <TextView
+            android:id="@+id/tv_dedicatedip_servers_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x8dp"
+            android:textSize="@dimen/x10dp"
+            android:text=""
+            android:pointerIcon="hand"
+            android:focusable="false"
+            android:clickable="false"
+            android:visibility="visible"
+            android:focusableInTouchMode="true"
+            android:textColor="@color/white"
+            app:layout_constraintStart_toStartOf="@id/tvcountries"
+            app:layout_constraintTop_toBottomOf="@id/rv_servers" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rv_dedicatedip_servers_tv"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x3dp"
+            android:orientation="horizontal"
+            android:pointerIcon="hand"
+            android:focusable="true"
+            android:clickable="true"
+            android:visibility="visible"
+            android:focusableInTouchMode="true"
+            android:nextFocusDown="@id/rv_streaming"
+            android:nextFocusUp="@id/rv_dedicatedip_servers_tv"
+            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/tv_dedicatedip_servers_tv"
+            app:layout_constraintTop_toBottomOf="@+id/tv_dedicatedip_servers_tv"
+            tools:listitem="@layout/item_server" />
+
+        <!-- Streaming > </!-->
+        <TextView
+            android:id="@+id/tvstreaming"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x8dp"
+            android:text=""
+            android:pointerIcon="hand"
+            android:focusable="false"
+            android:clickable="false"
+            android:focusableInTouchMode="true"
+            android:textColor="@color/white"
+            android:textSize="@dimen/x10dp"
+            app:layout_constraintStart_toStartOf="@+id/tvcountries"
+            app:layout_constraintTop_toBottomOf="@+id/rv_dedicatedip_servers_tv" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rv_streaming"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x3dp"
+            android:clipToPadding="false"
+            android:orientation="horizontal"
+            android:pointerIcon="hand"
+            android:focusable="true"
+            android:clickable="true"
+            android:focusableInTouchMode="true"
+            android:nextFocusDown="@id/rv_dvpn"
+            android:nextFocusUp="@id/rv_streaming"
+            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/tvstreaming"
+            app:layout_constraintTop_toBottomOf="@+id/tvstreaming"
+            tools:listitem="@layout/item_server" />
+
+        <!-- D-VPN > </!-->
+        <TextView
+            android:id="@+id/tvdvpn"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x8dp"
+            android:text=""
+            android:pointerIcon="hand"
+            android:focusable="false"
+            android:clickable="false"
+            android:focusableInTouchMode="true"
+            android:textColor="@color/white"
+            android:textSize="@dimen/x10dp"
+            app:layout_constraintStart_toStartOf="@+id/tvstreaming"
+            app:layout_constraintTop_toBottomOf="@+id/rv_streaming" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rv_dvpn"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x3dp"
+            android:clipToPadding="false"
+            android:orientation="horizontal"
+            android:pointerIcon="hand"
+            android:focusable="true"
+            android:clickable="true"
+            android:focusableInTouchMode="true"
+            android:nextFocusUp="@id/rv_streaming"
+            android:nextFocusDown="@id/rv_p2p"
+            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/tvdvpn"
+            app:layout_constraintTop_toBottomOf="@+id/tvdvpn"
+            tools:listitem="@layout/item_server" />
+
+        <!-- P2P > </!-->
+        <TextView
+            android:id="@+id/tvp2p"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x8dp"
+            android:text=""
+            android:textColor="@color/white"
+            android:focusable="false"
+            android:clickable="false"
+            android:focusableInTouchMode="true"
+            android:nextFocusDown="@id/rv_p2p"
+            android:textSize="@dimen/x10dp"
+            app:layout_constraintStart_toStartOf="@+id/tvdvpn"
+            app:layout_constraintTop_toBottomOf="@+id/rv_dvpn" />
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rv_p2p"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x3dp"
+            android:clipToPadding="false"
+            android:pointerIcon="hand"
+            android:focusable="true"
+            android:clickable="true"
+            android:focusableInTouchMode="true"
+            android:orientation="horizontal"
+            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/tvp2p"
+            app:layout_constraintTop_toBottomOf="@+id/tvp2p"
+            tools:listitem="@layout/item_server" />
+
+        <!-- Settings > </!-->
+        <TextView
+            android:id="@+id/tvSettings"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x3dp"
+            android:text="Settings"
+            android:focusable="false"
+            android:clickable="false"
+            android:focusableInTouchMode="true"
+            android:textColor="@color/white"
+            android:textSize="@dimen/x10dp"
+            app:layout_constraintStart_toStartOf="@+id/rv_p2p"
+            app:layout_constraintTop_toBottomOf="@+id/rv_p2p" />
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rv_settings"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x3dp"
+            android:clipToPadding="false"
+            android:orientation="horizontal"
+            android:pointerIcon="hand"
+            android:focusable="true"
+            android:clickable="true"
+            android:focusableInTouchMode="true"
+            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/tvSettings"
+            app:layout_constraintTop_toBottomOf="@+id/tvSettings"
+            tools:listitem="@layout/item_settings_tv" />
+
+        <!-- Favorites > </!-->
+        <TextView
+            android:id="@+id/tvFav"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/x10dp"
+            android:fontFamily="@font/outfit_regular"
+            android:text="Favorite"
+            android:textColor="@color/white"
+            android:textSize="18dp"
+            android:focusable="false"
+            android:clickable="false"
+            android:focusableInTouchMode="true"
+            android:visibility="gone"
+            app:layout_constraintBottom_toTopOf="@+id/rvList_favourite"
+            app:layout_constraintStart_toStartOf="@+id/rvList_favourite" />
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rvList_favourite"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:visibility="gone"
+            android:pointerIcon="hand"
+            android:focusable="true"
+            android:clickable="true"
+            android:focusableInTouchMode="true"
+            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            tools:listitem="@layout/item_favourites" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.core.widget.NestedScrollView>

+ 5 - 5
app/src/main/res/layout/activity_splash.xml

@@ -1,13 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <androidx.constraintlayout.widget.ConstraintLayout
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
         android:id="@+id/activity_main"
         android:layout_width="match_parent"
         android:padding="@dimen/x10dp"
         android:layout_height="match_parent"
-        android:background="@drawable/bg_app">
+        android:background="@drawable/bg_app"
+        >
 
         <ImageView
             android:id="@+id/imageView"
@@ -45,4 +46,3 @@
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 
-</layout>

+ 206 - 0
app/src/main/res/layout/activity_splash2.xml

@@ -0,0 +1,206 @@
+
+
+<!--    <ScrollView-->
+<!--        android:layout_width="match_parent"-->
+<!--        android:layout_height="match_parent"-->
+<!--        android:background="@drawable/bg_app"-->
+<!--        android:fillViewport="false">-->
+<!--        -->
+<!--        -->
+<!--    </ScrollView>-->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@drawable/bg_app"
+    android:padding="@dimen/x5dp">
+
+    <LinearLayout
+        android:id="@+id/linearLayout2"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/x30dp"
+        android:layout_marginTop="0dp"
+        android:layout_marginRight="@dimen/x30dp"
+        android:gravity="center"
+        android:orientation="vertical"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        >
+
+        <TextView
+            android:id="@+id/textView6"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="30dp"
+            android:fontFamily="@font/outfit_semibold"
+            android:text="Welcome back! S2"
+            android:textColor="@color/white"
+            android:layout_gravity="center"
+            android:textSize="20sp" />
+
+        <TextView
+            android:id="@+id/textView7"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="1pt"
+            android:alpha="0.5"
+            android:fontFamily="@font/outfit_regular"
+            android:text="Please login to your account."
+            android:textColor="@color/white"
+            android:textSize="16sp"
+            android:visibility="gone"
+            android:textStyle="normal" />
+
+        <LinearLayout
+            android:id="@+id/llemail"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="16dp"
+            android:background="@drawable/border_round_gray"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:layout_marginStart="0dp"
+            android:layout_marginEnd="0dp"
+            >
+
+            <EditText
+                android:id="@+id/etEmail"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:background="@drawable/border_round_gray"
+                android:drawablePadding="16dp"
+                android:fontFamily="@font/outfit_regular"
+                android:hint="@string/email"
+                android:inputType="textEmailAddress"
+                android:padding="18dp"
+                android:textColor="@color/text_color_white"
+                android:textColorHint="@color/text_color_white"
+                android:textSize="16sp"
+                >
+
+            </EditText>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/llPassword"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="2pt"
+            android:background="@drawable/border_round_gray"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:layout_marginStart="0dp"
+            android:layout_marginEnd="0dp"
+            >
+
+            <EditText
+                android:id="@+id/etPassword"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:background="#00000000"
+                android:drawablePadding="16dp"
+                android:focusable="true"
+                android:fontFamily="@font/outfit_regular"
+                android:hint="@string/pass"
+                android:inputType="textPassword"
+                android:padding="18dp"
+                android:textColor="@color/text_color_white"
+                android:textColorHint="@color/text_color_white"
+                android:textSize="16sp" />
+
+            <ImageView
+                android:id="@+id/ivEye"
+                android:layout_width="32dp"
+                android:layout_height="32dp"
+                android:layout_marginStart="8dp"
+                android:layout_marginEnd="16dp"
+                android:visibility="gone"
+                android:src="@drawable/ic_hide_password" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/x10dp"
+            android:orientation="horizontal"
+            android:weightSum="2">
+
+            <TextView
+                android:id="@+id/tv_signup"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_weight="1"
+                android:clickable="true"
+                android:focusable="true"
+                android:fontFamily="@font/outfit_regular"
+                android:gravity="left"
+                android:padding="@dimen/x5dp"
+                android:text="@string/signup"
+                android:textColor="@color/app_yellow_color"
+                android:textSize="16dp"
+                android:visibility="gone"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/tvForgotPassword"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_weight="1"
+                android:clickable="true"
+                android:focusable="true"
+                android:fontFamily="@font/outfit_regular"
+                android:gravity="right"
+                android:padding="@dimen/x5dp"
+                android:text="@string/forgot_password"
+                android:textColor="@color/app_yellow_color"
+                android:textSize="16dp"
+                android:visibility="gone"
+                android:textStyle="bold" />
+        </LinearLayout>
+
+    </LinearLayout>
+
+    <Button
+        android:id="@+id/tvLogin"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/x30dp"
+        android:background="@drawable/button_selector_state"
+        android:focusable="true"
+        android:fontFamily="@font/outfit_regular"
+        android:gravity="center"
+        android:letterSpacing="0.1"
+        android:shadowColor="@color/white"
+        android:text="@string/login"
+        android:textAllCaps="false"
+        android:textColor="@color/textviewhover"
+        android:textSize="16sp"
+        android:visibility="visible"
+        android:layout_marginStart="0dp"
+        android:layout_marginEnd="0dp"
+        app:layout_constraintEnd_toEndOf="@+id/linearLayout2"
+        app:layout_constraintStart_toStartOf="@+id/linearLayout2"
+        app:layout_constraintTop_toBottomOf="@id/linearLayout2" />
+
+    <ImageView
+        android:id="@+id/imageView7"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_marginBottom="@dimen/x30dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintBottom_toTopOf="@id/linearLayout2"
+        app:srcCompat="@drawable/ic_logo1" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
+

+ 366 - 0
app/src/main/res/layout/fragment_home.xml

@@ -0,0 +1,366 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:fitsSystemWindows="true">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/main2"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@drawable/bg_app"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/imageView6"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:src="@mipmap/ic_map"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.0"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/tvIp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="15dp"
+            android:fontFamily="@font/outfit_regular"
+            android:maxLines="2"
+            android:text="Finding IP ..."
+            android:textColor="@color/white"
+            android:textSize="18sp"
+            app:layout_constraintBottom_toTopOf="@+id/ll_country"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <LinearLayout
+            android:id="@+id/ll_country"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="15dp"
+            android:orientation="horizontal"
+            app:layout_constraintBottom_toTopOf="@+id/tv_connect_status"
+            app:layout_constraintEnd_toEndOf="@+id/tvIp"
+            app:layout_constraintStart_toStartOf="@+id/tvIp">
+
+            <androidx.cardview.widget.CardView
+                android:id="@+id/card_country_img"
+                android:layout_width="25dp"
+                android:layout_height="25dp"
+                android:layout_marginEnd="7dp"
+                android:visibility="gone"
+                app:cardCornerRadius="15dp">
+
+                <ImageView
+                    android:id="@+id/iv_country"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:scaleType="centerCrop" />
+            </androidx.cardview.widget.CardView>
+
+            <TextView
+                android:id="@+id/tvCountry"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="center"
+                android:fontFamily="@font/outfit_regular"
+                android:gravity="center"
+                android:maxLines="2"
+                android:text="Searching"
+                android:textColor="@color/white_half"
+                android:textSize="16sp" />
+        </LinearLayout>
+
+
+        <TextView
+            android:id="@+id/tv_connect_status"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="50dp"
+            android:fontFamily="@font/outfit_regular"
+            android:text="YOU ARE NOT CONNECTED"
+            android:textAllCaps="true"
+            android:textColor="@color/white_half"
+            android:textSize="8pt"
+            app:layout_constraintBottom_toTopOf="@+id/connectRippleEffect"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <TextView
+            android:id="@+id/textView8"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="20dp"
+            android:fontFamily="@font/outfit_medium"
+            android:text="Tap to connect"
+            android:textAllCaps="true"
+            android:textColor="@color/white"
+            android:textSize="14dp"
+            android:visibility="gone"
+            app:layout_constraintBottom_toTopOf="@+id/ll_recommended_server"
+            app:layout_constraintEnd_toEndOf="@+id/connectRippleEffect"
+            app:layout_constraintStart_toStartOf="@+id/connectRippleEffect"
+            />
+
+        <com.skyfishjy.library.RippleBackground
+            android:id="@+id/connectRippleEffect"
+            android:layout_width="230dp"
+            android:layout_height="230dp"
+            android:gravity="center"
+            android:layout_marginBottom="125dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.5"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:rb_color="#ffffff"
+            app:rb_duration="1500"
+            app:rb_radius="16dp"
+            app:rb_rippleAmount="4"
+            app:rb_scale="4">
+
+            <!--        android:background="@drawable/gradient_list_button"-->
+
+
+            <androidx.cardview.widget.CardView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:clickable="true"
+                android:focusable="true"
+                app:cardCornerRadius="115dp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHorizontal_bias="0.50"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent">
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/root"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:background="@color/connect_button_color">
+
+                    <ImageView
+                        android:id="@+id/ivConnect"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:layout_centerInParent="true"
+                        android:layout_gravity="center"
+                        android:background="@drawable/ripple_effect"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:srcCompat="@drawable/ic_connect_n_new" />
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+            </androidx.cardview.widget.CardView>
+
+        </com.skyfishjy.library.RippleBackground>
+
+
+        <Button
+            android:id="@+id/button2"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="80dp"
+            android:text="Button"
+            android:visibility="gone"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_bias="0.925"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <LinearLayout
+            android:id="@+id/ll_fastest"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintBottom_toTopOf="@id/llServer"
+            android:orientation="vertical"
+            android:background="@color/transparent"
+            android:layout_marginBottom="10dp"
+            android:gravity="center"
+            android:paddingTop="20dp"
+            android:paddingBottom="20dp"
+            >
+
+            <TextView
+                android:id="@+id/tv_nearest_server"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Smart Connect"
+                android:padding="20dp"
+                android:paddingStart="15dp"
+                android:paddingEnd="25dp"
+                android:gravity="center"
+                android:visibility="visible"
+                android:clickable="true"
+                android:focusable="true"
+                android:layout_gravity="center"
+                android:fontFamily="@font/outfit_regular"
+                android:textColor="@color/white"
+                android:textSize="16sp"
+                android:letterSpacing="0.032"
+                android:background="@drawable/border_round_alpha_f"
+                app:drawableStartCompat="@drawable/flash"
+                android:drawablePadding="5dp"
+                />
+
+            <TextView
+                android:id="@+id/tv_connect_fast_info"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/connect_fast_server_msg"
+                android:gravity="center"
+                android:visibility="gone"
+                android:clickable="true"
+                android:focusable="true"
+                android:layout_gravity="center"
+                android:fontFamily="@font/outfit_regular"
+                android:textColor="@color/white_half"
+                android:textSize="13sp"
+                android:paddingTop="8dp"
+                android:layout_marginTop="2dp"
+                android:layout_marginBottom="12dp"
+                />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/ll_recommended_server"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/ll_fastest"
+            android:orientation="horizontal"
+            android:background="@color/Light_Blue_Transparent_2"
+            android:gravity="center"
+            android:paddingBottom="15dp"
+            android:visibility="gone"
+            >
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/rvList_fastservers"
+                android:layout_width="250dp"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:visibility="visible"
+                android:layout_marginStart="0dp"
+                android:layout_marginEnd="0dp"
+                app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
+                tools:listitem="@layout/item_server_fast"
+                android:clipToPadding="false"
+                android:overScrollMode="never"
+                android:layout_gravity="center"
+                />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/llServer"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:background="@drawable/round_alpha_white"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:padding="8dp"
+            android:paddingStart="8dp"
+            android:paddingEnd="10dp"
+            android:layout_marginTop="0dp"
+            android:layout_marginBottom="90dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="@+id/connectRippleEffect"
+            app:layout_constraintStart_toStartOf="@+id/connectRippleEffect"
+            >
+
+            <androidx.cardview.widget.CardView
+                android:id="@+id/card_iv_country"
+                android:layout_width="50dp"
+                android:layout_height="50dp"
+                android:layout_marginEnd="7dp"
+                app:cardBackgroundColor="@color/colorTransparent"
+                app:cardCornerRadius="25dp">
+
+                <ImageView
+                    android:id="@+id/ivCountry"
+                    android:layout_width="50dp"
+                    android:layout_height="50dp"
+                    android:elevation="0dp"
+                    android:scaleType="fitXY" />
+            </androidx.cardview.widget.CardView>
+
+            <TextView
+                android:id="@+id/tvServer"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="4dp"
+                android:layout_weight="1"
+                android:fontFamily="@font/outfit_regular"
+                android:text="Select Server"
+                android:textColor="@color/white"
+                android:textSize="16sp" />
+
+            <ImageView
+                android:layout_width="24dp"
+                android:layout_height="24dp"
+                android:layout_marginStart="8dp"
+                android:layout_marginEnd="1dp"
+                android:src="@drawable/ic_arrow_right" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/navContainer"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:gravity="bottom"
+            android:orientation="vertical"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_bias="1.0" />
+
+        <FrameLayout
+            android:id="@+id/container"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:background="@drawable/gradient_blue_bg"
+            android:clickable="true"
+            android:focusable="true"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintVertical_bias="1.0" />
+
+        <FrameLayout
+            android:id="@+id/server_container"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:background="@color/transparent"
+            android:clickable="true"
+            android:focusable="true"
+            android:visibility="gone"
+            android:pointerIcon="hand"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintVertical_bias="1.0" />
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.coordinatorlayout.widget.CoordinatorLayout>

+ 206 - 0
app/src/main/res/layout/fragment_login.xml

@@ -0,0 +1,206 @@
+
+
+<!--    <ScrollView-->
+<!--        android:layout_width="match_parent"-->
+<!--        android:layout_height="match_parent"-->
+<!--        android:background="@drawable/bg_app"-->
+<!--        android:fillViewport="false">-->
+<!--        -->
+<!--        -->
+<!--    </ScrollView>-->
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            xmlns:app="http://schemas.android.com/apk/res-auto"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="@drawable/bg_app"
+            android:padding="@dimen/x5dp">
+
+            <LinearLayout
+                android:id="@+id/linearLayout2"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/x30dp"
+                android:layout_marginTop="0dp"
+                android:layout_marginRight="@dimen/x30dp"
+                android:gravity="center"
+                android:orientation="vertical"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent"
+                >
+
+                <TextView
+                    android:id="@+id/textView6"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="30dp"
+                    android:fontFamily="@font/outfit_semibold"
+                    android:text="Welcome back!"
+                    android:textColor="@color/white"
+                    android:layout_gravity="center"
+                    android:textSize="20sp" />
+
+                <TextView
+                    android:id="@+id/textView7"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="1pt"
+                    android:alpha="0.5"
+                    android:fontFamily="@font/outfit_regular"
+                    android:text="Please login to your account."
+                    android:textColor="@color/white"
+                    android:textSize="16sp"
+                    android:visibility="gone"
+                    android:textStyle="normal" />
+
+                <LinearLayout
+                    android:id="@+id/llemail"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="16dp"
+                    android:background="@drawable/border_round_gray"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal"
+                    android:layout_marginStart="0dp"
+                    android:layout_marginEnd="0dp"
+                    >
+
+                    <EditText
+                        android:id="@+id/etEmail"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:background="@drawable/border_round_gray"
+                        android:drawablePadding="16dp"
+                        android:fontFamily="@font/outfit_regular"
+                        android:hint="@string/email"
+                        android:inputType="textEmailAddress"
+                        android:padding="18dp"
+                        android:textColor="@color/text_color_white"
+                        android:textColorHint="@color/text_color_white"
+                        android:textSize="16sp"
+                        >
+
+                    </EditText>
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/llPassword"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="2pt"
+                    android:background="@drawable/border_round_gray"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal"
+                    android:layout_marginStart="0dp"
+                    android:layout_marginEnd="0dp"
+                    >
+
+                    <EditText
+                        android:id="@+id/etPassword"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:background="#00000000"
+                        android:drawablePadding="16dp"
+                        android:focusable="true"
+                        android:fontFamily="@font/outfit_regular"
+                        android:hint="@string/pass"
+                        android:inputType="textPassword"
+                        android:padding="18dp"
+                        android:textColor="@color/text_color_white"
+                        android:textColorHint="@color/text_color_white"
+                        android:textSize="16sp" />
+
+                    <ImageView
+                        android:id="@+id/ivEye"
+                        android:layout_width="32dp"
+                        android:layout_height="32dp"
+                        android:layout_marginStart="8dp"
+                        android:layout_marginEnd="16dp"
+                        android:visibility="gone"
+                        android:src="@drawable/ic_hide_password" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="@dimen/x10dp"
+                    android:orientation="horizontal"
+                    android:weightSum="2">
+
+                    <TextView
+                        android:id="@+id/tv_signup"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:layout_weight="1"
+                        android:clickable="true"
+                        android:focusable="true"
+                        android:fontFamily="@font/outfit_regular"
+                        android:gravity="left"
+                        android:padding="@dimen/x5dp"
+                        android:text="@string/signup"
+                        android:textColor="@color/app_yellow_color"
+                        android:textSize="16dp"
+                        android:visibility="gone"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/tvForgotPassword"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:layout_weight="1"
+                        android:clickable="true"
+                        android:focusable="true"
+                        android:fontFamily="@font/outfit_regular"
+                        android:gravity="right"
+                        android:padding="@dimen/x5dp"
+                        android:text="@string/forgot_password"
+                        android:textColor="@color/app_yellow_color"
+                        android:textSize="16dp"
+                        android:visibility="gone"
+                        android:textStyle="bold" />
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <Button
+                android:id="@+id/tvLogin"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/x30dp"
+                android:background="@drawable/button_selector_state"
+                android:focusable="true"
+                android:fontFamily="@font/outfit_regular"
+                android:gravity="center"
+                android:letterSpacing="0.1"
+                android:shadowColor="@color/white"
+                android:text="@string/login"
+                android:textAllCaps="false"
+                android:textColor="@color/textviewhover"
+                android:textSize="16sp"
+                android:visibility="visible"
+                android:layout_marginStart="0dp"
+                android:layout_marginEnd="0dp"
+                app:layout_constraintEnd_toEndOf="@+id/linearLayout2"
+                app:layout_constraintStart_toStartOf="@+id/linearLayout2"
+                app:layout_constraintTop_toBottomOf="@id/linearLayout2" />
+
+            <ImageView
+                android:id="@+id/imageView7"
+                android:layout_width="60dp"
+                android:layout_height="60dp"
+                android:layout_marginBottom="@dimen/x30dp"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintBottom_toTopOf="@id/linearLayout2"
+                app:srcCompat="@drawable/ic_logo1" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+

+ 109 - 0
app/src/main/res/layout/fragment_server_list.xml

@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginTop="30pt"
+    android:background="@drawable/top_round_solid_blue_alpha"
+    android:clickable="true"
+    >
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_servers_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="12dp"
+        android:layout_marginTop="30dp"
+        android:layout_marginRight="12dp"
+        android:background="@drawable/rg_background_drawable"
+        android:orientation="horizontal"
+        android:padding="4dp"
+        app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:listitem="@layout/item_server_tab" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rvList"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_marginTop="16dp"
+        android:layout_marginBottom="16dp"
+        android:layout_marginStart="8dp"
+        android:layout_marginEnd="8dp"
+        android:clipToPadding="false"
+        android:overScrollMode="never"
+        app:layout_constraintBottom_toTopOf="@+id/tvFav"
+        app:layout_constraintEnd_toEndOf="@+id/rv_servers_name"
+        app:layout_constraintStart_toStartOf="@+id/rv_servers_name"
+        app:layout_constraintTop_toBottomOf="@+id/rv_servers_name"
+        tools:listitem="@layout/item_server">
+
+    </androidx.recyclerview.widget.RecyclerView>
+
+    <TextView
+        android:id="@+id/tvFav"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="5dp"
+        android:layout_marginBottom="10dp"
+        android:fontFamily="@font/outfit_regular"
+        android:text="Favorite"
+        android:textColor="@color/white"
+        android:textSize="18dp"
+        app:layout_constraintBottom_toTopOf="@+id/rvList_favourite"
+        app:layout_constraintStart_toStartOf="@+id/rvList_favourite" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rvList_favourite"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="16dp"
+        android:orientation="horizontal"
+        android:overScrollMode="never"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+        app:layout_constraintBottom_toTopOf="@id/cv_Search"
+        app:layout_constraintEnd_toEndOf="@+id/rvList"
+        app:layout_constraintStart_toStartOf="@+id/rvList"
+        tools:listitem="@layout/item_favourites" />
+
+    <androidx.cardview.widget.CardView
+        android:id="@+id/cv_Search"
+        android:layout_width="match_parent"
+        android:layout_height="50dp"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_marginBottom="62dp"
+        app:cardBackgroundColor="#000028"
+        >
+
+        <ImageView
+            android:id="@+id/ivSearch"
+            android:layout_width="50dp"
+            android:layout_height="50dp"
+            android:src="@drawable/baseline_search_24"
+            android:clickable="true"
+            android:focusable="true"
+            android:layout_gravity="center"
+            />
+
+    </androidx.cardview.widget.CardView>
+
+    <LinearLayout
+        android:id="@+id/navContainer"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:gravity="bottom"
+        android:orientation="vertical"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintVertical_bias="1.0" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 90 - 0
app/src/main/res/layout/item_favourites.xml

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    app:cardBackgroundColor="#A9C5C3C3"
+    app:cardCornerRadius="10dp"
+    app:cardUseCompatPadding="true">
+
+    <androidx.cardview.widget.CardView
+        android:id="@+id/card_bg_fav"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="1px"
+        app:cardBackgroundColor="#06143B"
+        app:cardCornerRadius="10dp">
+
+        <LinearLayout
+            android:id="@+id/audio_row"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:gravity="center"
+            android:orientation="vertical"
+            android:padding="7dp">
+
+            <LinearLayout
+                android:layout_width="100dp"
+                android:layout_height="80dp"
+                android:gravity="center"
+                app:cardBackgroundColor="@color/colorTransparent"
+                app:cardElevation="0dp">
+
+            <androidx.cardview.widget.CardView
+                android:layout_width="50dp"
+                android:layout_height="50dp"
+                android:layout_gravity="center"
+                app:cardCornerRadius="25dp"
+                app:cardBackgroundColor="@color/colorTransparent">
+
+                <ImageView
+                    android:id="@+id/ivCountry"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_gravity="center"
+                    android:scaleType="centerCrop"
+                    android:src="@drawable/pk"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+            </androidx.cardview.widget.CardView>
+
+
+
+            </LinearLayout>
+
+            <TextView
+                android:id="@+id/vpn_name"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_marginStart="10dp"
+                android:layout_marginEnd="@dimen/x10dp"
+                android:fontFamily="@font/outfit_regular"
+                android:gravity="center"
+                android:maxLines="1"
+                android:textColor="#ffffff"
+                android:textSize="12dp" />
+
+
+            <TextView
+                android:id="@+id/textView12"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_marginTop="7dp"
+                android:layout_marginBottom="18px"
+                android:fontFamily="@font/outfit_regular"
+                android:text=""
+                android:textColor="#B1AAAA"
+                android:textSize="12dp" />
+        </LinearLayout>
+    </androidx.cardview.widget.CardView>
+</androidx.cardview.widget.CardView>
+
+
+
+

+ 78 - 0
app/src/main/res/layout/item_server.xml

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    xmlns:tools="http://schemas.android.com/tools"
+    app:cardBackgroundColor="#A9C5C3C3"
+    app:cardCornerRadius="10dp"
+    app:cardUseCompatPadding="true">
+
+    <androidx.cardview.widget.CardView
+        android:id="@+id/card_bg"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="1px"
+        app:cardBackgroundColor="#06143B"
+        app:cardCornerRadius="10dp">
+
+        <LinearLayout
+            android:id="@+id/audio_row"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:gravity="center_vertical"
+            android:orientation="vertical"
+            android:padding="10dp">
+
+            <androidx.cardview.widget.CardView
+                android:layout_width="80dp"
+                android:layout_height="50dp"
+                android:layout_gravity="center"
+                android:layout_marginBottom="1dp"
+                app:cardCornerRadius="10dp"
+                app:cardElevation="0dp">
+
+                <ImageView
+                    android:id="@+id/ivCountry"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_gravity="center"
+                    android:scaleType="centerCrop"
+                    android:src="@drawable/pk"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+            </androidx.cardview.widget.CardView>
+
+            <TextView
+                android:id="@+id/vpn_name"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_marginStart="10dp"
+                android:layout_marginTop="10dp"
+                android:layout_marginEnd="@dimen/x10dp"
+                android:fontFamily="@font/outfit_regular"
+                android:gravity="center"
+                android:text="New York times checking"
+                android:textColor="#ffffff"
+                android:textSize="12dp" />
+
+
+            <TextView
+                android:id="@+id/textView12"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_marginTop="7dp"
+                android:layout_marginBottom="10px"
+                android:fontFamily="@font/outfit_regular"
+                android:gravity="center"
+                tools:text="480 ms"
+                android:textColor="#B1AAAA"
+                android:textSize="12dp" />
+        </LinearLayout>
+    </androidx.cardview.widget.CardView>
+</androidx.cardview.widget.CardView>

+ 70 - 0
app/src/main/res/layout/item_server_fast.xml

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.cardview.widget.CardView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    xmlns:tools="http://schemas.android.com/tools"
+    app:cardBackgroundColor="#30437d"
+    android:background="@color/transparent"
+    app:cardCornerRadius="10dp"
+    app:cardElevation="0dp"
+    app:cardUseCompatPadding="true">
+
+    <androidx.cardview.widget.CardView
+        android:id="@+id/card_bg"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="1.5dp"
+        app:cardBackgroundColor="@color/Light_Blue_Transparent_2"
+        app:cardElevation="0dp"
+        app:cardCornerRadius="10dp">
+
+        <LinearLayout
+            android:id="@+id/audio_row"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:gravity="center_vertical"
+            android:orientation="vertical"
+            android:padding="10dp">
+
+            <androidx.cardview.widget.CardView
+                android:layout_width="30dp"
+                android:layout_height="30dp"
+                android:layout_gravity="center"
+                android:layout_marginBottom="1dp"
+                app:cardCornerRadius="15dp"
+                app:cardElevation="0dp">
+
+                <ImageView
+                    android:id="@+id/ivCountry"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_gravity="center"
+                    android:scaleType="centerCrop"
+                    android:src="@drawable/pk"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+            </androidx.cardview.widget.CardView>
+
+            <TextView
+                android:id="@+id/vpn_name"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_marginStart="10dp"
+                android:layout_marginTop="10dp"
+                android:layout_marginEnd="@dimen/x10dp"
+                android:fontFamily="@font/outfit_regular"
+                android:gravity="center"
+                android:text="New York times checking"
+                android:textColor="@color/app_yellow_color"
+                android:textSize="14dp" />
+
+        </LinearLayout>
+
+    </androidx.cardview.widget.CardView>
+</androidx.cardview.widget.CardView>

+ 25 - 0
app/src/main/res/layout/item_server_tab.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+
+    <TextView
+        android:id="@+id/item"
+        android:layout_width="match_parent"
+        android:layout_height="20pt"
+        android:background="@drawable/rb_backgroun_drawable"
+        android:button="@null"
+        android:checked="true"
+        android:paddingLeft="@dimen/x20dp"
+        android:paddingRight="@dimen/x20dp"
+        android:gravity="center"
+        android:maxLines="1"
+        android:singleLine="true"
+        android:text="Servers"
+        android:textColor="@color/white"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+
+</LinearLayout>

BIN
app/src/main/res/mipmap-hdpi/ic_map.png


BIN
app/src/main/res/mipmap-mdpi/ic_map.png


BIN
app/src/main/res/mipmap-xhdpi/ic_map.png


+ 0 - 1
app/src/main/res/values/strings.xml

@@ -533,5 +533,4 @@
     <string name="app_widget_description">This is an app widget description</string>
 
 
-
 </resources>