diff --git a/mylis/android/app/build.gradle.kts b/mylis/android/app/build.gradle.kts
index d8cbe967..261b6908 100644
--- a/mylis/android/app/build.gradle.kts
+++ b/mylis/android/app/build.gradle.kts
@@ -1,11 +1,21 @@
+import java.util.Properties
+
plugins {
id("com.android.application")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
}
+val keystoreProperties =
+ Properties().apply {
+ val keystorePropertiesFile = rootProject.file("key.properties")
+ if (keystorePropertiesFile.exists()) {
+ keystorePropertiesFile.inputStream().use { load(it) }
+ }
+ }
+
android {
- namespace = "com.example.mylis"
+ namespace = "com.duidev.mylis"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
@@ -16,7 +26,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId = "com.example.mylis"
+ applicationId = "com.duidev.mylis"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
@@ -25,11 +35,20 @@ android {
versionName = flutter.versionName
}
+ signingConfigs {
+ create("release") {
+ keyAlias = keystoreProperties["keyAlias"] as String?
+ keyPassword = keystoreProperties["keyPassword"] as String?
+ storeFile = (keystoreProperties["storeFile"] as String?)?.let {
+ file(it)
+ }
+ storePassword = keystoreProperties["storePassword"] as String?
+ }
+ }
+
buildTypes {
release {
- // TODO: Add your own signing config for the release build.
- // Signing with the debug keys for now, so `flutter run --release` works.
- signingConfig = signingConfigs.getByName("debug")
+ signingConfig = signingConfigs.getByName("release")
}
}
}
diff --git a/mylis/android/app/google-services.json b/mylis/android/app/google-services.json
new file mode 100644
index 00000000..2b25f375
--- /dev/null
+++ b/mylis/android/app/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "732589737888",
+ "project_id": "mylis-a4983",
+ "storage_bucket": "mylis-a4983.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:732589737888:android:3f782e07e62ace55a446c5",
+ "android_client_info": {
+ "package_name": "com.duidev.mylis"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyAibwJgxVnkVOOIGsjbf2SpW_isJOFTtAg"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/mylis/android/app/src/main/kotlin/com/example/mylis/MainActivity.kt b/mylis/android/app/src/main/kotlin/com/duidev/mylis/MainActivity.kt
similarity index 78%
rename from mylis/android/app/src/main/kotlin/com/example/mylis/MainActivity.kt
rename to mylis/android/app/src/main/kotlin/com/duidev/mylis/MainActivity.kt
index 248b3fcb..067728bf 100644
--- a/mylis/android/app/src/main/kotlin/com/example/mylis/MainActivity.kt
+++ b/mylis/android/app/src/main/kotlin/com/duidev/mylis/MainActivity.kt
@@ -1,4 +1,4 @@
-package com.example.mylis
+package com.duidev.mylis
import io.flutter.embedding.android.FlutterActivity
diff --git a/mylis/android/build/reports/problems/problems-report.html b/mylis/android/build/reports/problems/problems-report.html
new file mode 100644
index 00000000..8cbf7496
--- /dev/null
+++ b/mylis/android/build/reports/problems/problems-report.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Gradle Configuration Cache
+
+
+
+
+
+
+ Loading...
+
+
+
+
+
+
+
diff --git a/mylis/ios/Runner.xcodeproj/project.pbxproj b/mylis/ios/Runner.xcodeproj/project.pbxproj
index 4c9cb0f9..4b82eba1 100644
--- a/mylis/ios/Runner.xcodeproj/project.pbxproj
+++ b/mylis/ios/Runner.xcodeproj/project.pbxproj
@@ -383,7 +383,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.example.mylis;
+ PRODUCT_BUNDLE_IDENTIFIER = com.duidev.mylis;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -399,7 +399,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.example.mylis.RunnerTests;
+ PRODUCT_BUNDLE_IDENTIFIER = com.duidev.mylis.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -416,7 +416,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.example.mylis.RunnerTests;
+ PRODUCT_BUNDLE_IDENTIFIER = com.duidev.mylis.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@@ -431,7 +431,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.example.mylis.RunnerTests;
+ PRODUCT_BUNDLE_IDENTIFIER = com.duidev.mylis.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@@ -563,7 +563,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.example.mylis;
+ PRODUCT_BUNDLE_IDENTIFIER = com.duidev.mylis;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -586,7 +586,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.example.mylis;
+ PRODUCT_BUNDLE_IDENTIFIER = com.duidev.mylis;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
diff --git a/mylis/lib/screens/login/login_screen.dart b/mylis/lib/screens/login/login_screen.dart
index d509e30f..32294032 100644
--- a/mylis/lib/screens/login/login_screen.dart
+++ b/mylis/lib/screens/login/login_screen.dart
@@ -20,11 +20,13 @@ class _LoginScreenState extends State {
@override
void initState() {
super.initState();
- SessionStore.baseUrl().then((value) {
+ SessionStore.session().then((value) {
if (!mounted) {
return;
}
- _baseUrl.text = value;
+ _baseUrl.text = value.baseUrl;
+ _username.text = value.username ?? '';
+ _password.text = value.password ?? '';
});
}
@@ -43,7 +45,6 @@ class _LoginScreenState extends State {
setState(() => _loading = true);
try {
final serverUrl = normalizeBaseUrl(_baseUrl.text);
- await SessionStore.saveBaseUrl(serverUrl);
final api = ApiClient(baseUrl: serverUrl);
final data = await api.post('api/mobile/login', {
'username': _username.text.trim(),
@@ -53,7 +54,12 @@ class _LoginScreenState extends State {
if (token == null || token.isEmpty) {
throw ApiException('Token login tidak diterima dari server.');
}
- await SessionStore.saveToken(token);
+ await SessionStore.saveLogin(
+ baseUrl: serverUrl,
+ token: token,
+ username: _username.text.trim(),
+ password: _password.text,
+ );
if (!mounted) {
return;
}
diff --git a/mylis/lib/services/api_client.dart b/mylis/lib/services/api_client.dart
index 0bb3b8ed..47d0d9b6 100644
--- a/mylis/lib/services/api_client.dart
+++ b/mylis/lib/services/api_client.dart
@@ -4,7 +4,7 @@ class ApiClient {
ApiClient({required this.baseUrl, this.token});
final String baseUrl;
- final String? token;
+ String? token;
Uri _uri(String path, [Map? query]) {
final normalizedBase = normalizeBaseUrl(baseUrl);
@@ -25,12 +25,55 @@ class ApiClient {
String path,
Map body,
) async {
- final uri = _uri(path);
+ return _sendWithRenew(
+ path,
+ (client, uri) => client
+ .post(uri, headers: _headers, body: jsonEncode(body))
+ .timeout(const Duration(seconds: 15)),
+ );
+ }
+
+ Future