Skip to content

Commit

Permalink
SFTP sync added!
Browse files Browse the repository at this point in the history
  • Loading branch information
Eboreg committed Jun 16, 2023
1 parent 8bcdb69 commit 7bf48b6
Show file tree
Hide file tree
Showing 58 changed files with 2,082 additions and 1,439 deletions.
3 changes: 3 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@ dependencies {
// HTML parsing:
implementation("org.jsoup:jsoup:1.16.1")

// SFTP:
implementation(group = "com.github.mwiede", name = "jsch", version = "0.2.9")

// testImplementation("junit:junit:4.13.2")
// androidTestImplementation("androidx.test.ext:junit:1.1.5")
// androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
Expand Down
16 changes: 11 additions & 5 deletions app/src/main/java/us/huseli/retain/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,22 @@ object Constants {
const val DEFAULT_MAX_IMAGE_DIMEN = 2048
const val DEFAULT_MIN_COLUMN_WIDTH = 180
const val IMAGE_SUBDIR = "images"
const val NAV_ARG_NOTE_ID = "noteId"
const val NAV_ARG_IMAGE_CAROUSEL_CURRENT_ID = "imageCarouselCurrentId"
const val NAV_ARG_NOTE_ID = "noteId"
const val NEXTCLOUD_BASE_DIR = "/.retain"
const val NEXTCLOUD_IMAGE_SUBDIR = "images"
const val NEXTCLOUD_JSON_SUBDIR = "json"
const val PREF_MIN_COLUMN_WIDTH = "minColumnWidth"
const val PREF_NEXTCLOUD_PASSWORD = "nextCloudPassword"
const val PREF_NEXTCLOUD_BASE_DIR = "nextCloudBaseDir"
const val PREF_NEXTCLOUD_PASSWORD = "nextCloudPassword"
const val PREF_NEXTCLOUD_URI = "nextCloudUri"
const val PREF_NEXTCLOUD_USERNAME = "nextCloudUsername"
const val PREF_NEXTCLOUD_ENABLED = "nextCloudEnabled"
const val PREF_SFTP_BASE_DIR = "sftpBaseDir"
const val PREF_SFTP_HOSTNAME = "sftpHostname"
const val PREF_SFTP_PASSWORD = "sftpPassword"
const val PREF_SFTP_PORT = "sftpPort"
const val PREF_SFTP_USERNAME = "sftpUsername"
const val PREF_SYNC_BACKEND = "syncBackend"
const val SFTP_BASE_DIR = ".retain"
const val SYNCBACKEND_IMAGE_SUBDIR = "images"
const val SYNCBACKEND_JSON_SUBDIR = "json"
const val ZIP_BUFFER_SIZE = 2048
}
5 changes: 5 additions & 0 deletions app/src/main/java/us/huseli/retain/Enums.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,9 @@ object Enums {
enum class NoteType { TEXT, CHECKLIST }
enum class Side { LEFT, RIGHT }
enum class HomeScreenViewType { LIST, GRID }
enum class SyncBackend(val displayName: String) {
NONE("None"),
NEXTCLOUD("Nextcloud"),
SFTP("SFTP"),
}
}
18 changes: 11 additions & 7 deletions app/src/main/java/us/huseli/retain/compose/HomeScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,9 @@ fun HomeScreen(
onSettingsClick: () -> Unit,
onDebugClick: () -> Unit,
) {
val isNextCloudRefreshing by viewModel.isNextCloudRefreshing.collectAsStateWithLifecycle(false)
val isNextCloudEnabled by settingsViewModel.isNextCloudEnabled.collectAsStateWithLifecycle()
val syncBackend by viewModel.syncBackend.collectAsStateWithLifecycle()
val isSyncBackendRefreshing by viewModel.isSyncBackendRefreshing.collectAsStateWithLifecycle(false)
val isSyncBackendEnabled by settingsViewModel.isSyncBackendEnabled.collectAsStateWithLifecycle(false)
val notes by viewModel.notes.collectAsStateWithLifecycle(emptyList())
val images by viewModel.images.collectAsStateWithLifecycle(emptyList())
val checklistData by viewModel.checklistData.collectAsStateWithLifecycle(emptyList())
Expand All @@ -78,10 +79,10 @@ fun HomeScreen(
}
.fillMaxHeight()

if (isNextCloudEnabled) {
if (isSyncBackendEnabled) {
val refreshState = rememberPullRefreshState(
refreshing = isNextCloudRefreshing,
onRefresh = { viewModel.syncNextCloud() },
refreshing = isSyncBackendRefreshing,
onRefresh = { viewModel.syncBackend() },
)
lazyModifier = lazyModifier.pullRefresh(state = refreshState)
}
Expand Down Expand Up @@ -155,14 +156,17 @@ fun HomeScreen(
}

Column(modifier = lazyModifier.padding(innerPadding).fillMaxWidth()) {
if (isNextCloudRefreshing) {
if (isSyncBackendRefreshing) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = stringResource(R.string.syncing_with_nextcloud),
text = stringResource(
R.string.syncing_with,
syncBackend?.displayName ?: stringResource(R.string.backend)
),
style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(end = 4.dp),
)
Expand Down
10 changes: 4 additions & 6 deletions app/src/main/java/us/huseli/retain/compose/RetainScaffold.kt
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ fun RetainScaffold(
content: @Composable (PaddingValues) -> Unit
) {
val context = LocalContext.current
val nextCloudNeedsTesting by settingsViewModel.nextCloudNeedsTesting.collectAsStateWithLifecycle()
val syncBackendNeedsTesting by settingsViewModel.syncBackendNeedsTesting.collectAsStateWithLifecycle()
val snackbarMessage by viewModel.logger.snackbarMessage.collectAsStateWithLifecycle(null)
val scope = rememberCoroutineScope()
val trashedNoteCount by viewModel.trashedNoteCount.collectAsStateWithLifecycle(0)
Expand Down Expand Up @@ -79,11 +79,9 @@ fun RetainScaffold(
}
}

LaunchedEffect(nextCloudNeedsTesting) {
if (nextCloudNeedsTesting) settingsViewModel.testNextCloud { result ->
scope.launch {
if (!result.success) snackbarHostState.showSnackbar(result.getErrorMessage(context))
}
LaunchedEffect(syncBackendNeedsTesting) {
if (syncBackendNeedsTesting) settingsViewModel.testSyncBackend { result ->
if (!result.success) scope.launch { snackbarHostState.showSnackbar(result.getErrorMessage(context)) }
}
}

Expand Down
Loading

0 comments on commit 7bf48b6

Please sign in to comment.