From 1c1041ac5174d82e06d7fb9bfff73711870c016b Mon Sep 17 00:00:00 2001 From: Meghdad Date: Wed, 6 May 2026 00:45:44 +0330 Subject: [PATCH] make app ready to release --- .gitignore | 3 + app/build.gradle.kts | 48 ++++- app/src/main/AndroidManifest.xml | 5 +- .../java/net/rodakot/posthub/MainActivity.kt | 1 + .../res/drawable/ic_launcher_background.xml | 167 ++---------------- .../res/drawable/ic_launcher_foreground.xml | 74 +++++--- .../res/drawable/ic_launcher_monochrome.xml | 22 +++ app/src/main/res/drawable/ic_splash_brand.xml | 35 ++++ .../res/drawable/splash_window_background.xml | 13 ++ app/src/main/res/layout/widget_flow.xml | 10 +- .../res/mipmap-anydpi-v26/ic_launcher.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 4 +- .../main/res/mipmap-anydpi/ic_launcher.xml | 39 ++++ .../res/mipmap-anydpi/ic_launcher_round.xml | 33 ++++ app/src/main/res/values-v31/themes.xml | 16 ++ app/src/main/res/values/colors.xml | 16 +- app/src/main/res/values/strings.xml | 5 + app/src/main/res/values/themes.xml | 20 ++- app/src/main/res/xml-v31/flow_widget_info.xml | 12 ++ app/src/main/res/xml/flow_widget_info.xml | 3 - docs/release.md | 56 ++++++ 21 files changed, 380 insertions(+), 206 deletions(-) create mode 100644 app/src/main/res/drawable/ic_launcher_monochrome.xml create mode 100644 app/src/main/res/drawable/ic_splash_brand.xml create mode 100644 app/src/main/res/drawable/splash_window_background.xml create mode 100644 app/src/main/res/mipmap-anydpi/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi/ic_launcher_round.xml create mode 100644 app/src/main/res/values-v31/themes.xml create mode 100644 app/src/main/res/xml-v31/flow_widget_info.xml create mode 100644 docs/release.md diff --git a/.gitignore b/.gitignore index aa724b7..ba0375d 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,6 @@ .externalNativeBuild .cxx local.properties +keystore.properties +*.jks +*.keystore diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2c90a2d..980be65 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,8 +1,26 @@ +import java.util.Properties + plugins { alias(libs.plugins.android.application) 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 { namespace = "net.rodakot.posthub" compileSdk { @@ -16,20 +34,44 @@ android { minSdk = 24 targetSdk = 36 versionCode = 1 - versionName = "1.0" + versionName = "1.0.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } + signingConfigs { + create("release") { + if (!releaseStoreFile.isNullOrBlank()) { + storeFile = rootProject.file(releaseStoreFile) + } + storePassword = releaseStorePassword + keyAlias = releaseKeyAlias + keyPassword = releaseKeyPassword + } + } + buildTypes { 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( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } + lint { + abortOnError = true + } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 @@ -55,4 +97,4 @@ dependencies { androidTestImplementation(libs.androidx.compose.ui.test.junit4) debugImplementation(libs.androidx.compose.ui.tooling) debugImplementation(libs.androidx.compose.ui.test.manifest) -} \ No newline at end of file +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7a71884..ece1bf5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,7 +5,7 @@ + android:theme="@style/Theme.PostHUB.Starting"> diff --git a/app/src/main/java/net/rodakot/posthub/MainActivity.kt b/app/src/main/java/net/rodakot/posthub/MainActivity.kt index 7edca4f..3911bb7 100644 --- a/app/src/main/java/net/rodakot/posthub/MainActivity.kt +++ b/app/src/main/java/net/rodakot/posthub/MainActivity.kt @@ -224,6 +224,7 @@ private val AppSections = listOf( class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { + setTheme(R.style.Theme_PostHUB) super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..c2a102c 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -5,166 +5,25 @@ android:viewportWidth="108" android:viewportHeight="108"> + android:fillColor="@color/posthub_primary_dark" + android:fillAlpha="0.34" + android:pathData="M0,0h108v38h-108z" /> + android:pathData="M18,0v108M36,0v108M54,0v108M72,0v108M90,0v108" + android:strokeColor="#24FFFFFF" + android:strokeWidth="1" /> + android:pathData="M0,27h108M0,54h108M0,81h108" + android:strokeColor="#18FFFFFF" + android:strokeWidth="1" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:pathData="M-6,96L96,-6M18,114L114,18" + android:strokeColor="#14000000" + android:strokeWidth="6" /> diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index 2b068d1..c865f6a 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,30 +1,56 @@ + - - - - - - - - - \ No newline at end of file + android:fillColor="#22000000" + 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" /> + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_monochrome.xml b/app/src/main/res/drawable/ic_launcher_monochrome.xml new file mode 100644 index 0000000..8a7e24e --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_monochrome.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_splash_brand.xml b/app/src/main/res/drawable/ic_splash_brand.xml new file mode 100644 index 0000000..adfdfdd --- /dev/null +++ b/app/src/main/res/drawable/ic_splash_brand.xml @@ -0,0 +1,35 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/splash_window_background.xml b/app/src/main/res/drawable/splash_window_background.xml new file mode 100644 index 0000000..aaff656 --- /dev/null +++ b/app/src/main/res/drawable/splash_window_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/widget_flow.xml b/app/src/main/res/layout/widget_flow.xml index 5c40a6f..bf63d00 100644 --- a/app/src/main/res/layout/widget_flow.xml +++ b/app/src/main/res/layout/widget_flow.xml @@ -27,7 +27,7 @@ android:ellipsize="end" android:fontFamily="sans" android:maxLines="1" - android:text="PostHUB Flow" + android:text="@string/widget_title" android:textColor="#17201C" android:textSize="16sp" android:textStyle="bold" /> @@ -38,7 +38,7 @@ android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" - android:text="Ready" + android:text="@string/widget_ready" android:textColor="#66736D" android:textSize="12sp" /> @@ -74,7 +74,7 @@ android:paddingTop="5dp" android:paddingEnd="10dp" android:paddingBottom="5dp" - android:text="Idle" + android:text="@string/widget_idle" android:textAlignment="center" android:textColor="#006B5B" android:textSize="11sp" @@ -88,7 +88,7 @@ android:layout_weight="1" android:ellipsize="end" android:maxLines="1" - android:text="No run yet" + android:text="@string/widget_no_run" android:textColor="#66736D" android:textSize="12sp" /> @@ -103,7 +103,7 @@ android:fontFamily="sans" android:gravity="top" android:maxLines="4" - android:text="Tap refresh to run the saved flow." + android:text="@string/widget_empty_state" android:textColor="#17201C" android:textSize="13sp" /> diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 6f3b755..8fde456 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -2,5 +2,5 @@ - - \ No newline at end of file + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 6f3b755..8fde456 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -2,5 +2,5 @@ - - \ No newline at end of file + + diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher.xml b/app/src/main/res/mipmap-anydpi/ic_launcher.xml new file mode 100644 index 0000000..17509e1 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi/ic_launcher.xml @@ -0,0 +1,39 @@ + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml new file mode 100644 index 0000000..9da746f --- /dev/null +++ b/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/app/src/main/res/values-v31/themes.xml b/app/src/main/res/values-v31/themes.xml new file mode 100644 index 0000000..7c51f10 --- /dev/null +++ b/app/src/main/res/values-v31/themes.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127..5845b5c 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,10 +1,10 @@ - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF - \ No newline at end of file + #006B5B + #00483E + #F5F7F4 + #FFFFFFFF + #DDE4DF + #D84B35 + #C47A12 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 92b854b..ac3a676 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,4 +2,9 @@ Post HUB Run your saved PostHUB flow from the home screen. Refresh flow + PostHUB Flow + Ready + Idle + No run yet + Tap refresh to run the saved flow. diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index cd7cb8f..1d6f41d 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,5 +1,21 @@ - + + + diff --git a/app/src/main/res/xml-v31/flow_widget_info.xml b/app/src/main/res/xml-v31/flow_widget_info.xml new file mode 100644 index 0000000..5398c3e --- /dev/null +++ b/app/src/main/res/xml-v31/flow_widget_info.xml @@ -0,0 +1,12 @@ + + diff --git a/app/src/main/res/xml/flow_widget_info.xml b/app/src/main/res/xml/flow_widget_info.xml index 5398c3e..941681c 100644 --- a/app/src/main/res/xml/flow_widget_info.xml +++ b/app/src/main/res/xml/flow_widget_info.xml @@ -4,9 +4,6 @@ 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" /> diff --git a/docs/release.md b/docs/release.md new file mode 100644 index 0000000..e933bcf --- /dev/null +++ b/docs/release.md @@ -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.