diff --git a/BackupAPI b/BackupAPI index 0e84e62..02c5f20 160000 --- a/BackupAPI +++ b/BackupAPI @@ -1 +1 @@ -Subproject commit 0e84e62bc4550c2f6cad789930d2842d7cc35333 +Subproject commit 02c5f205d4da91e1aa4143165bc8a0dfac352fed diff --git a/BackupApp/build.gradle b/BackupApp/build.gradle index 254993e..866acb0 100644 --- a/BackupApp/build.gradle +++ b/BackupApp/build.gradle @@ -3,12 +3,12 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' +def pfaFile = rootProject.file('pfa.properties') + android { signingConfigs { - 'pfa-key' { - def pfaFile = rootProject.file('pfa.properties') - - if (pfaFile.exists()) { + if (pfaFile.exists()) { + 'pfa-key' { def pfa = new Properties() pfa.load(new FileInputStream(pfaFile)) @@ -48,7 +48,9 @@ android { } debug { debuggable true - signingConfig signingConfigs.'pfa-key' + if (pfaFile.exists()) { + signingConfig signingConfigs.'pfa-key' + } } } diff --git a/BackupApp/src/main/AndroidManifest.xml b/BackupApp/src/main/AndroidManifest.xml index d9bc63c..3b89191 100644 --- a/BackupApp/src/main/AndroidManifest.xml +++ b/BackupApp/src/main/AndroidManifest.xml @@ -4,9 +4,13 @@ package="org.secuso.privacyfriendlybackup"> + + + + - + Unit = this::defaultFadeAnimation) : Animator { + protected fun playColorAnimationRes(@ColorRes colorFromId: Int, @ColorRes colorToId: Int, duration : Long = 250, applyAnimation : (a : ValueAnimator) -> Unit = this::defaultFadeAnimation) : Animator { val colorFrom = ContextCompat.getColor(requireContext(), colorFromId) val colorTo = ContextCompat.getColor(requireContext(), colorToId) - return playColorAnimation(colorFrom, colorTo, 250, applyAnimation) + return playColorAnimation(colorFrom, colorTo, duration, applyAnimation) } protected fun playColorAnimation(@ColorInt colorFrom: Int, @ColorInt colorTo: Int, duration : Long = 250, applyAnimation : (a : ValueAnimator) -> Unit = this::defaultFadeAnimation) : Animator { diff --git a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/common/DisplayMenuItemActivity.kt b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/common/DisplayMenuItemActivity.kt index ca35985..c035fc8 100644 --- a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/common/DisplayMenuItemActivity.kt +++ b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/common/DisplayMenuItemActivity.kt @@ -17,6 +17,7 @@ import org.secuso.privacyfriendlybackup.ui.main.MainActivity * in a [MainActivity]. */ class DisplayMenuItemActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_display_menu_item) diff --git a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/encryption/UserInteractionRequiredActivity.kt b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/encryption/UserInteractionRequiredActivity.kt index 7f60411..4f7ff32 100644 --- a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/encryption/UserInteractionRequiredActivity.kt +++ b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/encryption/UserInteractionRequiredActivity.kt @@ -9,6 +9,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.preference.PreferenceManager import androidx.work.* import org.openintents.openpgp.util.OpenPgpApi +import org.secuso.privacyfriendlybackup.BackupApplication import org.secuso.privacyfriendlybackup.preference.PreferenceKeys.PREF_ENCRYPTION_KEY import org.secuso.privacyfriendlybackup.preference.PreferenceKeys.PREF_ENCRYPTION_PASSPHRASE import org.secuso.privacyfriendlybackup.worker.EncryptionWorker @@ -88,6 +89,9 @@ class UserInteractionRequiredActivity : AppCompatActivity() { edit.apply() + // restart the encryption worker + (applicationContext as BackupApplication).schedulePeriodicWork() + // after the answer was received, there is no need to display this translucent activity finish() diff --git a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/inspection/DataInspectionActivity.kt b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/inspection/DataInspectionActivity.kt index 0b9fbac..034c526 100644 --- a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/inspection/DataInspectionActivity.kt +++ b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/inspection/DataInspectionActivity.kt @@ -37,10 +37,9 @@ class DataInspectionActivity : AppCompatActivity() { setContentView(R.layout.data_inspection_activity) supportActionBar?.setDisplayHomeAsUpEnabled(true) - viewModel = ViewModelProvider(this).get(DataInspectionViewModel::class.java) + viewModel = ViewModelProvider(this)[DataInspectionViewModel::class.java] if (savedInstanceState == null) { - val fragment = DataInspectionFragment.newInstance() fragment.arguments = Bundle().apply { putLong(EXTRA_DATA_ID, id) @@ -57,8 +56,4 @@ class DataInspectionActivity : AppCompatActivity() { override fun onBackPressed() { finish() } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - } } \ No newline at end of file diff --git a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/inspection/DataInspectionFragment.kt b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/inspection/DataInspectionFragment.kt index 392636e..500c34a 100644 --- a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/inspection/DataInspectionFragment.kt +++ b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/ui/inspection/DataInspectionFragment.kt @@ -1,5 +1,6 @@ package org.secuso.privacyfriendlybackup.ui.inspection +import android.content.Context import android.content.Intent import android.graphics.Color import android.graphics.PorterDuff @@ -11,13 +12,15 @@ import android.view.* import android.widget.CheckBox import android.widget.TextView import android.widget.Toast +import androidx.activity.result.ActivityResultLauncher import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintSet import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.observe import androidx.preference.PreferenceManager import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.data_inspection_fragment.* @@ -25,6 +28,7 @@ import kotlinx.android.synthetic.main.item_application_job.* import org.openintents.openpgp.OpenPgpSignatureResult import org.secuso.privacyfriendlybackup.R import org.secuso.privacyfriendlybackup.preference.PreferenceKeys +import org.secuso.privacyfriendlybackup.ui.backup.BackupOverviewFragment import java.io.FileNotFoundException @@ -46,6 +50,8 @@ class DataInspectionFragment : Fragment() { private lateinit var viewModel: DataInspectionViewModel + //private lateinit var test : ActivityResultLauncher<> + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(true) @@ -194,7 +200,7 @@ class DataInspectionFragment : Fragment() { super.onActivityCreated(savedInstanceState) val activity = requireActivity() - viewModel = ViewModelProvider(activity).get(DataInspectionViewModel::class.java) + viewModel = ViewModelProvider(activity)[DataInspectionViewModel::class.java] encryptionEnabled = PreferenceManager.getDefaultSharedPreferences(requireActivity()).getBoolean(PreferenceKeys.PREF_ENCRYPTION_ENABLE, false) @@ -222,10 +228,10 @@ class DataInspectionFragment : Fragment() { data_inspection_load_status_name.setText(it.descriptionRes) data_inspection_load_status_image.setColorFilter(ContextCompat.getColor(requireActivity(), it.colorRes)) when(it) { - LoadStatus.UNKNOWN -> { + LoadStatus.UNKNOWN, null -> { data_inspection_load_status.visibility = View.GONE } - LoadStatus.ERROR -> { + LoadStatus.ERROR_INVALID_JSON, LoadStatus.ERROR -> { data_inspection_load_status.visibility = View.VISIBLE } LoadStatus.LOADING -> { diff --git a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/worker/BackupJobManagerWorker.kt b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/worker/BackupJobManagerWorker.kt index 683bf7a..03f5193 100644 --- a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/worker/BackupJobManagerWorker.kt +++ b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/worker/BackupJobManagerWorker.kt @@ -36,6 +36,8 @@ class BackupJobManagerWorker(val context: Context, params: WorkerParameters) : C val processedJobs = jobs.filter { it.active } val unprocessedJobs = jobs.filter { !it.active } + val jobsToCheck = jobs.toMutableList() + for(job in processedJobs) { val workInfoFuture = WorkManager.getInstance(context).getWorkInfosByTag(job.getWorkerTag()) val workInfoList = workInfoFuture.get() @@ -57,6 +59,9 @@ class BackupJobManagerWorker(val context: Context, params: WorkerParameters) : C // if it failed - try again job.active = false jobDao.update(job) + + deleteFollowingJobs(job, jobsToCheck) + // TODO: Show Toast - Job Failed? } } } @@ -126,17 +131,35 @@ class BackupJobManagerWorker(val context: Context, params: WorkerParameters) : C } } - - coroutineScope { - launch { - delay(1500L) - (context.applicationContext as BackupApplication).schedulePeriodicWork() + // continue calling the service if there are still jobs left to do + if(jobsToCheck.isNotEmpty()) { + coroutineScope { + launch { + delay(1500L) + (context.applicationContext as BackupApplication).schedulePeriodicWork() + } } } return Result.success() } + private fun deleteFollowingJobs(job: BackupJob, jobsToCheck: MutableList, jobsToDelete : MutableList = mutableListOf()) { + jobsToDelete.add(job) + + if(job.nextJob == null) { + return + } + + for(j in jobsToCheck) { + if(j._id == job.nextJob) { + deleteFollowingJobs(j, jobsToCheck, jobsToDelete) + } + } + + jobsToCheck.removeAll(jobsToDelete) + } + private fun enqueueEncryptionWork(job : BackupJob) { val encryptionWork = createEncryptionWorkRequest(job, true, pref) diff --git a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/worker/EncryptionWorker.kt b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/worker/EncryptionWorker.kt index 229b7f5..9f6934b 100644 --- a/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/worker/EncryptionWorker.kt +++ b/BackupApp/src/main/java/org/secuso/privacyfriendlybackup/worker/EncryptionWorker.kt @@ -381,7 +381,7 @@ class EncryptionWorker(val context: Context, params: WorkerParameters) : Corouti context, requestCode, intent, - PendingIntent.FLAG_UPDATE_CURRENT + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) setContentIntent(pendingIntent) }.build()