Initial commit — SyncFlow Android file sync app
Supports WebDAV, SFTP, SFTPGo, Nextcloud, ownCloud, Google Drive, Dropbox, and OneDrive. Credentials encrypted with Android Keystore. Biometric app-lock, conflict resolution, and auto-sync via WorkManager. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="48dp" android:height="48dp"
|
||||
android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#0061FF"
|
||||
android:pathData="M12,0 A12,12 0 1,0 12,24 A12,12 0 1,0 12,0 Z"/>
|
||||
<group android:scaleX="0.75" android:scaleY="0.75"
|
||||
android:translateX="3" android:translateY="3">
|
||||
<path android:fillColor="#FFFFFF"
|
||||
android:pathData="M6 1.807L0 5.629l6 3.822 6.001-3.822L6 1.807zM18 1.807l-6 3.822 6 3.822 6-3.822-6-3.822zM0 13.274l6 3.822 6.001-3.822L6 9.452l-6 3.822zM18 9.452l-6 3.822 6 3.822 6-3.822-6-3.822zM6 18.371l6.001 3.822 6-3.822-6-3.822L6 18.371z"/>
|
||||
</group>
|
||||
</vector>
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="48dp" android:height="48dp"
|
||||
android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFF"
|
||||
android:pathData="M12,0 A12,12 0 1,0 12,24 A12,12 0 1,0 12,0 Z"/>
|
||||
<group android:scaleX="0.78" android:scaleY="0.78"
|
||||
android:translateX="2.64" android:translateY="2.64">
|
||||
<path android:fillColor="#34A853"
|
||||
android:pathData="M12.01 1.485c-2.082 0-3.754 0.02-3.743 0.047 0.01 0.02 1.708 3.001 3.774 6.62l3.76 6.574h3.76c2.081 0 3.753-0.02 3.742-0.047-0.005-0.02-1.708-3.001-3.775-6.62l-3.76-6.574Z"/>
|
||||
<path android:fillColor="#4285F4"
|
||||
android:pathData="M7.25 3.215a789.828 789.861 0 0 0-3.63 6.319L0 15.868l1.89 3.298 1.885 3.297 3.62-6.335 3.618-6.33-1.88-3.287C8.1 4.704 7.255 3.22 7.25 3.214Z"/>
|
||||
<path android:fillColor="#FBBC05"
|
||||
android:pathData="M9.509 15.868l-0.203 0.348c-0.114 0.198-0.96 1.672-1.88 3.287a423.93 423.948 0 0 1-1.698 2.97c-0.01 0.026 3.24 0.042 7.222 0.042h7.244l1.796-3.157c0.992-1.734 1.85-3.23 1.906-3.323l0.104-0.167h-7.249Z"/>
|
||||
</group>
|
||||
</vector>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="48dp" android:height="48dp"
|
||||
android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#0082C9"
|
||||
android:pathData="M12,0 A12,12 0 1,0 12,24 A12,12 0 1,0 12,0 Z"/>
|
||||
<group android:scaleX="0.75" android:scaleY="0.75"
|
||||
android:translateX="3" android:translateY="3">
|
||||
<path android:fillColor="#FFFFFF"
|
||||
android:pathData="M12.018 6.537c-2.5 0-4.6 1.712-5.241 4.015-0.56-1.232-1.793-2.105-3.225-2.105A3.569 3.569 0 0 0 0 12a3.569 3.569 0 0 0 3.552 3.553c1.432 0 2.664-0.874 3.224-2.106 0.641 2.304 2.742 4.016 5.242 4.016 2.487 0 4.576-1.693 5.231-3.977 0.569 1.21 1.783 2.067 3.198 2.067A3.568 3.568 0 0 0 24 12a3.569 3.569 0 0 0-3.553-3.553c-1.416 0-2.63 0.858-3.199 2.067-0.654-2.284-2.743-3.978-5.23-3.977zm0 2.085c1.878 0 3.378 1.5 3.378 3.378 0 1.878-1.5 3.378-3.378 3.378A3.362 3.362 0 0 1 8.641 12c0-1.878 1.5-3.378 3.377-3.378zm-8.466 1.91c0.822 0 1.467 0.645 1.467 1.468s-0.644 1.467-1.467 1.468A1.452 1.452 0 0 1 2.085 12c0-0.823 0.644-1.467 1.467-1.467zm16.895 0c0.823 0 1.468 0.645 1.468 1.468s-0.645 1.468-1.468 1.468A1.452 1.452 0 0 1 18.98 12c0-0.823 0.644-1.467 1.467-1.467z"/>
|
||||
</group>
|
||||
</vector>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="48dp" android:height="48dp"
|
||||
android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#0078D4"
|
||||
android:pathData="M12,0 A12,12 0 1,0 12,24 A12,12 0 1,0 12,0 Z"/>
|
||||
<group android:scaleX="0.75" android:scaleY="0.75"
|
||||
android:translateX="3" android:translateY="3">
|
||||
<path android:fillColor="#FFFFFF"
|
||||
android:pathData="M19.453 9.95q0.961 0.058 1.787 0.468 0.826 0.41 1.442 1.066 0.615 0.657 0.966 1.512 0.352 0.856 0.352 1.816 0 1.008-0.387 1.893-0.386 0.885-1.049 1.547-0.662 0.662-1.546 1.049-0.885 0.387-1.893 0.387H6q-1.242 0-2.332-0.475-1.09-0.475-1.904-1.29-0.815-0.814-1.29-1.903Q0 14.93 0 13.688q0-0.985 0.31-1.887 0.311-0.903 0.862-1.658 0.55-0.756 1.324-1.325 0.774-0.568 1.711-0.861 0.434-0.129 0.85-0.187 0.416-0.06 0.861-0.082h0.012q0.515-0.786 1.207-1.413 0.691-0.627 1.5-1.066 0.808-0.44 1.705-0.668 0.896-0.229 1.845-0.229 1.278 0 2.456 0.417 1.177 0.416 2.144 1.16 0.967 0.744 1.658 1.78 0.692 1.038 1.008 2.28z"/>
|
||||
</group>
|
||||
</vector>
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- SFTP: dark indigo circle, white terminal >_ prompt with cursor -->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="48dp" android:height="48dp"
|
||||
android:viewportWidth="48" android:viewportHeight="48">
|
||||
<path android:fillColor="#283593"
|
||||
android:pathData="M24,4 A20,20 0 1,1 24,44 A20,20 0 1,1 24,4 Z"/>
|
||||
<!-- Terminal window background -->
|
||||
<path android:fillColor="#1A237E"
|
||||
android:pathData="M9,14 Q8,14 8,15 L8,34 Q8,35 9,35 L39,35 Q40,35 40,34 L40,15 Q40,14 39,14 Z"/>
|
||||
<!-- Title bar -->
|
||||
<path android:fillColor="#283593"
|
||||
android:pathData="M9,14 L39,14 L39,19 L9,19 Z"/>
|
||||
<!-- Window control dots -->
|
||||
<path android:fillColor="#EF5350" android:pathData="M12,15.5 A1.5,1.5 0 1,1 12,18.5 A1.5,1.5 0 1,1 12,15.5 Z"/>
|
||||
<path android:fillColor="#FFA726" android:pathData="M16,15.5 A1.5,1.5 0 1,1 16,18.5 A1.5,1.5 0 1,1 16,15.5 Z"/>
|
||||
<path android:fillColor="#66BB6A" android:pathData="M20,15.5 A1.5,1.5 0 1,1 20,18.5 A1.5,1.5 0 1,1 20,15.5 Z"/>
|
||||
<!-- > prompt arrow -->
|
||||
<path android:fillColor="#FFFFFF"
|
||||
android:strokeColor="#FFFFFF"
|
||||
android:strokeWidth="1.5"
|
||||
android:strokeLineCap="round"
|
||||
android:strokeLineJoin="round"
|
||||
android:pathData="M12,23 L17,26 L12,29"/>
|
||||
<!-- _ underscore cursor -->
|
||||
<path android:fillColor="#FFFFFF"
|
||||
android:pathData="M19,29 L28,29 L28,31 L19,31 Z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- SFTPGo: teal circle, white server rack with status LEDs -->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="48dp" android:height="48dp"
|
||||
android:viewportWidth="48" android:viewportHeight="48">
|
||||
<path android:fillColor="#00796B"
|
||||
android:pathData="M24,4 A20,20 0 1,1 24,44 A20,20 0 1,1 24,4 Z"/>
|
||||
<!-- Server rack: 3 units with rounded corners -->
|
||||
<path android:fillColor="#FFFFFF"
|
||||
android:pathData="M11,12 Q10,12 10,13 L10,18 Q10,19 11,19 L37,19 Q38,19 38,18 L38,13 Q38,12 37,12 Z"/>
|
||||
<path android:fillColor="#FFFFFF"
|
||||
android:pathData="M11,21 Q10,21 10,22 L10,27 Q10,28 11,28 L37,28 Q38,28 38,27 L38,22 Q38,21 37,21 Z"/>
|
||||
<path android:fillColor="#FFFFFF"
|
||||
android:pathData="M11,30 Q10,30 10,31 L10,36 Q10,37 11,37 L37,37 Q38,37 38,36 L38,31 Q38,30 37,30 Z"/>
|
||||
<!-- Status LED dots -->
|
||||
<path android:fillColor="#00796B"
|
||||
android:pathData="M33,14 A2,2 0 1,1 33,18 A2,2 0 1,1 33,14 Z"/>
|
||||
<path android:fillColor="#00796B"
|
||||
android:pathData="M33,23 A2,2 0 1,1 33,27 A2,2 0 1,1 33,23 Z"/>
|
||||
<path android:fillColor="#00796B"
|
||||
android:pathData="M33,32 A2,2 0 1,1 33,36 A2,2 0 1,1 33,32 Z"/>
|
||||
<!-- Disk/activity bars on each unit -->
|
||||
<path android:fillColor="#00796B"
|
||||
android:pathData="M13,14.5 L27,14.5 L27,17.5 L13,17.5 Z"/>
|
||||
<path android:fillColor="#00796B"
|
||||
android:pathData="M13,23.5 L27,23.5 L27,26.5 L13,26.5 Z"/>
|
||||
<path android:fillColor="#00796B"
|
||||
android:pathData="M13,32.5 L27,32.5 L27,35.5 L13,35.5 Z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- WebDAV: blue-gray circle, white globe with grid lines -->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="48dp" android:height="48dp"
|
||||
android:viewportWidth="48" android:viewportHeight="48">
|
||||
<path android:fillColor="#37474F"
|
||||
android:pathData="M24,4 A20,20 0 1,1 24,44 A20,20 0 1,1 24,4 Z"/>
|
||||
<!-- Globe outline circle -->
|
||||
<path android:fillColor="#00000000"
|
||||
android:strokeColor="#FFFFFF"
|
||||
android:strokeWidth="2"
|
||||
android:pathData="M24,12 A12,12 0 1,1 24,36 A12,12 0 1,1 24,12 Z"/>
|
||||
<!-- Equator -->
|
||||
<path android:fillColor="#00000000"
|
||||
android:strokeColor="#FFFFFF"
|
||||
android:strokeWidth="1.5"
|
||||
android:pathData="M12,24 L36,24"/>
|
||||
<!-- Left meridian -->
|
||||
<path android:fillColor="#00000000"
|
||||
android:strokeColor="#FFFFFF"
|
||||
android:strokeWidth="1.5"
|
||||
android:pathData="M24,12 C19,16 19,32 24,36"/>
|
||||
<!-- Right meridian -->
|
||||
<path android:fillColor="#00000000"
|
||||
android:strokeColor="#FFFFFF"
|
||||
android:strokeWidth="1.5"
|
||||
android:pathData="M24,12 C29,16 29,32 24,36"/>
|
||||
<!-- Upper latitude -->
|
||||
<path android:fillColor="#00000000"
|
||||
android:strokeColor="#FFFFFF"
|
||||
android:strokeWidth="1.2"
|
||||
android:pathData="M15,19 Q24,17 33,19"/>
|
||||
<!-- Lower latitude -->
|
||||
<path android:fillColor="#00000000"
|
||||
android:strokeColor="#FFFFFF"
|
||||
android:strokeWidth="1.2"
|
||||
android:pathData="M15,29 Q24,31 33,29"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?android:attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M12,4V1L8,5l4,4V6c3.31,0 6,2.69 6,6 0,1.01-0.25,1.97-0.7,2.8l1.46,1.46C19.54,15.03 20,13.57 20,12c0-4.42-3.58-8-8-8zM12,18c-3.31,0-6,-2.69-6,-6 0,-1.01 0.25,-1.97 0.7,-2.8L5.24,7.74C4.46,8.97 4,10.43 4,12c0,4.42 3.58,8 8,8v3l4,-4-4,-4v3z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_sync"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_sync"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_sync"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_sync"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_sync"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_sync"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_sync"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_sync"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_sync"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_sync"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"client_id": "YOUR_AZURE_CLIENT_ID",
|
||||
"authorization_user_agent": "DEFAULT",
|
||||
"redirect_uri": "msauth://com.syncflow/YOUR_BASE64_SIGNATURE",
|
||||
"authorities": [
|
||||
{
|
||||
"type": "AAD",
|
||||
"audience": {
|
||||
"type": "AzureADandPersonalMicrosoftAccount"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#2196F3</color>
|
||||
</resources>
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Replace the placeholder values here with your real API keys.
|
||||
DO NOT commit real keys to source control — use a secrets manager or
|
||||
local.properties + BuildConfig injection instead.
|
||||
-->
|
||||
<resources>
|
||||
<!-- Dropbox: create an app at https://www.dropbox.com/developers/apps -->
|
||||
<string name="dropbox_app_key" translatable="false">YOUR_DROPBOX_APP_KEY</string>
|
||||
<!-- Google Drive: create OAuth 2.0 client ID at https://console.cloud.google.com -->
|
||||
<string name="google_client_id" translatable="false">YOUR_GOOGLE_CLIENT_ID</string>
|
||||
<!-- OneDrive: create app at https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps -->
|
||||
<string name="onedrive_client_id" translatable="false">YOUR_ONEDRIVE_CLIENT_ID</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">SyncFlow</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="Theme.SyncFlow" parent="Theme.AppCompat.Light.NoActionBar" />
|
||||
<style name="Theme.SyncFlow.Splash" parent="Theme.SplashScreen">
|
||||
<item name="windowSplashScreenBackground">@android:color/white</item>
|
||||
<item name="postSplashScreenTheme">@style/Theme.SyncFlow</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<full-backup-content>
|
||||
<exclude domain="database" path="syncflow.db" />
|
||||
<exclude domain="sharedpref" path="syncflow_credentials.xml" />
|
||||
</full-backup-content>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<data-extraction-rules>
|
||||
<cloud-backup>
|
||||
<exclude domain="database" path="syncflow.db" />
|
||||
<exclude domain="sharedpref" path="syncflow_credentials.xml" />
|
||||
</cloud-backup>
|
||||
<device-transfer>
|
||||
<exclude domain="database" path="syncflow.db" />
|
||||
<exclude domain="sharedpref" path="syncflow_credentials.xml" />
|
||||
</device-transfer>
|
||||
</data-extraction-rules>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths>
|
||||
<external-files-path name="external_files" path="." />
|
||||
<files-path name="internal_files" path="." />
|
||||
</paths>
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<network-security-config>
|
||||
<base-config cleartextTrafficPermitted="false" />
|
||||
</network-security-config>
|
||||
Reference in New Issue
Block a user