Minor improvements for app restore
* activity now can be launched from notification * better logging * app data restore continues even after activity died
This commit is contained in:
parent
11270ff694
commit
f8451586df
6 changed files with 11 additions and 4 deletions
|
@ -123,6 +123,7 @@
|
||||||
android:name=".restore.RestoreActivity"
|
android:name=".restore.RestoreActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:label="@string/restore_title"
|
android:label="@string/restore_title"
|
||||||
|
android:launchMode="singleTask"
|
||||||
android:permission="com.stevesoltys.seedvault.RESTORE_BACKUP">
|
android:permission="com.stevesoltys.seedvault.RESTORE_BACKUP">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.stevesoltys.seedvault.RESTORE_BACKUP" />
|
<action android:name="com.stevesoltys.seedvault.RESTORE_BACKUP" />
|
||||||
|
|
|
@ -210,7 +210,7 @@ internal class AppDataRestoreManager(
|
||||||
context.stopService(foregroundServiceIntent)
|
context.stopService(foregroundServiceIntent)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun closeSession() {
|
private fun closeSession() {
|
||||||
session?.endRestoreSession()
|
session?.endRestoreSession()
|
||||||
session = null
|
session = null
|
||||||
}
|
}
|
||||||
|
@ -267,6 +267,7 @@ internal class AppDataRestoreManager(
|
||||||
val nextChunkIndex = (packageIndex + PACKAGES_PER_CHUNK).coerceAtMost(packages.size)
|
val nextChunkIndex = (packageIndex + PACKAGES_PER_CHUNK).coerceAtMost(packages.size)
|
||||||
val packageChunk = packages.subList(packageIndex, nextChunkIndex).toTypedArray()
|
val packageChunk = packages.subList(packageIndex, nextChunkIndex).toTypedArray()
|
||||||
packageIndex += packageChunk.size
|
packageIndex += packageChunk.size
|
||||||
|
Log.d(TAG, "restoreNextPackages() with packageIndex=$packageIndex")
|
||||||
|
|
||||||
val token = restorableBackup.token
|
val token = restorableBackup.token
|
||||||
val result = session.restorePackages(token, this, packageChunk, monitor)
|
val result = session.restorePackages(token, this, packageChunk, monitor)
|
||||||
|
@ -309,6 +310,7 @@ internal class AppDataRestoreManager(
|
||||||
*/
|
*/
|
||||||
override fun restoreFinished(result: Int) {
|
override fun restoreFinished(result: Int) {
|
||||||
val chunkIndex = packageIndex / PACKAGES_PER_CHUNK
|
val chunkIndex = packageIndex / PACKAGES_PER_CHUNK
|
||||||
|
Log.d(TAG, "restoreFinished($result) with chunkIndex=$chunkIndex")
|
||||||
chunkResults[chunkIndex] = result
|
chunkResults[chunkIndex] = result
|
||||||
|
|
||||||
// Restore next chunk if successful and there are more packages to restore.
|
// Restore next chunk if successful and there are more packages to restore.
|
||||||
|
@ -317,6 +319,7 @@ internal class AppDataRestoreManager(
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log.d(TAG, "onRestoreComplete()")
|
||||||
// Restore finished, time to get the result.
|
// Restore finished, time to get the result.
|
||||||
onRestoreComplete(getRestoreResult(), restorableBackup)
|
onRestoreComplete(getRestoreResult(), restorableBackup)
|
||||||
closeSession()
|
closeSession()
|
||||||
|
|
|
@ -39,8 +39,8 @@ class RestoreService : Service() {
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
Log.i(TAG, "onDestroy")
|
Log.i(TAG, "onDestroy")
|
||||||
super.onDestroy()
|
|
||||||
nm.cancelRestoreNotification()
|
nm.cancelRestoreNotification()
|
||||||
|
super.onDestroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,7 +173,6 @@ internal class RestoreViewModel(
|
||||||
super.onCleared()
|
super.onCleared()
|
||||||
@OptIn(DelicateCoroutinesApi::class)
|
@OptIn(DelicateCoroutinesApi::class)
|
||||||
GlobalScope.launch(ioDispatcher) { iconManager.removeIcons() }
|
GlobalScope.launch(ioDispatcher) { iconManager.removeIcons() }
|
||||||
appDataRestoreManager.closeSession()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@UiThread
|
@UiThread
|
||||||
|
|
|
@ -270,11 +270,11 @@ internal class RestoreCoordinator(
|
||||||
* or null to indicate a transport-level error.
|
* or null to indicate a transport-level error.
|
||||||
*/
|
*/
|
||||||
suspend fun nextRestorePackage(): RestoreDescription? {
|
suspend fun nextRestorePackage(): RestoreDescription? {
|
||||||
Log.i(TAG, "Next restore package!")
|
|
||||||
val state = this.state ?: throw IllegalStateException("no state")
|
val state = this.state ?: throw IllegalStateException("no state")
|
||||||
|
|
||||||
if (!state.packages.hasNext()) return NO_MORE_PACKAGES
|
if (!state.packages.hasNext()) return NO_MORE_PACKAGES
|
||||||
val packageInfo = state.packages.next()
|
val packageInfo = state.packages.next()
|
||||||
|
Log.i(TAG, "nextRestorePackage() => ${packageInfo.packageName}")
|
||||||
val version = state.backup.version
|
val version = state.backup.version
|
||||||
if (version == 0.toByte()) return nextRestorePackageV0(state, packageInfo)
|
if (version == 0.toByte()) return nextRestorePackageV0(state, packageInfo)
|
||||||
if (version == 1.toByte()) return nextRestorePackageV1(state, packageInfo)
|
if (version == 1.toByte()) return nextRestorePackageV1(state, packageInfo)
|
||||||
|
|
|
@ -31,6 +31,7 @@ import com.stevesoltys.seedvault.R
|
||||||
import com.stevesoltys.seedvault.restore.ACTION_RESTORE_ERROR_UNINSTALL
|
import com.stevesoltys.seedvault.restore.ACTION_RESTORE_ERROR_UNINSTALL
|
||||||
import com.stevesoltys.seedvault.restore.EXTRA_PACKAGE_NAME
|
import com.stevesoltys.seedvault.restore.EXTRA_PACKAGE_NAME
|
||||||
import com.stevesoltys.seedvault.restore.REQUEST_CODE_UNINSTALL
|
import com.stevesoltys.seedvault.restore.REQUEST_CODE_UNINSTALL
|
||||||
|
import com.stevesoltys.seedvault.restore.RestoreActivity
|
||||||
import com.stevesoltys.seedvault.settings.ACTION_APP_STATUS_LIST
|
import com.stevesoltys.seedvault.settings.ACTION_APP_STATUS_LIST
|
||||||
import com.stevesoltys.seedvault.settings.SettingsActivity
|
import com.stevesoltys.seedvault.settings.SettingsActivity
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
@ -265,6 +266,9 @@ internal class BackupNotificationManager(private val context: Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getRestoreNotification() = Notification.Builder(context, CHANNEL_ID_RESTORE).apply {
|
fun getRestoreNotification() = Notification.Builder(context, CHANNEL_ID_RESTORE).apply {
|
||||||
|
val intent = Intent(context, RestoreActivity::class.java)
|
||||||
|
val pendingIntent = PendingIntent.getActivity(context, 0, intent, FLAG_IMMUTABLE)
|
||||||
|
setContentIntent(pendingIntent)
|
||||||
setSmallIcon(R.drawable.ic_cloud_restore)
|
setSmallIcon(R.drawable.ic_cloud_restore)
|
||||||
setContentTitle(context.getString(R.string.notification_restore_title))
|
setContentTitle(context.getString(R.string.notification_restore_title))
|
||||||
setOngoing(true)
|
setOngoing(true)
|
||||||
|
|
Loading…
Reference in a new issue