Remove D2D setting, it is now always on
This commit is contained in:
parent
fe8d458890
commit
9de1d2472b
21 changed files with 24 additions and 144 deletions
4
.github/scripts/run_tests.sh
vendored
4
.github/scripts/run_tests.sh
vendored
|
@ -10,10 +10,8 @@ echo "Installing Seedvault app..."
|
||||||
./gradlew --stacktrace :app:installDebugAndroidTest
|
./gradlew --stacktrace :app:installDebugAndroidTest
|
||||||
sleep 60
|
sleep 60
|
||||||
|
|
||||||
D2D_BACKUP_TEST=$1
|
|
||||||
|
|
||||||
large_test_exit_code=0
|
large_test_exit_code=0
|
||||||
./gradlew --stacktrace -Pinstrumented_test_size=large -Pd2d_backup_test="$D2D_BACKUP_TEST" :app:connectedAndroidTest || large_test_exit_code=$?
|
./gradlew --stacktrace -Pinstrumented_test_size=large :app:connectedAndroidTest || large_test_exit_code=$?
|
||||||
|
|
||||||
adb pull /sdcard/seedvault_test_results
|
adb pull /sdcard/seedvault_test_results
|
||||||
|
|
||||||
|
|
3
.github/workflows/test.yml
vendored
3
.github/workflows/test.yml
vendored
|
@ -20,7 +20,6 @@ jobs:
|
||||||
matrix:
|
matrix:
|
||||||
android_target: [ 34 ]
|
android_target: [ 34 ]
|
||||||
emulator_type: [ aosp_atd ]
|
emulator_type: [ aosp_atd ]
|
||||||
d2d_backup_test: [ true, false ]
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
@ -53,7 +52,7 @@ jobs:
|
||||||
disable-animations: true
|
disable-animations: true
|
||||||
script: |
|
script: |
|
||||||
./app/development/scripts/provision_emulator.sh "test" "system-images;android-${{ matrix.android_target }};${{ matrix.emulator_type }};x86_64"
|
./app/development/scripts/provision_emulator.sh "test" "system-images;android-${{ matrix.android_target }};${{ matrix.emulator_type }};x86_64"
|
||||||
./.github/scripts/run_tests.sh ${{ matrix.d2d_backup_test }}
|
./.github/scripts/run_tests.sh
|
||||||
|
|
||||||
- name: Upload test results
|
- name: Upload test results
|
||||||
if: always()
|
if: always()
|
||||||
|
|
|
@ -39,9 +39,6 @@ android {
|
||||||
|
|
||||||
testInstrumentationRunnerArguments["size"] = testSize
|
testInstrumentationRunnerArguments["size"] = testSize
|
||||||
}
|
}
|
||||||
|
|
||||||
val d2dBackupTest = project.findProperty("d2d_backup_test")?.toString() ?: "true"
|
|
||||||
testInstrumentationRunnerArguments["d2d_backup_test"] = d2dBackupTest
|
|
||||||
}
|
}
|
||||||
|
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
|
|
|
@ -32,7 +32,7 @@ class KoinInstrumentationTestApp : App() {
|
||||||
val testModule = module {
|
val testModule = module {
|
||||||
val context = this@KoinInstrumentationTestApp
|
val context = this@KoinInstrumentationTestApp
|
||||||
|
|
||||||
single { spyk(PackageService(context, get(), get(), get())) }
|
single { spyk(PackageService(context, get(), get())) }
|
||||||
single { spyk(SettingsManager(context)) }
|
single { spyk(SettingsManager(context)) }
|
||||||
|
|
||||||
single { spyk(BackupNotificationManager(context)) }
|
single { spyk(BackupNotificationManager(context)) }
|
||||||
|
|
|
@ -74,7 +74,6 @@ internal interface LargeBackupTestBase : LargeTestBase {
|
||||||
full = mutableMapOf(),
|
full = mutableMapOf(),
|
||||||
kv = mutableMapOf(),
|
kv = mutableMapOf(),
|
||||||
userApps = packageService.userApps,
|
userApps = packageService.userApps,
|
||||||
userNotAllowedApps = packageService.userNotAllowedApps
|
|
||||||
)
|
)
|
||||||
|
|
||||||
val completed = spyOnBackup(backupResult)
|
val completed = spyOnBackup(backupResult)
|
||||||
|
|
|
@ -63,7 +63,6 @@ internal interface LargeRestoreTestBase : LargeTestBase {
|
||||||
full = mutableMapOf(),
|
full = mutableMapOf(),
|
||||||
kv = mutableMapOf(),
|
kv = mutableMapOf(),
|
||||||
userApps = emptyList(), // will update everything below this after restore
|
userApps = emptyList(), // will update everything below this after restore
|
||||||
userNotAllowedApps = emptyList()
|
|
||||||
)
|
)
|
||||||
|
|
||||||
spyOnRestoreData(result)
|
spyOnRestoreData(result)
|
||||||
|
@ -97,7 +96,6 @@ internal interface LargeRestoreTestBase : LargeTestBase {
|
||||||
|
|
||||||
return result.copy(
|
return result.copy(
|
||||||
userApps = packageService.userApps,
|
userApps = packageService.userApps,
|
||||||
userNotAllowedApps = packageService.userNotAllowedApps
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -112,11 +112,9 @@ internal interface LargeTestBase : KoinComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testResultFilename(testName: String): String {
|
fun testResultFilename(testName: String): String {
|
||||||
val arguments = InstrumentationRegistry.getArguments()
|
|
||||||
val d2d = if (arguments.getString("d2d_backup_test") == "true") "d2d" else ""
|
|
||||||
val simpleDateFormat = SimpleDateFormat("yyyyMMdd_hhmmss")
|
val simpleDateFormat = SimpleDateFormat("yyyyMMdd_hhmmss")
|
||||||
val timeStamp = simpleDateFormat.format(Calendar.getInstance().time)
|
val timeStamp = simpleDateFormat.format(Calendar.getInstance().time)
|
||||||
return "${timeStamp}_${d2d}_${testName.replace(" ", "_")}"
|
return "${timeStamp}_${testName.replace(" ", "_")}"
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(DelicateCoroutinesApi::class)
|
@OptIn(DelicateCoroutinesApi::class)
|
||||||
|
|
|
@ -7,7 +7,6 @@ package com.stevesoltys.seedvault.e2e
|
||||||
|
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import androidx.test.platform.app.InstrumentationRegistry
|
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import org.junit.After
|
import org.junit.After
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
|
@ -52,17 +51,6 @@ internal abstract class SeedvaultLargeTest :
|
||||||
|
|
||||||
startRecordingTest(keepRecordingScreen, name.methodName)
|
startRecordingTest(keepRecordingScreen, name.methodName)
|
||||||
restoreBaselineBackup()
|
restoreBaselineBackup()
|
||||||
|
|
||||||
val arguments = InstrumentationRegistry.getArguments()
|
|
||||||
|
|
||||||
if (arguments.getString("d2d_backup_test") == "true") {
|
|
||||||
println("Enabling D2D backups for test")
|
|
||||||
settingsManager.setD2dBackupsEnabled(true)
|
|
||||||
|
|
||||||
} else {
|
|
||||||
println("Disabling D2D backups for test")
|
|
||||||
settingsManager.setD2dBackupsEnabled(false)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
|
|
@ -24,7 +24,6 @@ internal data class SeedvaultLargeTestResult(
|
||||||
val full: MutableMap<String, String>,
|
val full: MutableMap<String, String>,
|
||||||
val kv: MutableMap<String, MutableMap<String, String>>,
|
val kv: MutableMap<String, MutableMap<String, String>>,
|
||||||
val userApps: List<PackageInfo>,
|
val userApps: List<PackageInfo>,
|
||||||
val userNotAllowedApps: List<PackageInfo>,
|
|
||||||
) {
|
) {
|
||||||
fun allUserApps() = userApps + userNotAllowedApps
|
fun allUserApps() = userApps
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,7 +131,7 @@ internal class SnapshotCreator(
|
||||||
androidId = Settings.Secure.getString(context.contentResolver, ANDROID_ID) ?: ""
|
androidId = Settings.Secure.getString(context.contentResolver, ANDROID_ID) ?: ""
|
||||||
sdkInt = Build.VERSION.SDK_INT
|
sdkInt = Build.VERSION.SDK_INT
|
||||||
androidIncremental = Build.VERSION.INCREMENTAL
|
androidIncremental = Build.VERSION.INCREMENTAL
|
||||||
d2D = settingsManager.d2dBackupsEnabled()
|
d2D = true
|
||||||
putAllApps(appBuilderMap.mapValues { it.value.build() })
|
putAllApps(appBuilderMap.mapValues { it.value.build() })
|
||||||
putAllBlobs(this@SnapshotCreator.blobsMap)
|
putAllBlobs(this@SnapshotCreator.blobsMap)
|
||||||
}.build()
|
}.build()
|
||||||
|
|
|
@ -62,7 +62,6 @@ internal class AppListRetriever(
|
||||||
val appListSections = linkedMapOf(
|
val appListSections = linkedMapOf(
|
||||||
AppSectionTitle(R.string.backup_section_system) to getSpecialApps(),
|
AppSectionTitle(R.string.backup_section_system) to getSpecialApps(),
|
||||||
AppSectionTitle(R.string.backup_section_user) to getApps(),
|
AppSectionTitle(R.string.backup_section_user) to getApps(),
|
||||||
AppSectionTitle(R.string.backup_section_not_allowed) to getNotAllowedApps()
|
|
||||||
).filter { it.value.isNotEmpty() }
|
).filter { it.value.isNotEmpty() }
|
||||||
|
|
||||||
return appListSections.flatMap { (sectionTitle, appList) ->
|
return appListSections.flatMap { (sectionTitle, appList) ->
|
||||||
|
@ -129,21 +128,6 @@ internal class AppListRetriever(
|
||||||
}).sortedBy { it.name.lowercase(locale) }
|
}).sortedBy { it.name.lowercase(locale) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getNotAllowedApps(): List<AppStatus> {
|
|
||||||
val locale = Locale.getDefault()
|
|
||||||
return packageService.userNotAllowedApps.map {
|
|
||||||
AppStatus(
|
|
||||||
packageName = it.packageName,
|
|
||||||
enabled = settingsManager.isBackupEnabled(it.packageName),
|
|
||||||
icon = getIconFromPackageManager(it.packageName),
|
|
||||||
name = getAppName(context, it.packageName).toString(),
|
|
||||||
time = 0,
|
|
||||||
size = null,
|
|
||||||
status = FAILED_NOT_ALLOWED,
|
|
||||||
)
|
|
||||||
}.sortedBy { it.name.lowercase(locale) }
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getIconFromPackageManager(packageName: String): Drawable = try {
|
private fun getIconFromPackageManager(packageName: String): Drawable = try {
|
||||||
pm.getApplicationIcon(packageName)
|
pm.getApplicationIcon(packageName)
|
||||||
} catch (e: PackageManager.NameNotFoundException) {
|
} catch (e: PackageManager.NameNotFoundException) {
|
||||||
|
|
|
@ -46,18 +46,6 @@ class ExpertSettingsFragment : PreferenceFragmentCompat() {
|
||||||
quotaPreference.isChecked = newValue as Boolean
|
quotaPreference.isChecked = newValue as Boolean
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
val d2dPreference = findPreference<SwitchPreferenceCompat>(PREF_KEY_D2D_BACKUPS)
|
|
||||||
|
|
||||||
d2dPreference?.setOnPreferenceChangeListener { _, newValue ->
|
|
||||||
d2dPreference.isChecked = newValue as Boolean
|
|
||||||
|
|
||||||
// automatically enable unlimited quota when enabling D2D backups
|
|
||||||
if (d2dPreference.isChecked) {
|
|
||||||
quotaPreference?.isChecked = true
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStart() {
|
override fun onStart() {
|
||||||
|
|
|
@ -56,7 +56,6 @@ private const val PREF_KEY_BACKUP_APP_BLACKLIST = "backupAppBlacklist"
|
||||||
|
|
||||||
private const val PREF_KEY_BACKUP_STORAGE = "backup_storage"
|
private const val PREF_KEY_BACKUP_STORAGE = "backup_storage"
|
||||||
internal const val PREF_KEY_UNLIMITED_QUOTA = "unlimited_quota"
|
internal const val PREF_KEY_UNLIMITED_QUOTA = "unlimited_quota"
|
||||||
internal const val PREF_KEY_D2D_BACKUPS = "d2d_backups"
|
|
||||||
internal const val PREF_KEY_LAST_BACKUP = "lastBackup"
|
internal const val PREF_KEY_LAST_BACKUP = "lastBackup"
|
||||||
|
|
||||||
class SettingsManager(private val context: Context) {
|
class SettingsManager(private val context: Context) {
|
||||||
|
@ -249,14 +248,6 @@ class SettingsManager(private val context: Context) {
|
||||||
|
|
||||||
fun isQuotaUnlimited() = prefs.getBoolean(PREF_KEY_UNLIMITED_QUOTA, false)
|
fun isQuotaUnlimited() = prefs.getBoolean(PREF_KEY_UNLIMITED_QUOTA, false)
|
||||||
|
|
||||||
fun d2dBackupsEnabled() = prefs.getBoolean(PREF_KEY_D2D_BACKUPS, false)
|
|
||||||
|
|
||||||
fun setD2dBackupsEnabled(enabled: Boolean) {
|
|
||||||
prefs.edit()
|
|
||||||
.putBoolean(PREF_KEY_D2D_BACKUPS, enabled)
|
|
||||||
.apply()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This assumes that if there's no storage plugin set, it is the first start.
|
* This assumes that if there's no storage plugin set, it is the first start.
|
||||||
* We enforce a storage plugin and don't allow unsetting one,
|
* We enforce a storage plugin and don't allow unsetting one,
|
||||||
|
|
|
@ -62,13 +62,7 @@ class ConfigurableBackupTransport internal constructor(private val context: Cont
|
||||||
* which is accessible to the BackupAgent.
|
* which is accessible to the BackupAgent.
|
||||||
* This allows the agent to decide what to do based on properties of the transport.
|
* This allows the agent to decide what to do based on properties of the transport.
|
||||||
*/
|
*/
|
||||||
override fun getTransportFlags(): Int {
|
override fun getTransportFlags(): Int = D2D_TRANSPORT_FLAGS
|
||||||
return if (settingsManager.d2dBackupsEnabled()) {
|
|
||||||
D2D_TRANSPORT_FLAGS
|
|
||||||
} else {
|
|
||||||
DEFAULT_TRANSPORT_FLAGS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ask the transport for an [Intent] that can be used to launch
|
* Ask the transport for an [Intent] that can be used to launch
|
||||||
|
|
|
@ -14,7 +14,6 @@ val backupModule = module {
|
||||||
single {
|
single {
|
||||||
PackageService(
|
PackageService(
|
||||||
context = androidContext(),
|
context = androidContext(),
|
||||||
backupManager = get(),
|
|
||||||
settingsManager = get(),
|
settingsManager = get(),
|
||||||
backendManager = get(),
|
backendManager = get(),
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,12 +5,10 @@
|
||||||
|
|
||||||
package com.stevesoltys.seedvault.transport.backup
|
package com.stevesoltys.seedvault.transport.backup
|
||||||
|
|
||||||
import android.app.backup.IBackupManager
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.Intent.ACTION_MAIN
|
import android.content.Intent.ACTION_MAIN
|
||||||
import android.content.Intent.CATEGORY_LAUNCHER
|
import android.content.Intent.CATEGORY_LAUNCHER
|
||||||
import android.content.pm.ApplicationInfo.FLAG_ALLOW_BACKUP
|
|
||||||
import android.content.pm.ApplicationInfo.FLAG_STOPPED
|
import android.content.pm.ApplicationInfo.FLAG_STOPPED
|
||||||
import android.content.pm.ApplicationInfo.FLAG_SYSTEM
|
import android.content.pm.ApplicationInfo.FLAG_SYSTEM
|
||||||
import android.content.pm.ApplicationInfo.FLAG_TEST_ONLY
|
import android.content.pm.ApplicationInfo.FLAG_TEST_ONLY
|
||||||
|
@ -22,7 +20,6 @@ import android.content.pm.PackageManager.GET_SIGNING_CERTIFICATES
|
||||||
import android.content.pm.PackageManager.MATCH_SYSTEM_ONLY
|
import android.content.pm.PackageManager.MATCH_SYSTEM_ONLY
|
||||||
import android.content.pm.ResolveInfo
|
import android.content.pm.ResolveInfo
|
||||||
import android.os.RemoteException
|
import android.os.RemoteException
|
||||||
import android.os.UserHandle
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.util.Log.INFO
|
import android.util.Log.INFO
|
||||||
import androidx.annotation.WorkerThread
|
import androidx.annotation.WorkerThread
|
||||||
|
@ -41,13 +38,11 @@ private const val LOG_MAX_PACKAGES = 100
|
||||||
*/
|
*/
|
||||||
internal class PackageService(
|
internal class PackageService(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val backupManager: IBackupManager,
|
|
||||||
private val settingsManager: SettingsManager,
|
private val settingsManager: SettingsManager,
|
||||||
private val backendManager: BackendManager,
|
private val backendManager: BackendManager,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val packageManager: PackageManager = context.packageManager
|
private val packageManager: PackageManager = context.packageManager
|
||||||
private val myUserId = UserHandle.myUserId()
|
|
||||||
private val backend: Backend get() = backendManager.backend
|
private val backend: Backend get() = backendManager.backend
|
||||||
|
|
||||||
val eligiblePackages: List<String>
|
val eligiblePackages: List<String>
|
||||||
|
@ -64,14 +59,7 @@ internal class PackageService(
|
||||||
logPackages(packages)
|
logPackages(packages)
|
||||||
}
|
}
|
||||||
|
|
||||||
val eligibleApps = if (settingsManager.d2dBackupsEnabled()) {
|
val eligibleApps = packages.filter(::shouldIncludeAppInBackup).toTypedArray()
|
||||||
// if D2D is enabled, use the "new method" for filtering packages
|
|
||||||
packages.filter(::shouldIncludeAppInBackup).toTypedArray()
|
|
||||||
} else {
|
|
||||||
// otherwise, use the BackupManager call.
|
|
||||||
backupManager.filterAppsEligibleForBackupForUser(myUserId, packages.toTypedArray())
|
|
||||||
}
|
|
||||||
|
|
||||||
// log eligible packages
|
// log eligible packages
|
||||||
if (Log.isLoggable(TAG, INFO)) {
|
if (Log.isLoggable(TAG, INFO)) {
|
||||||
Log.i(TAG, "Filtering left ${eligibleApps.size} eligible packages:")
|
Log.i(TAG, "Filtering left ${eligibleApps.size} eligible packages:")
|
||||||
|
@ -140,17 +128,7 @@ internal class PackageService(
|
||||||
/**
|
/**
|
||||||
* A list of apps that do not allow backup.
|
* A list of apps that do not allow backup.
|
||||||
*/
|
*/
|
||||||
val userNotAllowedApps: List<PackageInfo>
|
val userNotAllowedApps: List<PackageInfo> = emptyList()
|
||||||
@WorkerThread
|
|
||||||
get() {
|
|
||||||
// if D2D backups are enabled, all apps are allowed
|
|
||||||
if (settingsManager.d2dBackupsEnabled()) return emptyList()
|
|
||||||
|
|
||||||
return packageManager.getInstalledPackages(0).filter { packageInfo ->
|
|
||||||
!packageInfo.allowsBackup() &&
|
|
||||||
!packageInfo.isSystemApp()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val launchableSystemApps: List<ResolveInfo>
|
val launchableSystemApps: List<ResolveInfo>
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
|
@ -196,26 +174,20 @@ internal class PackageService(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun PackageInfo.allowsBackup(): Boolean {
|
private fun PackageInfo.allowsBackup(): Boolean {
|
||||||
|
/**
|
||||||
|
* TODO: Consider ways of replicating the system's logic so that the user can have
|
||||||
|
* advance knowledge of apps that the system will exclude, particularly apps targeting
|
||||||
|
* SDK 30 or below.
|
||||||
|
*
|
||||||
|
* At backup time, the system will filter out any apps that *it* does not want to be
|
||||||
|
* backed up. If the user has enabled D2D, *we* generally want to back up as much as
|
||||||
|
* possible; part of the point of D2D is to ignore FLAG_ALLOW_BACKUP (allowsBackup).
|
||||||
|
* So, we return true.
|
||||||
|
* See frameworks/base/services/backup/java/com/android/server/backup/utils/
|
||||||
|
* BackupEligibilityRules.java lines 74-81 and 163-167 (tag: android-13.0.0_r8).
|
||||||
|
*/
|
||||||
val appInfo = applicationInfo
|
val appInfo = applicationInfo
|
||||||
if (packageName == MAGIC_PACKAGE_MANAGER || appInfo == null) return false
|
return !(packageName == MAGIC_PACKAGE_MANAGER || appInfo == null)
|
||||||
|
|
||||||
return if (settingsManager.d2dBackupsEnabled()) {
|
|
||||||
/**
|
|
||||||
* TODO: Consider ways of replicating the system's logic so that the user can have
|
|
||||||
* advance knowledge of apps that the system will exclude, particularly apps targeting
|
|
||||||
* SDK 30 or below.
|
|
||||||
*
|
|
||||||
* At backup time, the system will filter out any apps that *it* does not want to be
|
|
||||||
* backed up. If the user has enabled D2D, *we* generally want to back up as much as
|
|
||||||
* possible; part of the point of D2D is to ignore FLAG_ALLOW_BACKUP (allowsBackup).
|
|
||||||
* So, we return true.
|
|
||||||
* See frameworks/base/services/backup/java/com/android/server/backup/utils/
|
|
||||||
* BackupEligibilityRules.java lines 74-81 and 163-167 (tag: android-13.0.0_r8).
|
|
||||||
*/
|
|
||||||
true
|
|
||||||
} else {
|
|
||||||
appInfo.flags and FLAG_ALLOW_BACKUP != 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -167,10 +167,6 @@ internal class RestoreCoordinator(
|
||||||
*/
|
*/
|
||||||
fun beforeStartRestore(restorableBackup: RestorableBackup) {
|
fun beforeStartRestore(restorableBackup: RestorableBackup) {
|
||||||
this.restorableBackup = restorableBackup
|
this.restorableBackup = restorableBackup
|
||||||
|
|
||||||
if (restorableBackup.d2dBackup) {
|
|
||||||
settingsManager.setD2dBackupsEnabled(true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -69,8 +69,6 @@
|
||||||
<string name="settings_expert_title">Expert settings</string>
|
<string name="settings_expert_title">Expert settings</string>
|
||||||
<string name="settings_expert_quota_title">Unlimited app quota</string>
|
<string name="settings_expert_quota_title">Unlimited app quota</string>
|
||||||
<string name="settings_expert_quota_summary">Do not impose a limitation on the size of app backups.\n\nWarning: This can fill up your storage location quickly. Not needed for most apps.</string>
|
<string name="settings_expert_quota_summary">Do not impose a limitation on the size of app backups.\n\nWarning: This can fill up your storage location quickly. Not needed for most apps.</string>
|
||||||
<string name="settings_expert_d2d_title">Device-to-device backups</string>
|
|
||||||
<string name="settings_expert_d2d_summary">This forces backups for most apps, even when they disallow them. This is alpha, use at your own risk.</string>
|
|
||||||
<string name="settings_expert_logcat_title">Save app log</string>
|
<string name="settings_expert_logcat_title">Save app log</string>
|
||||||
<string name="settings_expert_logcat_summary">Developers can diagnose bugs with these logs.\n\nWarning: The log file might contain personally identifiable information. Review before and delete after sharing!</string>
|
<string name="settings_expert_logcat_summary">Developers can diagnose bugs with these logs.\n\nWarning: The log file might contain personally identifiable information. Review before and delete after sharing!</string>
|
||||||
<string name="settings_expert_logcat_error">Error: Could not save app log</string>
|
<string name="settings_expert_logcat_error">Error: Could not save app log</string>
|
||||||
|
@ -204,7 +202,6 @@
|
||||||
<string name="backup_app_quota_exceeded">Backup quota exceeded</string>
|
<string name="backup_app_quota_exceeded">Backup quota exceeded</string>
|
||||||
<string name="restore_app_quota_exceeded">Backup quota was exceeded</string>
|
<string name="restore_app_quota_exceeded">Backup quota was exceeded</string>
|
||||||
<string name="restore_app_not_installed">App not installed</string>
|
<string name="restore_app_not_installed">App not installed</string>
|
||||||
<string name="backup_section_not_allowed">Apps that do not allow data backup</string>
|
|
||||||
|
|
||||||
<!-- Restore -->
|
<!-- Restore -->
|
||||||
<string name="restore_title">Restore from backup</string>
|
<string name="restore_title">Restore from backup</string>
|
||||||
|
|
|
@ -9,12 +9,6 @@
|
||||||
android:key="unlimited_quota"
|
android:key="unlimited_quota"
|
||||||
android:summary="@string/settings_expert_quota_summary"
|
android:summary="@string/settings_expert_quota_summary"
|
||||||
android:title="@string/settings_expert_quota_title" />
|
android:title="@string/settings_expert_quota_title" />
|
||||||
<SwitchPreferenceCompat
|
|
||||||
android:id="@+id/d2d_backup_preference"
|
|
||||||
android:defaultValue="false"
|
|
||||||
android:key="d2d_backups"
|
|
||||||
android:summary="@string/settings_expert_d2d_summary"
|
|
||||||
android:title="@string/settings_expert_d2d_title" />
|
|
||||||
<Preference
|
<Preference
|
||||||
android:icon="@drawable/ic_bug_report"
|
android:icon="@drawable/ic_bug_report"
|
||||||
android:key="logcat"
|
android:key="logcat"
|
||||||
|
|
|
@ -30,7 +30,6 @@ import io.mockk.verify
|
||||||
import org.junit.After
|
import org.junit.After
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.assertFalse
|
import org.junit.Assert.assertFalse
|
||||||
import org.junit.Before
|
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.koin.core.context.stopKoin
|
import org.koin.core.context.stopKoin
|
||||||
|
@ -75,11 +74,6 @@ class MetadataManagerTest {
|
||||||
private val cacheInputStream: FileInputStream = mockk()
|
private val cacheInputStream: FileInputStream = mockk()
|
||||||
private val encodedMetadata = getRandomByteArray()
|
private val encodedMetadata = getRandomByteArray()
|
||||||
|
|
||||||
@Before
|
|
||||||
fun beforeEachTest() {
|
|
||||||
every { settingsManager.d2dBackupsEnabled() } returns false
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
@After
|
||||||
fun afterEachTest() {
|
fun afterEachTest() {
|
||||||
stopKoin()
|
stopKoin()
|
||||||
|
|
|
@ -23,6 +23,7 @@ import io.mockk.every
|
||||||
import io.mockk.just
|
import io.mockk.just
|
||||||
import io.mockk.mockk
|
import io.mockk.mockk
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Assert.assertTrue
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.robolectric.annotation.Config
|
import org.robolectric.annotation.Config
|
||||||
|
@ -44,7 +45,6 @@ internal class SnapshotCreatorTest : TransportTest() {
|
||||||
fun `test onApkBackedUp`() {
|
fun `test onApkBackedUp`() {
|
||||||
every { applicationInfo.loadLabel(any()) } returns name
|
every { applicationInfo.loadLabel(any()) } returns name
|
||||||
every { clock.time() } returns token
|
every { clock.time() } returns token
|
||||||
every { settingsManager.d2dBackupsEnabled() } returns Random.nextBoolean()
|
|
||||||
|
|
||||||
snapshotCreator.onApkBackedUp(packageInfo, apk, blobMap)
|
snapshotCreator.onApkBackedUp(packageInfo, apk, blobMap)
|
||||||
val s = snapshotCreator.finalizeSnapshot()
|
val s = snapshotCreator.finalizeSnapshot()
|
||||||
|
@ -70,7 +70,6 @@ internal class SnapshotCreatorTest : TransportTest() {
|
||||||
every { appInfo.loadLabel(any()) } returns name
|
every { appInfo.loadLabel(any()) } returns name
|
||||||
every { metadataManager.onPackageBackedUp(packageInfo, BackupType.FULL, size) } just Runs
|
every { metadataManager.onPackageBackedUp(packageInfo, BackupType.FULL, size) } just Runs
|
||||||
every { clock.time() } returns token andThen token + 1
|
every { clock.time() } returns token andThen token + 1
|
||||||
every { settingsManager.d2dBackupsEnabled() } returns Random.nextBoolean()
|
|
||||||
every { packageService.launchableSystemApps } returns listOf(resolveInfo)
|
every { packageService.launchableSystemApps } returns listOf(resolveInfo)
|
||||||
|
|
||||||
snapshotCreator.onPackageBackedUp(packageInfo, BackupType.FULL, apkBackupData)
|
snapshotCreator.onPackageBackedUp(packageInfo, BackupType.FULL, apkBackupData)
|
||||||
|
@ -92,7 +91,6 @@ internal class SnapshotCreatorTest : TransportTest() {
|
||||||
val size = apkBackupData.size
|
val size = apkBackupData.size
|
||||||
every { metadataManager.onPackageBackedUp(packageInfo, BackupType.FULL, size) } just Runs
|
every { metadataManager.onPackageBackedUp(packageInfo, BackupType.FULL, size) } just Runs
|
||||||
every { clock.time() } returns token andThen token + 1
|
every { clock.time() } returns token andThen token + 1
|
||||||
every { settingsManager.d2dBackupsEnabled() } returns Random.nextBoolean()
|
|
||||||
every { packageService.launchableSystemApps } returns emptyList()
|
every { packageService.launchableSystemApps } returns emptyList()
|
||||||
|
|
||||||
snapshotCreator.onPackageBackedUp(packageInfo, BackupType.FULL, apkBackupData)
|
snapshotCreator.onPackageBackedUp(packageInfo, BackupType.FULL, apkBackupData)
|
||||||
|
@ -102,7 +100,6 @@ internal class SnapshotCreatorTest : TransportTest() {
|
||||||
@Test
|
@Test
|
||||||
fun `test onIconsBackedUp`() {
|
fun `test onIconsBackedUp`() {
|
||||||
every { clock.time() } returns token andThen token + 1
|
every { clock.time() } returns token andThen token + 1
|
||||||
every { settingsManager.d2dBackupsEnabled() } returns Random.nextBoolean()
|
|
||||||
|
|
||||||
snapshotCreator.onIconsBackedUp(apkBackupData)
|
snapshotCreator.onIconsBackedUp(apkBackupData)
|
||||||
val s = snapshotCreator.finalizeSnapshot()
|
val s = snapshotCreator.finalizeSnapshot()
|
||||||
|
@ -113,9 +110,7 @@ internal class SnapshotCreatorTest : TransportTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `test finalize`() {
|
fun `test finalize`() {
|
||||||
val d2d = Random.nextBoolean()
|
|
||||||
every { clock.time() } returns token
|
every { clock.time() } returns token
|
||||||
every { settingsManager.d2dBackupsEnabled() } returns d2d
|
|
||||||
|
|
||||||
val s = snapshotCreator.finalizeSnapshot()
|
val s = snapshotCreator.finalizeSnapshot()
|
||||||
|
|
||||||
|
@ -126,7 +121,7 @@ internal class SnapshotCreatorTest : TransportTest() {
|
||||||
assertEquals("", s.androidId) // not mocked
|
assertEquals("", s.androidId) // not mocked
|
||||||
assertEquals(34, s.sdkInt) // as per config above, needs bump once possible
|
assertEquals(34, s.sdkInt) // as per config above, needs bump once possible
|
||||||
assertEquals("unknown", s.androidIncremental)
|
assertEquals("unknown", s.androidIncremental)
|
||||||
assertEquals(d2d, s.d2D)
|
assertTrue(s.d2D)
|
||||||
assertEquals(0, s.appsCount)
|
assertEquals(0, s.appsCount)
|
||||||
assertEquals(0, s.iconChunkIdsCount)
|
assertEquals(0, s.iconChunkIdsCount)
|
||||||
assertEquals(emptyMap<String, Snapshot.Blob>(), s.blobsMap)
|
assertEquals(emptyMap<String, Snapshot.Blob>(), s.blobsMap)
|
||||||
|
|
Loading…
Reference in a new issue