Skip to content

Commit

Permalink
[feature] implements backup and restore
Browse files Browse the repository at this point in the history
  • Loading branch information
coderPaddyS committed Jan 25, 2023
1 parent 971da40 commit 9c19248
Show file tree
Hide file tree
Showing 12 changed files with 199 additions and 10 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "libs/privacy-friendly-backup-api"]
path = libs/privacy-friendly-backup-api
url = https://github.com/SecUSo/privacy-friendly-backup-api.git
13 changes: 11 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'

android {
compileSdkVersion 33
Expand All @@ -17,8 +19,8 @@ android {
}
}
compileOptions {
sourceCompatibility = 1.7
targetCompatibility = 1.7
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

Expand All @@ -33,4 +35,11 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'

// Backup API
implementation project(':backup-api')
def work_version = '2.7.1'
implementation "androidx.work:work-runtime:$work_version"
implementation "androidx.work:work-runtime-ktx:$work_version"
androidTestImplementation "androidx.work:work-testing:$work_version"
}
21 changes: 20 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.secuso.privacyfriendlydame">

<application
android:name=".PFDameApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:isGame="true"
Expand Down Expand Up @@ -64,6 +67,22 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.MainActivity" />
</activity>

<service
android:name=".backup.PFABackupService"
android:enabled="true"
android:exported="true"
android:process=":backup"
tools:ignore="ExportedService">
<intent-filter>
<action android:name="org.secuso.privacyfriendlybackup.api.pfa.PFAAuthService" />
</intent-filter>
</service>

<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.secuso.privacyfriendlydame


import android.app.Application
import android.util.Log
import androidx.work.Configuration
import org.secuso.privacyfriendlybackup.api.pfa.BackupManager
import org.secuso.privacyfriendlydame.backup.BackupCreator
import org.secuso.privacyfriendlydame.backup.BackupRestorer

