浏览代码

Worked on Room Database - Saving servers on DB

Khubaib 6 月之前
父节点
当前提交
0e9800c598

+ 2 - 2
.idea/deploymentTargetSelector.xml

@@ -4,10 +4,10 @@
     <selectionStates>
       <SelectionState runConfigName="app">
         <option name="selectionMode" value="DROPDOWN" />
-        <DropdownSelection timestamp="2024-10-30T15:51:16.451763817Z">
+        <DropdownSelection timestamp="2024-11-06T10:48:05.874169337Z">
           <Target type="DEFAULT_BOOT">
             <handle>
-              <DeviceId pluginId="LocalEmulator" identifier="path=/home/ubuntu/.android/avd/Medium_Phone_API_24.avd" />
+              <DeviceId pluginId="PhysicalDevice" identifier="serial=1C051FDF60048Z" />
             </handle>
           </Target>
         </DropdownSelection>

+ 9 - 0
app/build.gradle.kts

@@ -5,6 +5,7 @@ plugins {
     id("org.jetbrains.kotlin.android")
     id("com.google.gms.google-services")
     id("com.google.firebase.crashlytics")
+    id("org.jetbrains.kotlin.kapt")
 }
 
 android {
@@ -175,6 +176,14 @@ dependencies {
     debugImplementation("androidx.compose.ui:ui-tooling")
     debugImplementation("androidx.compose.ui:ui-test-manifest")
 
+    val room_version = "2.6.1"
+
+    implementation("androidx.room:room-runtime:$room_version")
+    annotationProcessor("androidx.room:room-compiler:$room_version")
+
+    // To use Kotlin annotation processing tool (kapt)
+    kapt("androidx.room:room-compiler:$room_version")
+
     // TV
     implementation("androidx.tv:tv-foundation:1.0.0-alpha10")
     implementation("androidx.tv:tv-material:1.0.0-beta01")

+ 20 - 0
app/src/main/java/com/vpn/fastestvpnservice/roomDB/Converters.kt

@@ -0,0 +1,20 @@
+package com.vpn.fastestvpnservice.roomDB
+
+import androidx.room.TypeConverter
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+
+class Converters {
+
+    @TypeConverter
+    fun fromServerRoomList(value: List<ServerRoom>?) : String? {
+        return Gson().toJson(value)
+    }
+
+    @TypeConverter
+    fun toServerRoomList(value: String?) : List<ServerRoom>? {
+        val listType = object : TypeToken<List<ServerRoom>>() {}.type
+        return Gson().fromJson(value, listType)
+    }
+
+}

+ 19 - 0
app/src/main/java/com/vpn/fastestvpnservice/roomDB/ServerDao.kt

@@ -0,0 +1,19 @@
+package com.vpn.fastestvpnservice.roomDB
+
+import androidx.lifecycle.LiveData
+import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
+import androidx.room.Query
+import com.vpn.fastestvpnservice.beans.ServerData
+
+@Dao
+interface ServerDao {
+
+    @Query("SELECT * FROM ServerDataRoom")
+    fun getAllServers(): LiveData<List<ServerDataRoom>>
+
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun addServers(servers : List<ServerDataRoom>)
+
+}

+ 13 - 0
app/src/main/java/com/vpn/fastestvpnservice/roomDB/ServerDataRoom.kt

@@ -0,0 +1,13 @@
+package com.vpn.fastestvpnservice.roomDB
+
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity
+data class ServerDataRoom(
+    @PrimaryKey(autoGenerate = false)
+    var id: Int? = 0,
+    var name: String? = null,
+    var servers: List<ServerRoom>? = null,
+    var country_sort: Int? = 0
+)

+ 18 - 0
app/src/main/java/com/vpn/fastestvpnservice/roomDB/ServerDatabase.kt

@@ -0,0 +1,18 @@
+package com.vpn.fastestvpnservice.roomDB
+
+import androidx.room.Database
+import androidx.room.RoomDatabase
+import androidx.room.TypeConverters
+
+@Database(
+    entities = [ServerRoom::class, ServerDataRoom::class], version = 2
+)
+//@TypeConverters(Converters::class)
+abstract class ServerDatabase : RoomDatabase() {
+
+    companion object {
+       const val NAME = "Server_DB"
+    }
+
+    abstract fun getServerDao() : ServerDao
+}

+ 36 - 0
app/src/main/java/com/vpn/fastestvpnservice/roomDB/ServerRoom.kt

@@ -0,0 +1,36 @@
+package com.vpn.fastestvpnservice.roomDB
+
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity
+data class ServerRoom(
+    @PrimaryKey(autoGenerate = false)
+    var id: Int? = null,
+    val continent: String? = null,
+    val country: String? = null,
+    val state: String? = null,
+    val city: String? = null,
+    val name: String? = null,
+    val dns: String? = null,
+    val iso: String? = null,
+    val lt: Double? = null,
+    var lg: Double? = null,
+    val ip: String? = null,
+    val port: Int? = null,
+    val protocol: String? = null,
+    val ipsec: String? = null,
+    val remoteId: String? = null,
+    val isTrial: Boolean? = null,
+    val active: Boolean? = null,
+    val flag: String? = null,
+    val server_name: String? = null,
+    val country_sort: Int = 0,
+    val connection_count: Int = 0,
+    val wg_key: String? = null,
+    var enable: Int = 1,
+    var totalServers: Int = 1,
+    var enableServers: Int = 1,
+    var distance: Float = 0.0f,
+    var ping: Int = 0
+)

+ 1 - 0
app/src/main/java/com/vpn/fastestvpnservice/screens/SplashScreen.kt

@@ -39,6 +39,7 @@ import com.vpn.fastestvpnservice.sealedClass.Screen
 import com.vpn.fastestvpnservice.viewmodels.SearchListViewModel
 import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
 import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
+import de.blinkt.openvpn.core.App
 import kotlinx.coroutines.delay
 
 var recommendedListGlobal: ArrayList<Server> = ArrayList<Server>()

+ 5 - 0
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/HomeScreen.kt

@@ -308,6 +308,11 @@ fun Home(
         }
     }
 
+    val serversListRoom = serverListViewModelSplash.serversListRoom.observeAsState()
+    serversListRoom.value?.forEachIndexed { index, serverDataRoom ->
+        Log.d("serverDataRoom", "$index , ${serverDataRoom.name} , ${serverDataRoom.servers?.size}")
+    }
+
     vpnConnectionsUtil = VPNConnectionsUtil(context, activity, homeViewModel)
     homeViewModel1 = homeViewModel
     var isConnect: Int? = homeViewModel.isConnect.observeAsState().value

+ 58 - 0
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/ServerListViewModel.kt

@@ -7,6 +7,7 @@ import android.util.Log
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
 import com.stealthcopter.networktools.Ping
 import com.stealthcopter.networktools.ping.PingResult
 import com.stealthcopter.networktools.ping.PingStats
@@ -17,6 +18,9 @@ import com.vpn.fastestvpnservice.beans.ServerDataGlobal
 import com.vpn.fastestvpnservice.beans.ServerProtocol
 import com.vpn.fastestvpnservice.beans.ServerResponse
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
+import com.vpn.fastestvpnservice.roomDB.ServerDao
+import com.vpn.fastestvpnservice.roomDB.ServerDataRoom
+import com.vpn.fastestvpnservice.roomDB.ServerRoom
 import com.vpn.fastestvpnservice.screens.isAlphabetList
 import com.vpn.fastestvpnservice.screens.recommendedListFinalGlobal
 import com.vpn.fastestvpnservice.screens.recommendedListGlobal
@@ -37,6 +41,9 @@ import com.vpn.fastestvpnservice.screensTV.locations
 import com.vpn.fastestvpnservice.screensTV.p2p
 import com.vpn.fastestvpnservice.screensTV.serversListGlobalTV
 import com.vpn.fastestvpnservice.screensTV.streaming
+import de.blinkt.openvpn.core.App
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
 
 class ServerListViewModel(context: Context): ViewModel() {
 
@@ -73,6 +80,10 @@ class ServerListViewModel(context: Context): ViewModel() {
     var mutableLiveDataAllServers = MutableLiveData<ArrayList<Server>>()
     var liveDataAllServers: LiveData<ArrayList<Server>> = mutableLiveDataAllServers
 
+    var serverDao: ServerDao = App.serverDatabase.getServerDao()
+
+    val serversListRoom : LiveData<List<ServerDataRoom>> = serverDao.getAllServers()
+
     fun setPagerIndex(index: Int) {
         _mutableLiveDataPagerIndex.value = index
     }
@@ -243,8 +254,55 @@ class ServerListViewModel(context: Context): ViewModel() {
 
         _mutableLiveDataGetServersGlobal.value = serversListGlobal
         mutableLiveDataAllServers.value = serversListAllGlobal
+
+        val serversDataRoom = ArrayList<ServerDataRoom>()
+
+        serversListGlobal.forEachIndexed { index, serverDataGlobal ->
+            val servers = serverDataGlobal?.servers?.let { convertServerListToServerRoomList(it) }
+
+            serversDataRoom.add(index, ServerDataRoom(index, serverDataGlobal?.name, servers, serverDataGlobal?.country_sort))
+        }
+
+        viewModelScope.launch(Dispatchers.IO) {
+            serverDao.addServers(serversDataRoom)
+        }
+    }
+
+    fun convertServerListToServerRoomList(serverList: ArrayList<Server>): List<ServerRoom> {
+        return serverList.map { server ->
+            ServerRoom(
+                id = server.id,
+                continent = server.continent,
+                country = server.country,
+                state = server.state,
+                city = server.city as? String,
+                name = server.name,
+                dns = server.dns,
+                iso = server.iso,
+                lt = server.lt,
+                lg = server.lg,
+                ip = server.ip as? String,
+                port = server.port,
+                protocol = server.protocol,
+                ipsec = server.ipsec as? String,
+                remoteId = server.remoteId as? String,
+                isTrial = server.isTrial,
+                active = server.active,
+                flag = server.flag,
+                server_name = server.server_name,
+                country_sort = server.country_sort,
+                connection_count = server.connection_count,
+                wg_key = server.wg_key,
+                enable = server.enable,
+                totalServers = server.totalServers,
+                enableServers = server.enableServers,
+                distance = server.distance,
+                ping = server.ping
+            )
+        }
     }
 
+
     fun setCountryDataTV() {
         val data = preferencesHelper.getServerData()
 

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

@@ -14,6 +14,8 @@ import android.content.pm.PackageManager;
 import android.os.Build;
 import android.util.Log;
 
+import androidx.room.Room;
+
 import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
 import com.google.android.gms.common.GooglePlayServicesRepairableException;
 import com.google.android.gms.security.ProviderInstaller;
@@ -21,6 +23,7 @@ import com.google.firebase.FirebaseApp;
 import com.google.firebase.crashlytics.FirebaseCrashlytics;
 import com.vpn.fastestvpnservice.R;
 import com.vpn.fastestvpnservice.constants.AppConstant;
+import com.vpn.fastestvpnservice.roomDB.ServerDatabase;
 import com.wireguard.android.backend.Backend;
 import com.wireguard.android.backend.Tunnel;
 import com.wireguard.config.Config;
@@ -77,6 +80,8 @@ public class App extends /*com.orm.SugarApp*/ Application {
     public static IOpenVPNServiceInternal mService = null;
     public static ServiceConnection mConnection = null;
 
+    public static ServerDatabase serverDatabase;
+
     public static final int DISCONNECTED = 0;
     public static final int CONNECTING = 1;
     public static final int CONNECTED = 2;
@@ -165,6 +170,12 @@ public class App extends /*com.orm.SugarApp*/ Application {
         FirebaseApp.initializeApp(this);
         FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);
 
+        serverDatabase = Room.databaseBuilder(
+                getApplicationContext(),
+                ServerDatabase.class,
+                ServerDatabase.NAME
+        ).fallbackToDestructiveMigration().build();
+
 //        initializeSSLContext();
 
         /*SharedPreferences sp_settings = getSharedPreferences("settings_data", 0);