make app ready to release

This commit is contained in:
2026-05-06 00:45:44 +03:30
parent 805957119f
commit 1c1041ac51
21 changed files with 380 additions and 206 deletions

3
.gitignore vendored
View File

@@ -13,3 +13,6 @@
.externalNativeBuild .externalNativeBuild
.cxx .cxx
local.properties local.properties
keystore.properties
*.jks
*.keystore

View File

@@ -1,8 +1,26 @@
import java.util.Properties
plugins { plugins {
alias(libs.plugins.android.application) alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.compose)
} }
val releasePropertiesFile = rootProject.file("keystore.properties")
val releaseProperties = Properties().apply {
if (releasePropertiesFile.isFile) {
releasePropertiesFile.inputStream().use(::load)
}
}
fun releaseProperty(name: String): String? {
return releaseProperties.getProperty(name) ?: providers.environmentVariable(name).orNull
}
val releaseStoreFile = releaseProperty("POSTHUB_STORE_FILE")
val releaseStorePassword = releaseProperty("POSTHUB_STORE_PASSWORD")
val releaseKeyAlias = releaseProperty("POSTHUB_KEY_ALIAS")
val releaseKeyPassword = releaseProperty("POSTHUB_KEY_PASSWORD")
android { android {
namespace = "net.rodakot.posthub" namespace = "net.rodakot.posthub"
compileSdk { compileSdk {
@@ -16,20 +34,44 @@ android {
minSdk = 24 minSdk = 24
targetSdk = 36 targetSdk = 36
versionCode = 1 versionCode = 1
versionName = "1.0" versionName = "1.0.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }
signingConfigs {
create("release") {
if (!releaseStoreFile.isNullOrBlank()) {
storeFile = rootProject.file(releaseStoreFile)
}
storePassword = releaseStorePassword
keyAlias = releaseKeyAlias
keyPassword = releaseKeyPassword
}
}
buildTypes { buildTypes {
release { release {
isMinifyEnabled = false isMinifyEnabled = true
isShrinkResources = true
val releaseSigning = signingConfigs.getByName("release")
if (
releaseSigning.storeFile != null &&
releaseSigning.storePassword != null &&
releaseSigning.keyAlias != null &&
releaseSigning.keyPassword != null
) {
signingConfig = releaseSigning
}
proguardFiles( proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"), getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro" "proguard-rules.pro"
) )
} }
} }
lint {
abortOnError = true
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_11 sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11
@@ -55,4 +97,4 @@ dependencies {
androidTestImplementation(libs.androidx.compose.ui.test.junit4) androidTestImplementation(libs.androidx.compose.ui.test.junit4)
debugImplementation(libs.androidx.compose.ui.tooling) debugImplementation(libs.androidx.compose.ui.tooling)
debugImplementation(libs.androidx.compose.ui.test.manifest) debugImplementation(libs.androidx.compose.ui.test.manifest)
} }

View File

@@ -5,7 +5,7 @@
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<application <application
android:allowBackup="true" android:allowBackup="false"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
@@ -16,8 +16,7 @@
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"
android:label="@string/app_name" android:theme="@style/Theme.PostHUB.Starting">
android:theme="@style/Theme.PostHUB">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

View File

@@ -224,6 +224,7 @@ private val AppSections = listOf(
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.Theme_PostHUB)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {

View File

@@ -5,166 +5,25 @@
android:viewportWidth="108" android:viewportWidth="108"
android:viewportHeight="108"> android:viewportHeight="108">
<path <path
android:fillColor="#3DDC84" android:fillColor="@color/posthub_primary"
android:pathData="M0,0h108v108h-108z" /> android:pathData="M0,0h108v108h-108z" />
<path <path
android:fillColor="#00000000" android:fillColor="@color/posthub_primary_dark"
android:pathData="M9,0L9,108" android:fillAlpha="0.34"
android:strokeWidth="0.8" android:pathData="M0,0h108v38h-108z" />
android:strokeColor="#33FFFFFF" />
<path <path
android:fillColor="#00000000" android:fillColor="#00000000"
android:pathData="M19,0L19,108" android:pathData="M18,0v108M36,0v108M54,0v108M72,0v108M90,0v108"
android:strokeWidth="0.8" android:strokeColor="#24FFFFFF"
android:strokeColor="#33FFFFFF" /> android:strokeWidth="1" />
<path <path
android:fillColor="#00000000" android:fillColor="#00000000"
android:pathData="M29,0L29,108" android:pathData="M0,27h108M0,54h108M0,81h108"
android:strokeWidth="0.8" android:strokeColor="#18FFFFFF"
android:strokeColor="#33FFFFFF" /> android:strokeWidth="1" />
<path <path
android:fillColor="#00000000" android:fillColor="#00000000"
android:pathData="M39,0L39,108" android:pathData="M-6,96L96,-6M18,114L114,18"
android:strokeWidth="0.8" android:strokeColor="#14000000"
android:strokeColor="#33FFFFFF" /> android:strokeWidth="6" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector> </vector>

View File

@@ -1,30 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp" android:width="108dp"
android:height="108dp" android:height="108dp"
android:viewportWidth="108" android:viewportWidth="108"
android:viewportHeight="108"> android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path <path
android:fillColor="#FFFFFF" android:fillColor="#22000000"
android:fillType="nonZero" android:pathData="M31,25h52c5,0 9,4 9,9v46c0,5 -4,9 -9,9H31c-5,0 -9,-4 -9,-9V34c0,-5 4,-9 9,-9z" />
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" <path
android:strokeWidth="1" android:fillColor="@color/posthub_surface"
android:strokeColor="#00000000" /> android:pathData="M28,22h52c5,0 9,4 9,9v46c0,5 -4,9 -9,9H28c-5,0 -9,-4 -9,-9V31c0,-5 4,-9 9,-9z" />
</vector> <path
android:fillColor="#E3F4EF"
android:pathData="M28,22h52c5,0 9,4 9,9v9H19v-9c0,-5 4,-9 9,-9z" />
<path
android:fillColor="#00000000"
android:pathData="M28,22h52c5,0 9,4 9,9v46c0,5 -4,9 -9,9H28c-5,0 -9,-4 -9,-9V31c0,-5 4,-9 9,-9z"
android:strokeColor="@color/posthub_border"
android:strokeWidth="1.5" />
<path
android:fillColor="@color/posthub_coral"
android:pathData="M30,31m-2.7,0a2.7,2.7 0,1 0,5.4 0a2.7,2.7 0,1 0,-5.4 0" />
<path
android:fillColor="@color/posthub_amber"
android:pathData="M39,31m-2.7,0a2.7,2.7 0,1 0,5.4 0a2.7,2.7 0,1 0,-5.4 0" />
<path
android:fillColor="@color/posthub_primary"
android:pathData="M48,31m-2.7,0a2.7,2.7 0,1 0,5.4 0a2.7,2.7 0,1 0,-5.4 0" />
<path
android:fillColor="#00000000"
android:pathData="M34,51H54C62,51 62,44 69,44H77M73,40l4,4l-4,4"
android:strokeColor="@color/posthub_primary"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="4" />
<path
android:fillColor="#00000000"
android:pathData="M34,65H49C57,65 57,73 65,73H77M73,69l4,4l-4,4"
android:strokeColor="@color/posthub_coral"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="4" />
<path
android:fillColor="#00000000"
android:pathData="M34,78H60"
android:strokeColor="@color/posthub_amber"
android:strokeLineCap="round"
android:strokeWidth="4" />
<path
android:fillColor="@color/posthub_primary"
android:pathData="M34,51m-4,0a4,4 0,1 0,8 0a4,4 0,1 0,-8 0" />
<path
android:fillColor="@color/posthub_coral"
android:pathData="M34,65m-4,0a4,4 0,1 0,8 0a4,4 0,1 0,-8 0" />
</vector>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00000000"
android:pathData="M28,22h52c5,0 9,4 9,9v46c0,5 -4,9 -9,9H28c-5,0 -9,-4 -9,-9V31c0,-5 4,-9 9,-9z"
android:strokeColor="#FF000000"
android:strokeWidth="6" />
<path
android:fillColor="#FF000000"
android:pathData="M30,31m-3,0a3,3 0,1 0,6 0a3,3 0,1 0,-6 0M40,31m-3,0a3,3 0,1 0,6 0a3,3 0,1 0,-6 0M50,31m-3,0a3,3 0,1 0,6 0a3,3 0,1 0,-6 0" />
<path
android:fillColor="#00000000"
android:pathData="M34,51H54C62,51 62,44 69,44H77M73,40l4,4l-4,4M34,65H49C57,65 57,73 65,73H77M73,69l4,4l-4,4M34,78H60"
android:strokeColor="#FF000000"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="6" />
</vector>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="120dp"
android:height="120dp"
android:viewportWidth="120"
android:viewportHeight="120">
<path
android:fillColor="@color/posthub_primary"
android:pathData="M32,18h56c7.7,0 14,6.3 14,14v56c0,7.7 -6.3,14 -14,14H32c-7.7,0 -14,-6.3 -14,-14V32c0,-7.7 6.3,-14 14,-14z" />
<path
android:fillColor="#1A000000"
android:pathData="M38,28h50c4.4,0 8,3.6 8,8v45c0,4.4 -3.6,8 -8,8H38c-4.4,0 -8,-3.6 -8,-8V36c0,-4.4 3.6,-8 8,-8z" />
<path
android:fillColor="@color/posthub_surface"
android:pathData="M34,24h50c4.4,0 8,3.6 8,8v45c0,4.4 -3.6,8 -8,8H34c-4.4,0 -8,-3.6 -8,-8V32c0,-4.4 3.6,-8 8,-8z" />
<path
android:fillColor="#E3F4EF"
android:pathData="M34,24h50c4.4,0 8,3.6 8,8v9H26v-9c0,-4.4 3.6,-8 8,-8z" />
<path
android:fillColor="#00000000"
android:pathData="M40,57H58C66,57 66,49 74,49H82M78,45l4,4l-4,4M40,70H54C62,70 62,78 70,78H82M78,74l4,4l-4,4"
android:strokeColor="@color/posthub_primary"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="4.5" />
<path
android:fillColor="#00000000"
android:pathData="M40,82H62"
android:strokeColor="@color/posthub_coral"
android:strokeLineCap="round"
android:strokeWidth="4.5" />
<path
android:fillColor="@color/posthub_primary"
android:pathData="M40,57m-4.5,0a4.5,4.5 0,1 0,9 0a4.5,4.5 0,1 0,-9 0M40,70m-4.5,0a4.5,4.5 0,1 0,9 0a4.5,4.5 0,1 0,-9 0" />
</vector>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/posthub_canvas" />
</shape>
</item>
<item
android:width="132dp"
android:height="132dp"
android:drawable="@drawable/ic_splash_brand"
android:gravity="center" />
</layer-list>

View File

@@ -27,7 +27,7 @@
android:ellipsize="end" android:ellipsize="end"
android:fontFamily="sans" android:fontFamily="sans"
android:maxLines="1" android:maxLines="1"
android:text="PostHUB Flow" android:text="@string/widget_title"
android:textColor="#17201C" android:textColor="#17201C"
android:textSize="16sp" android:textSize="16sp"
android:textStyle="bold" /> android:textStyle="bold" />
@@ -38,7 +38,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:maxLines="1"
android:text="Ready" android:text="@string/widget_ready"
android:textColor="#66736D" android:textColor="#66736D"
android:textSize="12sp" /> android:textSize="12sp" />
</LinearLayout> </LinearLayout>
@@ -74,7 +74,7 @@
android:paddingTop="5dp" android:paddingTop="5dp"
android:paddingEnd="10dp" android:paddingEnd="10dp"
android:paddingBottom="5dp" android:paddingBottom="5dp"
android:text="Idle" android:text="@string/widget_idle"
android:textAlignment="center" android:textAlignment="center"
android:textColor="#006B5B" android:textColor="#006B5B"
android:textSize="11sp" android:textSize="11sp"
@@ -88,7 +88,7 @@
android:layout_weight="1" android:layout_weight="1"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:maxLines="1"
android:text="No run yet" android:text="@string/widget_no_run"
android:textColor="#66736D" android:textColor="#66736D"
android:textSize="12sp" /> android:textSize="12sp" />
</LinearLayout> </LinearLayout>
@@ -103,7 +103,7 @@
android:fontFamily="sans" android:fontFamily="sans"
android:gravity="top" android:gravity="top"
android:maxLines="4" android:maxLines="4"
android:text="Tap refresh to run the saved flow." android:text="@string/widget_empty_state"
android:textColor="#17201C" android:textColor="#17201C"
android:textSize="13sp" /> android:textSize="13sp" />

View File

@@ -2,5 +2,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" /> <background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" /> <foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" /> <monochrome android:drawable="@drawable/ic_launcher_monochrome" />
</adaptive-icon> </adaptive-icon>

View File

@@ -2,5 +2,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" /> <background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" /> <foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" /> <monochrome android:drawable="@drawable/ic_launcher_monochrome" />
</adaptive-icon> </adaptive-icon>

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="@color/posthub_primary"
android:pathData="M18,8h72c5.5,0 10,4.5 10,10v72c0,5.5 -4.5,10 -10,10H18c-5.5,0 -10,-4.5 -10,-10V18C8,12.5 12.5,8 18,8z" />
<path
android:fillColor="#0F7D6E"
android:pathData="M18,8h72c5.5,0 10,4.5 10,10v25H8V18C8,12.5 12.5,8 18,8z" />
<path
android:fillColor="@color/posthub_surface"
android:pathData="M27,24h54c4.4,0 8,3.6 8,8v45c0,4.4 -3.6,8 -8,8H27c-4.4,0 -8,-3.6 -8,-8V32c0,-4.4 3.6,-8 8,-8z" />
<path
android:fillColor="#E3F4EF"
android:pathData="M27,24h54c4.4,0 8,3.6 8,8v9H19v-9c0,-4.4 3.6,-8 8,-8z" />
<path
android:fillColor="#00000000"
android:pathData="M34,51H54C62,51 62,44 69,44H77M73,40l4,4l-4,4"
android:strokeColor="@color/posthub_primary"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="4" />
<path
android:fillColor="#00000000"
android:pathData="M34,65H49C57,65 57,73 65,73H77M73,69l4,4l-4,4"
android:strokeColor="@color/posthub_coral"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="4" />
<path
android:fillColor="#00000000"
android:pathData="M34,78H60"
android:strokeColor="@color/posthub_amber"
android:strokeLineCap="round"
android:strokeWidth="4" />
</vector>

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="@color/posthub_primary"
android:pathData="M54,4C26.4,4 4,26.4 4,54s22.4,50 50,50s50,-22.4 50,-50S81.6,4 54,4z" />
<path
android:fillColor="#0F7D6E"
android:pathData="M16,22C25.1,11 38.8,4 54,4c27.6,0 50,22.4 50,50c0,1.7 -0.1,3.3 -0.2,5H16z" />
<path
android:fillColor="@color/posthub_surface"
android:pathData="M27,24h54c4.4,0 8,3.6 8,8v45c0,4.4 -3.6,8 -8,8H27c-4.4,0 -8,-3.6 -8,-8V32c0,-4.4 3.6,-8 8,-8z" />
<path
android:fillColor="#E3F4EF"
android:pathData="M27,24h54c4.4,0 8,3.6 8,8v9H19v-9c0,-4.4 3.6,-8 8,-8z" />
<path
android:fillColor="#00000000"
android:pathData="M34,51H54C62,51 62,44 69,44H77M73,40l4,4l-4,4"
android:strokeColor="@color/posthub_primary"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="4" />
<path
android:fillColor="#00000000"
android:pathData="M34,65H49C57,65 57,73 65,73H77M73,69l4,4l-4,4"
android:strokeColor="@color/posthub_coral"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="4" />
</vector>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.PostHUB.Starting" parent="android:style/Theme.Material.Light.NoActionBar">
<item name="android:windowSplashScreenBackground">@color/posthub_canvas</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_splash_brand</item>
<item name="android:windowSplashScreenIconBackgroundColor">@color/posthub_primary</item>
<item name="android:windowBackground">@drawable/splash_window_background</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:statusBarColor">@color/posthub_canvas</item>
<item name="android:navigationBarColor">@color/posthub_canvas</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:windowLightNavigationBar">true</item>
</style>
</resources>

View File

@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="purple_200">#FFBB86FC</color> <color name="posthub_primary">#006B5B</color>
<color name="purple_500">#FF6200EE</color> <color name="posthub_primary_dark">#00483E</color>
<color name="purple_700">#FF3700B3</color> <color name="posthub_canvas">#F5F7F4</color>
<color name="teal_200">#FF03DAC5</color> <color name="posthub_surface">#FFFFFFFF</color>
<color name="teal_700">#FF018786</color> <color name="posthub_border">#DDE4DF</color>
<color name="black">#FF000000</color> <color name="posthub_coral">#D84B35</color>
<color name="white">#FFFFFFFF</color> <color name="posthub_amber">#C47A12</color>
</resources> </resources>

View File

@@ -2,4 +2,9 @@
<string name="app_name">Post HUB</string> <string name="app_name">Post HUB</string>
<string name="widget_description">Run your saved PostHUB flow from the home screen.</string> <string name="widget_description">Run your saved PostHUB flow from the home screen.</string>
<string name="widget_refresh">Refresh flow</string> <string name="widget_refresh">Refresh flow</string>
<string name="widget_title">PostHUB Flow</string>
<string name="widget_ready">Ready</string>
<string name="widget_idle">Idle</string>
<string name="widget_no_run">No run yet</string>
<string name="widget_empty_state">Tap refresh to run the saved flow.</string>
</resources> </resources>

View File

@@ -1,5 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="Theme.PostHUB" parent="android:Theme.Material.Light.NoActionBar" /> <style name="Theme.PostHUB" parent="android:style/Theme.Material.Light.NoActionBar">
</resources> <item name="android:fontFamily">sans</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:statusBarColor">@color/posthub_canvas</item>
<item name="android:navigationBarColor">@color/posthub_canvas</item>
</style>
<style name="Theme.PostHUB.Starting" parent="android:style/Theme.Material.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_window_background</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:statusBarColor">@color/posthub_canvas</item>
<item name="android:navigationBarColor">@color/posthub_canvas</item>
<item name="android:windowLightStatusBar">true</item>
</style>
</resources>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/widget_description"
android:initialLayout="@layout/widget_flow"
android:minWidth="260dp"
android:minHeight="120dp"
android:previewLayout="@layout/widget_flow"
android:resizeMode="horizontal|vertical"
android:targetCellWidth="4"
android:targetCellHeight="2"
android:updatePeriodMillis="0"
android:widgetCategory="home_screen" />

View File

@@ -4,9 +4,6 @@
android:initialLayout="@layout/widget_flow" android:initialLayout="@layout/widget_flow"
android:minWidth="260dp" android:minWidth="260dp"
android:minHeight="120dp" android:minHeight="120dp"
android:previewLayout="@layout/widget_flow"
android:resizeMode="horizontal|vertical" android:resizeMode="horizontal|vertical"
android:targetCellWidth="4"
android:targetCellHeight="2"
android:updatePeriodMillis="0" android:updatePeriodMillis="0"
android:widgetCategory="home_screen" /> android:widgetCategory="home_screen" />

56
docs/release.md Normal file
View File

@@ -0,0 +1,56 @@
# Post HUB Release Checklist
Use this checklist before publishing a new build.
## Version
Update the release numbers in `app/build.gradle.kts`:
```kotlin
versionCode = 1
versionName = "1.0.0"
```
Increase `versionCode` for every Play Store upload.
## Signing
Create an upload keystore and keep it outside git. The build reads signing values from environment variables or a local `keystore.properties` file in the project root.
```properties
POSTHUB_STORE_FILE=C:\\path\\to\\posthub-upload.jks
POSTHUB_STORE_PASSWORD=your-store-password
POSTHUB_KEY_ALIAS=posthub
POSTHUB_KEY_PASSWORD=your-key-password
```
`keystore.properties`, `*.jks`, and `*.keystore` are ignored by git.
## Build
Run these commands from the project root:
```powershell
$env:GRADLE_USER_HOME='C:\Path\To\PostHUB\.gradle'
.\gradlew.bat :app:testDebugUnitTest :app:lintRelease :app:bundleRelease --console=plain
```
Upload the generated bundle:
```text
app/build/outputs/bundle/release/app-release.aab
```
## Manual QA
Before upload, install a fresh build and verify:
- Single request Send works for GET and POST.
- Flow can capture a value, save it, and reuse it in another request.
- MCI, TCI, and IP client presets still populate requests correctly.
- Home-screen widget refresh runs the saved flow and shows the latest response.
- App launch shows the Post HUB splash and launcher icon on the emulator.
## Store Notes
Because Post HUB stores tokens and environment variables locally, Android backup is disabled in the manifest. Keep privacy copy clear that request data and saved variables stay on the device unless users send them through their own requests.