demo transaksi

This commit is contained in:
2026-04-01 11:55:47 +07:00
parent 619d758027
commit 7417222c79
166 changed files with 3111 additions and 5265 deletions

View File

@@ -3,15 +3,25 @@ apply plugin: 'realm-android'
apply plugin: 'kotlin-android'
//apply plugin: 'kotlin-android-extensions'
// Native apps previously hard-required `ontimekeystore.jks` (not committed in this repo).
// Fallback to the standard Android debug keystore so builds can still produce APKs locally.
def ontimeKeystoreFile = file('ontimekeystore.jks')
def defaultDebugKeystoreFile = file("${System.getProperty('user.home')}/.android/debug.keystore")
def hasOntimeKeystore = ontimeKeystoreFile.exists()
def signingStoreFile = hasOntimeKeystore ? ontimeKeystoreFile : defaultDebugKeystoreFile
def signingStorePassword = hasOntimeKeystore ? '123456@ontime' : 'android'
def signingKeyAlias = hasOntimeKeystore ? 'ontimekeystore' : 'androiddebugkey'
def signingKeyPassword = hasOntimeKeystore ? '123456@ontime' : 'android'
android {
namespace "id.ontime.customer"
signingConfigs {
debug {
// Use local ontime keystore (make sure this file exists in the app module)
storeFile file('ontimekeystore.jks')
storePassword '123456@ontime'
keyAlias 'ontimekeystore'
keyPassword '123456@ontime'
storeFile signingStoreFile
storePassword signingStorePassword
keyAlias signingKeyAlias
keyPassword signingKeyPassword
}
}
compileSdk 34

View File

@@ -546,7 +546,7 @@ public class LoginActivity extends AppCompatActivity {
}
request.setPassword(password.getText().toString());
// FCM token is required: prefer cached token from Realm, otherwise fetch a fresh one.
// Best effort FCM token: prefer cached token, otherwise fetch a fresh one.
Realm realm = BaseApp.getInstance(this).getRealmInstance();
FirebaseToken storedToken = realm.where(FirebaseToken.class).findFirst();
if (storedToken != null && storedToken.getTokenId() != null && !storedToken.getTokenId().isEmpty()) {
@@ -569,15 +569,13 @@ public class LoginActivity extends AppCompatActivity {
});
doLoginRequest(request, emailText);
} else {
progresshide();
Log.e(TAG, "FCM getToken failed: " + (task.getException() != null ? task.getException().getMessage() : "empty token"));
notif(getString(R.string.fcm_token_required));
Log.w(TAG, "FCM getToken not ready, continue login without token");
doLoginRequest(request, emailText);
}
});
} catch (IllegalStateException e) {
progresshide();
Log.e(TAG, "FirebaseMessaging not available; FCM token is required", e);
notif(getString(R.string.fcm_token_required));
Log.w(TAG, "FirebaseMessaging unavailable during login, continue without token", e);
doLoginRequest(request, emailText);
}
}
@@ -620,19 +618,24 @@ public class LoginActivity extends AppCompatActivity {
notif(showMsg);
}
} else {
String errMsg = "Login failed";
String errMsg = getString(R.string.phoneemailwrong);
try {
if (response.errorBody() != null) {
String errBody = response.errorBody().string();
Log.e(TAG, "Login error body: code=" + code + " body=" + (errBody != null ? errBody : "null"));
if (errBody != null && !errBody.isEmpty()) errMsg = errBody;
if (errBody != null && !errBody.isEmpty()) {
String low = errBody.toLowerCase();
if (!(low.contains("wrong") || low.contains("salah") || low.contains("not found") || low.contains("unauthorized"))) {
errMsg = errBody;
}
}
} else {
Log.e(TAG, "Login error: code=" + code + " no error body");
}
} catch (Exception e) {
Log.e(TAG, "Login error reading body", e);
}
if (code == 401) errMsg = getString(R.string.phoneemailwrong);
if (code == 400 || code == 401 || code == 403) errMsg = getString(R.string.phoneemailwrong);
notif(errMsg);
}
}

View File

@@ -837,16 +837,14 @@ public class RegisterActivity extends AppCompatActivity {
request.setCountrycode(countryCode.getText().toString());
request.setChecked(check);
// FCM v1: get token async then register (token is mandatory)
// FCM v1: best effort token fetch before register.
try {
FirebaseMessaging.getInstance().getToken().addOnCompleteListener(task -> {
if (task.isSuccessful() && task.getResult() != null && !task.getResult().isEmpty()) {
request.setToken(task.getResult());
} else {
progresshide();
Log.e("RegisterActivity", "FCM getToken failed for register: " + (task.getException() != null ? task.getException().getMessage() : "empty token"));
notif(getString(R.string.fcm_token_required));
return;
Log.w("RegisterActivity", "FCM getToken not ready, continue register without token");
request.setToken("");
}
UserService service = ServiceGenerator.createService(UserService.class, request.getEmail(), request.getPassword());
service.register(request).enqueue(new Callback<RegisterResponseJson>() {
@@ -884,9 +882,42 @@ public class RegisterActivity extends AppCompatActivity {
});
});
} catch (IllegalStateException e) {
progresshide();
Log.e("RegisterActivity", "FirebaseMessaging not available; FCM token is required for register", e);
notif(getString(R.string.fcm_token_required));
Log.w("RegisterActivity", "FirebaseMessaging unavailable during register, continue without token", e);
request.setToken("");
UserService service = ServiceGenerator.createService(UserService.class, request.getEmail(), request.getPassword());
service.register(request).enqueue(new Callback<RegisterResponseJson>() {
@Override
public void onResponse(@NonNull Call<RegisterResponseJson> call, @NonNull Response<RegisterResponseJson> response) {
progresshide();
if (response.isSuccessful()) {
if (Objects.requireNonNull(response.body()).getMessage().equalsIgnoreCase("next")) {
Nextbtn(viewFlipper);
} else if (response.body().getMessage().equalsIgnoreCase("success")) {
User user = response.body().getData().get(0);
saveUser(user);
registerPanic();
Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
} else {
notif(response.body().getMessage());
}
} else {
notif("error");
}
}
@Override
public void onFailure(@NonNull Call<RegisterResponseJson> call, @NonNull Throwable t) {
progresshide();
t.printStackTrace();
notif("error!");
}
});
}
}

View File

@@ -43,7 +43,9 @@ public class BaseApp extends Application {
// FCM v1: async token fetch and topic subscribe (reference: test app LoginActivity).
try {
FirebaseApp app = FirebaseApp.initializeApp(this);
FirebaseApp app = FirebaseApp.getApps(this).isEmpty()
? FirebaseApp.initializeApp(this)
: FirebaseApp.getInstance();
if (app != null) {
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(task -> {