class PFDameApplication : Application(), Configuration.Provider {

override fun onCreate() {
super.onCreate()
BackupManager.backupCreator = BackupCreator()
BackupManager.backupRestorer = BackupRestorer()
}

override fun getWorkManagerConfiguration(): Configuration {
return Configuration.Builder().setMinimumLoggingLevel(Log.INFO).build()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package org.secuso.privacyfriendlydame.backup
import android.content.Context
import android.preference.PreferenceManager
import android.util.JsonWriter
import android.util.Log
import org.secuso.privacyfriendlybackup.api.backup.FileUtil
import org.secuso.privacyfriendlybackup.api.backup.PreferenceUtil.writePreferences
import org.secuso.privacyfriendlybackup.api.pfa.IBackupCreator
import org.secuso.privacyfriendlydame.ui.MainActivity
import java.io.File
import java.io.OutputStream
import java.io.OutputStreamWriter

class BackupCreator : IBackupCreator {
override fun writeBackup(context: Context, outputStream: OutputStream): Boolean {
Log.d(TAG, "createBackup() started")
val outputStreamWriter = OutputStreamWriter(outputStream, Charsets.UTF_8)
val writer = JsonWriter(outputStreamWriter)
writer.setIndent("")

try {
writer.beginObject()

Log.d(TAG, "Writing file")
writer.name("file")

FileUtil.writeFile(writer, context.getFileStreamPath(MainActivity.SAVE_FILE));

Log.d(TAG, "Writing preferences")
writer.name("preferences")

val pref = PreferenceManager.getDefaultSharedPreferences(context.applicationContext)
writePreferences(writer, pref)

writer.endObject()
writer.close()
} catch (e: Exception) {
Log.e(TAG, "Error occurred", e)
e.printStackTrace()
return false
}

Log.d(TAG, "Backup created successfully")
return true
}

companion object {
const val TAG = "PFABackupCreator"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package org.secuso.privacyfriendlydame.backup

import android.content.Context
import android.content.SharedPreferences
import android.preference.PreferenceManager
import android.util.JsonReader
import android.util.Log
import org.secuso.privacyfriendlybackup.api.backup.FileUtil
import org.secuso.privacyfriendlybackup.api.pfa.IBackupRestorer
import org.secuso.privacyfriendlydame.ui.MainActivity
import java.io.IOException
import java.io.InputStream
import java.io.InputStreamReader
import kotlin.system.exitProcess


class BackupRestorer : IBackupRestorer {
@Throws(IOException::class)
private fun readSaveFile(context: Context, reader: JsonReader) {

// delete if file already exists
val saveFile = context.getFileStreamPath(MainActivity.SAVE_FILE)
if (saveFile.exists()) {
saveFile.delete()
}

Log.d(TAG, "Restoring savefile...")
FileUtil.readFile(reader, saveFile.parentFile!!);
Log.d(TAG, "Savefile Restored")
}

@Throws(IOException::class)
private fun readPreferences(reader: JsonReader, preferences: SharedPreferences.Editor) {
reader.beginObject()
while (reader.hasNext()) {
val name: String = reader.nextName()
when (name) {
"pref_rule_flying_king",
"pref_rule_white_begins" -> preferences.putBoolean(name, reader.nextBoolean())
"lastChosenPage",
"lastChosenDifficulty" -> preferences.putInt(name, reader.nextInt())
else -> throw RuntimeException("Unknown preference $name")
}
}
reader.endObject()
}

override fun restoreBackup(context: Context, restoreData: InputStream): Boolean {
return try {
val isReader = InputStreamReader(restoreData)
val reader = JsonReader(isReader)
val preferences = PreferenceManager.getDefaultSharedPreferences(context).edit()

// START
reader.beginObject()
while (reader.hasNext()) {
val type: String = reader.nextName()
when (type) {
"file" -> readSaveFile(context, reader)
"preferences" -> readPreferences(reader, preferences)
else -> throw RuntimeException("Can not parse type $type")
}
}
reader.endObject()
preferences.commit()

exitProcess(0)
} catch (e: Exception) {
e.printStackTrace()
false
}
}

companion object {
const val TAG = "PFABackupRestorer"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.secuso.privacyfriendlydame.backup

import org.secuso.privacyfriendlybackup.api.pfa.PFAAuthService

class PFABackupService : PFAAuthService()
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@

public class MainActivity extends BaseActivity {

public final static String SAVE_FILE = "savedata";

private ViewPager mViewPager;
private ImageView mArrowLeft;
Expand Down Expand Up @@ -146,7 +147,7 @@ private CheckersGame loadFile() {
ObjectInputStream ois = null;
FileInputStream fis = null;
try {
fis = this.openFileInput("savedata");
fis = this.openFileInput(SAVE_FILE);
ois = new ObjectInputStream(fis);
currentGame = (CheckersGame) ois.readObject();
return currentGame;
Expand Down Expand Up @@ -202,7 +203,7 @@ public void onClick(View view) {
builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// delete file
deleteFile("savedata");
deleteFile(SAVE_FILE);
startGame();
dialog.dismiss();
}
Expand Down
2 changes: 0 additions & 2 deletions app/src/main/res/values-nl/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,6 @@
<string name="game_current_player_ai">Computer is aan zet</string>

<!-- ###WIN SCREEN###-->
<string name="sWinDialogTitle">Gefeliciteerd!</string>
<string name="sWinDialogText">Je hebt je tegenstander verslagen!</string>
<string name="sWinDialogBack">Terug naar hoofdmenu</string>
<string name="sWinDialogShowBoard">Bord tonen</string>
<string name="help_how_does_the_game_work">Wat zijn de regels van dammen?</string>
Expand Down
8 changes: 5 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ buildscript {

repositories {
google()
jcenter()
mavenCentral()
}

ext.kotlin_version = '1.7.20'
dependencies {
classpath 'com.android.tools.build:gradle:7.3.1'

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
Expand All @@ -17,7 +19,7 @@ buildscript {

allprojects {
repositories {
jcenter()
mavenCentral()
google()
}
}
Expand Down
1 change: 1 addition & 0 deletions libs/privacy-friendly-backup-api
2 changes: 2 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
include ':app'
include ':backup-api'
project(':backup-api').projectDir = new File('libs/privacy-friendly-backup-api/BackupAPI')

0 comments on commit 9c19248

Please sign in to comment.