aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/res/layout
diff options
context:
space:
mode:
authorLena <lena@omega>2026-01-01 00:00:00 +0000
committerLena <lena@omega>2026-01-01 00:00:00 +0000
commit7e04941bccb2683f8a6e3ee38a99c50129234dd1 (patch)
tree471227fa437291e7a6b499e3de6c106c54eaf311 /app/src/main/res/layout
downloadrsend-7e04941bccb2683f8a6e3ee38a99c50129234dd1.tar.gz
rsend: push phone folders to a home SSH host over rsync
A small Android app for one-way folder backup, a KISS alternative to Syncthing. It bundles rsync (built from pinned source via the NDK) and a pure-Go SSH transport, both shipped in the APK as lib*.so and run from the native library directory. rsend pins the host key, stores the ed25519 identity Keystore-encrypted, pushes each folder additively or as a mirror, and runs on demand or on a WiFi-only schedule. The build is self-contained and reproducible: make setup provisions the toolchain, make builds rsync, rsh, and the APK.
Diffstat (limited to 'app/src/main/res/layout')
-rw-r--r--app/src/main/res/layout/activity_folder.xml123
-rw-r--r--app/src/main/res/layout/activity_log.xml56
-rw-r--r--app/src/main/res/layout/activity_main.xml413
-rw-r--r--app/src/main/res/layout/activity_remote.xml107
-rw-r--r--app/src/main/res/layout/activity_schedule.xml75
-rw-r--r--app/src/main/res/layout/app_toolbar.xml11
-rw-r--r--app/src/main/res/layout/dialog_key.xml40
-rw-r--r--app/src/main/res/layout/item_folder.xml48
8 files changed, 873 insertions, 0 deletions
diff --git a/app/src/main/res/layout/activity_folder.xml b/app/src/main/res/layout/activity_folder.xml
new file mode 100644
index 0000000..1a15f00
--- /dev/null
+++ b/app/src/main/res/layout/activity_folder.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/appRoot"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <include layout="@layout/app_toolbar" />
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="@dimen/space_m">
+
+ <LinearLayout
+ style="@style/Widget.Rsend.Card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption"
+ android:text="Name" />
+
+ <EditText
+ android:id="@+id/name"
+ style="@style/Widget.Rsend.EditText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:inputType="text"
+ android:hint="DCIM" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/space_m"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption"
+ android:text="Local path" />
+
+ <EditText
+ android:id="@+id/local"
+ style="@style/Widget.Rsend.EditText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:inputType="textUri"
+ android:hint="/storage/emulated/0/DCIM" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/space_m"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption"
+ android:text="Remote path" />
+
+ <EditText
+ android:id="@+id/remote"
+ style="@style/Widget.Rsend.EditText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:inputType="textUri"
+ android:hint="/backup/phone/DCIM" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/space_m"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption"
+ android:text="Excludes (comma-separated)" />
+
+ <EditText
+ android:id="@+id/excludes"
+ style="@style/Widget.Rsend.EditText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:inputType="text"
+ android:hint=".thumbnails/, .trashed/" />
+
+ <Switch
+ android:id="@+id/delete"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/space_m"
+ android:textAppearance="@style/TextAppearance.Rsend.Body"
+ android:text="Mirror (delete on server when deleted locally)" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/save"
+ style="@style/Widget.Rsend.Button.Primary"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginEnd="@dimen/space_s"
+ android:text="Save" />
+
+ <Button
+ android:id="@+id/removeFolder"
+ style="@style/Widget.Rsend.Button.Secondary"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="Remove" />
+ </LinearLayout>
+ </LinearLayout>
+ </ScrollView>
+</LinearLayout>
diff --git a/app/src/main/res/layout/activity_log.xml b/app/src/main/res/layout/activity_log.xml
new file mode 100644
index 0000000..af15ec2
--- /dev/null
+++ b/app/src/main/res/layout/activity_log.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/appRoot"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <include layout="@layout/app_toolbar" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:padding="@dimen/space_m">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:layout_marginBottom="@dimen/space_m">
+
+ <Button
+ android:id="@+id/refresh"
+ style="@style/Widget.Rsend.Button.Secondary"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginEnd="@dimen/space_s"
+ android:text="Refresh" />
+
+ <Button
+ android:id="@+id/clear"
+ style="@style/Widget.Rsend.Button.Secondary"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="Clear" />
+ </LinearLayout>
+
+ <ScrollView
+ style="@style/Widget.Rsend.Card"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+
+ <TextView
+ android:id="@+id/log"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Mono"
+ android:textSize="11sp"
+ android:textIsSelectable="true" />
+ </ScrollView>
+ </LinearLayout>
+</LinearLayout>
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..d58f907
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,413 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/appRoot"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <include layout="@layout/app_toolbar" />
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="@dimen/space_m">
+
+ <!-- Status hero -->
+ <LinearLayout
+ style="@style/Widget.Rsend.Card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center_vertical">
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textAppearance="@style/TextAppearance.Rsend.SectionHeader"
+ android:text="Status" />
+
+ <TextView
+ android:id="@+id/appVersion"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption" />
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/lastSync"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/space_s"
+ android:textAppearance="@style/TextAppearance.Rsend.Title"
+ android:textIsSelectable="true"
+ android:text="Last sync: never" />
+ </LinearLayout>
+
+ <!-- Primary action -->
+ <Button
+ android:id="@+id/btnSync"
+ style="@style/Widget.Rsend.Button.Primary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/space_m"
+ android:text="Sync now" />
+
+ <ProgressBar
+ android:id="@+id/syncBar"
+ style="?android:attr/progressBarStyleHorizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:indeterminate="true"
+ android:visibility="gone" />
+
+ <TextView
+ android:id="@+id/syncStatus"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/space_m"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption"
+ android:visibility="gone" />
+
+ <!-- Setup -->
+ <LinearLayout
+ style="@style/Widget.Rsend.Card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/space_s"
+ android:textAppearance="@style/TextAppearance.Rsend.SectionHeader"
+ android:text="Setup" />
+
+ <LinearLayout
+ android:id="@+id/rowRemote"
+ style="@style/Widget.Rsend.Row"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_marginEnd="@dimen/space_m"
+ android:src="@drawable/ic_remote"
+ android:contentDescription="@null" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Body"
+ android:text="Remote" />
+
+ <TextView
+ android:id="@+id/remoteValue"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption" />
+ </LinearLayout>
+
+ <ImageView
+ android:layout_width="20dp"
+ android:layout_height="20dp"
+ android:src="@drawable/ic_chevron"
+ android:contentDescription="@null" />
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/stroke"
+ android:layout_marginStart="40dp"
+ android:background="@color/outline" />
+
+ <LinearLayout
+ android:id="@+id/rowKey"
+ style="@style/Widget.Rsend.Row"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_marginEnd="@dimen/space_m"
+ android:src="@drawable/ic_key"
+ android:contentDescription="@null" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Body"
+ android:text="Identity key" />
+
+ <TextView
+ android:id="@+id/keyValue"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption" />
+ </LinearLayout>
+
+ <ImageView
+ android:layout_width="20dp"
+ android:layout_height="20dp"
+ android:src="@drawable/ic_chevron"
+ android:contentDescription="@null" />
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/stroke"
+ android:layout_marginStart="40dp"
+ android:background="@color/outline" />
+
+ <LinearLayout
+ android:id="@+id/rowSchedule"
+ style="@style/Widget.Rsend.Row"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_marginEnd="@dimen/space_m"
+ android:src="@drawable/ic_schedule"
+ android:contentDescription="@null" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Body"
+ android:text="Schedule" />
+
+ <TextView
+ android:id="@+id/scheduleValue"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption" />
+ </LinearLayout>
+
+ <ImageView
+ android:layout_width="20dp"
+ android:layout_height="20dp"
+ android:src="@drawable/ic_chevron"
+ android:contentDescription="@null" />
+ </LinearLayout>
+ </LinearLayout>
+
+ <!-- Permissions -->
+ <LinearLayout
+ style="@style/Widget.Rsend.Card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/space_s"
+ android:textAppearance="@style/TextAppearance.Rsend.SectionHeader"
+ android:text="Permissions" />
+
+ <LinearLayout
+ android:id="@+id/rowAllFiles"
+ style="@style/Widget.Rsend.Row"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <View
+ android:id="@+id/dotAllFiles"
+ android:layout_width="10dp"
+ android:layout_height="10dp"
+ android:layout_marginStart="7dp"
+ android:layout_marginEnd="@dimen/space_l"
+ android:background="@drawable/dot_off" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Body"
+ android:text="All-files access" />
+
+ <TextView
+ android:id="@+id/valAllFiles"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption" />
+ </LinearLayout>
+
+ <ImageView
+ android:layout_width="20dp"
+ android:layout_height="20dp"
+ android:src="@drawable/ic_chevron"
+ android:contentDescription="@null" />
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/stroke"
+ android:layout_marginStart="40dp"
+ android:background="@color/outline" />
+
+ <LinearLayout
+ android:id="@+id/rowNotif"
+ style="@style/Widget.Rsend.Row"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <View
+ android:id="@+id/dotNotif"
+ android:layout_width="10dp"
+ android:layout_height="10dp"
+ android:layout_marginStart="7dp"
+ android:layout_marginEnd="@dimen/space_l"
+ android:background="@drawable/dot_off" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Body"
+ android:text="Notifications" />
+
+ <TextView
+ android:id="@+id/valNotif"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption" />
+ </LinearLayout>
+
+ <ImageView
+ android:layout_width="20dp"
+ android:layout_height="20dp"
+ android:src="@drawable/ic_chevron"
+ android:contentDescription="@null" />
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/stroke"
+ android:layout_marginStart="40dp"
+ android:background="@color/outline" />
+
+ <LinearLayout
+ android:id="@+id/rowBattery"
+ style="@style/Widget.Rsend.Row"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <View
+ android:id="@+id/dotBattery"
+ android:layout_width="10dp"
+ android:layout_height="10dp"
+ android:layout_marginStart="7dp"
+ android:layout_marginEnd="@dimen/space_l"
+ android:background="@drawable/dot_off" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Body"
+ android:text="Battery" />
+
+ <TextView
+ android:id="@+id/valBattery"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption" />
+ </LinearLayout>
+
+ <ImageView
+ android:layout_width="20dp"
+ android:layout_height="20dp"
+ android:src="@drawable/ic_chevron"
+ android:contentDescription="@null" />
+ </LinearLayout>
+ </LinearLayout>
+
+ <!-- Folders -->
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/space_s"
+ android:layout_marginBottom="@dimen/space_s"
+ android:textAppearance="@style/TextAppearance.Rsend.SectionHeader"
+ android:text="Folders" />
+
+ <LinearLayout
+ android:id="@+id/folders"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/btnAddFolder"
+ style="@style/Widget.Rsend.Button.Secondary"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginEnd="@dimen/space_s"
+ android:text="+ Add folder" />
+
+ <Button
+ android:id="@+id/btnLog"
+ style="@style/Widget.Rsend.Button.Secondary"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="View log" />
+ </LinearLayout>
+ </LinearLayout>
+ </ScrollView>
+</LinearLayout>
diff --git a/app/src/main/res/layout/activity_remote.xml b/app/src/main/res/layout/activity_remote.xml
new file mode 100644
index 0000000..2c3ba4b
--- /dev/null
+++ b/app/src/main/res/layout/activity_remote.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/appRoot"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <include layout="@layout/app_toolbar" />
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="@dimen/space_m">
+
+ <LinearLayout
+ style="@style/Widget.Rsend.Card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption"
+ android:text="Host" />
+
+ <EditText
+ android:id="@+id/host"
+ style="@style/Widget.Rsend.EditText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:inputType="textUri"
+ android:hint="home.example.org" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/space_m"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption"
+ android:text="Port" />
+
+ <EditText
+ android:id="@+id/port"
+ style="@style/Widget.Rsend.EditText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:inputType="number"
+ android:hint="22" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/space_m"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption"
+ android:text="User" />
+
+ <EditText
+ android:id="@+id/user"
+ style="@style/Widget.Rsend.EditText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:inputType="text"
+ android:hint="backup" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/test"
+ style="@style/Widget.Rsend.Button.Secondary"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginEnd="@dimen/space_s"
+ android:text="Test connection" />
+
+ <Button
+ android:id="@+id/save"
+ style="@style/Widget.Rsend.Button.Primary"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="Save" />
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/status"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/space_m"
+ android:textAppearance="@style/TextAppearance.Rsend.Mono"
+ android:textIsSelectable="true" />
+ </LinearLayout>
+ </ScrollView>
+</LinearLayout>
diff --git a/app/src/main/res/layout/activity_schedule.xml b/app/src/main/res/layout/activity_schedule.xml
new file mode 100644
index 0000000..981d6a9
--- /dev/null
+++ b/app/src/main/res/layout/activity_schedule.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/appRoot"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <include layout="@layout/app_toolbar" />
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="@dimen/space_m">
+
+ <LinearLayout
+ style="@style/Widget.Rsend.Card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <Switch
+ android:id="@+id/enabled"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Rsend.Body"
+ android:text="Auto-sync on a schedule" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/space_m"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption"
+ android:text="Interval (minutes, minimum 1)" />
+
+ <EditText
+ android:id="@+id/interval"
+ style="@style/Widget.Rsend.EditText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:inputType="number"
+ android:hint="120" />
+
+ <Switch
+ android:id="@+id/wifiOnly"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/space_m"
+ android:textAppearance="@style/TextAppearance.Rsend.Body"
+ android:text="WiFi only (unmetered networks)" />
+
+ <Switch
+ android:id="@+id/charging"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/space_m"
+ android:textAppearance="@style/TextAppearance.Rsend.Body"
+ android:text="Only while charging" />
+ </LinearLayout>
+
+ <Button
+ android:id="@+id/save"
+ style="@style/Widget.Rsend.Button.Primary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="Save" />
+ </LinearLayout>
+ </ScrollView>
+</LinearLayout>
diff --git a/app/src/main/res/layout/app_toolbar.xml b/app/src/main/res/layout/app_toolbar.xml
new file mode 100644
index 0000000..12eeb47
--- /dev/null
+++ b/app/src/main/res/layout/app_toolbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Shared title bar. The theme is NoActionBar so each screen hosts its own
+ Toolbar; the dark overlay gives the title light text on the dark bar. -->
+<androidx.appcompat.widget.Toolbar
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="@color/bar"
+ android:elevation="4dp"
+ android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
diff --git a/app/src/main/res/layout/dialog_key.xml b/app/src/main/res/layout/dialog_key.xml
new file mode 100644
index 0000000..c2a0ed6
--- /dev/null
+++ b/app/src/main/res/layout/dialog_key.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="@dimen/space_m">
+
+ <TextView
+ android:id="@+id/keyText"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/space_m"
+ android:background="@drawable/bg_input"
+ android:padding="12dp"
+ android:textAppearance="@style/TextAppearance.Rsend.Mono"
+ android:textIsSelectable="true" />
+
+ <Button
+ android:id="@+id/btnCopyKey"
+ style="@style/Widget.Rsend.Button.Secondary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/space_s"
+ android:text="Copy public key" />
+
+ <Button
+ android:id="@+id/btnGenKey"
+ style="@style/Widget.Rsend.Button.Secondary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/space_s"
+ android:text="Generate new key" />
+
+ <Button
+ android:id="@+id/btnImportKey"
+ style="@style/Widget.Rsend.Button.Secondary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="Import private key" />
+</LinearLayout>
diff --git a/app/src/main/res/layout/item_folder.xml b/app/src/main/res/layout/item_folder.xml
new file mode 100644
index 0000000..bb5a2bf
--- /dev/null
+++ b/app/src/main/res/layout/item_folder.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/Widget.Rsend.Card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:clickable="true"
+ android:focusable="true"
+ android:foreground="?attr/selectableItemBackground">
+
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_marginEnd="@dimen/space_m"
+ android:src="@drawable/ic_folder"
+ android:contentDescription="@null" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/folderName"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:maxLines="1"
+ android:ellipsize="end"
+ android:textAppearance="@style/TextAppearance.Rsend.Title" />
+
+ <TextView
+ android:id="@+id/folderPath"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:maxLines="1"
+ android:ellipsize="end"
+ android:textAppearance="@style/TextAppearance.Rsend.Caption" />
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/folderChip"
+ style="@style/Widget.Rsend.Chip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/space_s" />
+</LinearLayout>