feat: UI improvements and bug fixes

- Migrated user management to a 3-step stepper

- Redesigned Reports screen with side-by-side charts and KPIs

- Fixed timezone date formatting in Dashboard Activity logs

- Implemented custom native Android splash screen and removed flutter_native_splash
This commit is contained in:
ssbg04 committed 2026-07-15 03:01:38 +08:00
1 parent 965a3eadb5
commit 47b1821b78
16 files changed
+1396 -129

No files matched your search

@@ -13,6 +13,17 @@
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".SplashActivity"
android:exported="true"
android:theme="@style/SplashTheme"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="true"
@@ -30,10 +41,6 @@
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
@@ -0,0 +1,54 @@
package com.teamsb.tis_rms
import android.animation.ObjectAnimator
import android.animation.PropertyValuesHolder
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.animation.AccelerateDecelerateInterpolator
import android.widget.ImageView
import android.app.Activity
class SplashActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
val logoImageView = findViewById<ImageView>(R.id.splash_logo)
// Create a pulsing scale animation
val scaleDown = ObjectAnimator.ofPropertyValuesHolder(
logoImageView,
PropertyValuesHolder.ofFloat("scaleX", 0.95f),
PropertyValuesHolder.ofFloat("scaleY", 0.95f)
)
scaleDown.duration = 400
scaleDown.repeatCount = 1
scaleDown.repeatMode = ObjectAnimator.REVERSE
scaleDown.interpolator = AccelerateDecelerateInterpolator()
val scaleUp = ObjectAnimator.ofPropertyValuesHolder(
logoImageView,
PropertyValuesHolder.ofFloat("scaleX", 1.05f),
PropertyValuesHolder.ofFloat("scaleY", 1.05f)
)
scaleUp.duration = 400
scaleUp.repeatCount = 1
scaleUp.repeatMode = ObjectAnimator.REVERSE
scaleUp.interpolator = AccelerateDecelerateInterpolator()
scaleUp.startDelay = 800
scaleDown.start()
scaleUp.start()
// Proceed to MainActivity after animation finishes
Handler(Looper.getMainLooper()).postDelayed({
startActivity(Intent(this, MainActivity::class.java))
finish()
// Disable transition animation to make handoff smoother
overridePendingTransition(0, 0)
}, 1800)
}
}
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F9F9F9">
<ImageView
android:id="@+id/splash_logo"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_centerInParent="true"
android:src="@drawable/splash" />
</RelativeLayout>
@@ -16,6 +16,13 @@
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="SplashTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowSplashScreenBackground">#F9F9F9</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
<item name="android:windowSplashScreenIconBackgroundColor">#F9F9F9</item>
</style>
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
@@ -16,6 +16,11 @@
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="SplashTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">#F9F9F9</item>
<item name="android:forceDarkAllowed">false</item>
</style>
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
@@ -16,6 +16,13 @@
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="SplashTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowSplashScreenBackground">#F9F9F9</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
<item name="android:windowSplashScreenIconBackgroundColor">#F9F9F9</item>
</style>
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
@@ -16,6 +16,11 @@
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="SplashTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">#F9F9F9</item>
<item name="android:forceDarkAllowed">false</item>
</style>
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>