| 
					
				 | 
			
			
				@@ -7,16 +7,22 @@ import com.google.gson.JsonParser 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.google.gson.stream.JsonReader 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import eu.kanade.tachiyomi.R 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import eu.kanade.tachiyomi.data.backup.models.Backup 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import eu.kanade.tachiyomi.data.track.TrackManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import eu.kanade.tachiyomi.source.SourceManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import uy.kohesive.injekt.injectLazy 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 object BackupRestoreValidator { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private val sourceManager: SourceManager by injectLazy() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private val trackManager: TrackManager by injectLazy() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * Checks for critical backup file data. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @throws Exception if version or manga cannot be found. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * @return List of required sources. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return List of missing sources or missing trackers. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    fun validate(context: Context, uri: Uri): Map<Long, String> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fun validate(context: Context, uri: Uri): Results { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         val reader = JsonReader(context.contentResolver.openInputStream(uri)!!.bufferedReader()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         val json = JsonParser.parseReader(reader).asJsonObject 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -26,11 +32,29 @@ object BackupRestoreValidator { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             throw Exception(context.getString(R.string.invalid_backup_file_missing_data)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (mangasJson.asJsonArray.size() == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val mangas = mangasJson.asJsonArray 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (mangas.size() == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             throw Exception(context.getString(R.string.invalid_backup_file_missing_manga)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return getSourceMapping(json) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val sources = getSourceMapping(json) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val missingSources = sources 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .filter { sourceManager.get(it.key) == null } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .sorted() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val trackers = mangas 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .filter { it.asJsonObject.has("track") } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .flatMap { it.asJsonObject["track"].asJsonArray } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .map { it.asJsonObject["s"].asInt } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .distinct() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        val missingTrackers = trackers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .mapNotNull { trackManager.getService(it) } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .filter { !it.isLogged } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .map { it.name } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .sorted() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return Results(missingSources, missingTrackers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fun getSourceMapping(json: JsonObject): Map<Long, String> { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -43,4 +67,6 @@ object BackupRestoreValidator { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             .toMap() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    data class Results(val missingSources: List<String>, val missingTrackers: List<String>) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |