From 56fb4b2945d9289d68b9bcc3229cec9d0e6bc622 Mon Sep 17 00:00:00 2001 From: isra el Date: Wed, 28 May 2025 12:34:08 +0300 Subject: [PATCH 1/4] fix(android): improve device registration and update logic --- .../vernu/sms/activities/MainActivity.java | 66 ++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/com/vernu/sms/activities/MainActivity.java b/android/app/src/main/java/com/vernu/sms/activities/MainActivity.java index 67c5f39..b9c2800 100644 --- a/android/app/src/main/java/com/vernu/sms/activities/MainActivity.java +++ b/android/app/src/main/java/com/vernu/sms/activities/MainActivity.java @@ -151,7 +151,14 @@ public class MainActivity extends AppCompatActivity { }); // TODO: check gateway status/api key/device validity and update UI accordingly - registerDeviceBtn.setOnClickListener(view -> handleRegisterDevice()); + registerDeviceBtn.setOnClickListener(view -> { + String _deviceId = SharedPreferenceHelper.getSharedPreferenceString(mContext, AppConstants.SHARED_PREFS_DEVICE_ID_KEY, ""); + if (_deviceId == null || _deviceId.isEmpty()) { + handleRegisterDevice(); + } else { + handleUpdateDevice(); + } + }); scanQRBtn.setOnClickListener(view -> { IntentIntegrator intentIntegrator = new IntentIntegrator(MainActivity.this); intentIntegrator.setPrompt("Go to textbee.dev/dashboard and click Register Device to generate QR Code"); @@ -278,6 +285,63 @@ public class MainActivity extends AppCompatActivity { }); } + private void handleUpdateDevice() { + String apiKey = apiKeyEditText.getText().toString(); + registerDeviceBtn.setEnabled(false); + registerDeviceBtn.setText("Loading..."); + View view = findViewById(R.id.registerDeviceBtn); + + FirebaseMessaging.getInstance().getToken() + .addOnCompleteListener(task -> { + if (!task.isSuccessful()) { + Snackbar.make(view, "Failed to obtain FCM Token :(", Snackbar.LENGTH_LONG).show(); + registerDeviceBtn.setEnabled(true); + registerDeviceBtn.setText("Update"); + return; + } + String token = task.getResult(); + fcmTokenEditText.setText(token); + + RegisterDeviceInputDTO updateDeviceInput = new RegisterDeviceInputDTO(); + updateDeviceInput.setEnabled(true); + updateDeviceInput.setFcmToken(token); + updateDeviceInput.setBrand(Build.BRAND); + updateDeviceInput.setManufacturer(Build.MANUFACTURER); + updateDeviceInput.setModel(Build.MODEL); + updateDeviceInput.setBuildId(Build.ID); + updateDeviceInput.setOs(Build.VERSION.BASE_OS); + updateDeviceInput.setAppVersionCode(BuildConfig.VERSION_CODE); + updateDeviceInput.setAppVersionName(BuildConfig.VERSION_NAME); + + Call apiCall = ApiManager.getApiService().updateDevice(deviceId, apiKey, updateDeviceInput); + apiCall.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + Log.d(TAG, response.toString()); + if (!response.isSuccessful()) { + Snackbar.make(view, response.message(), Snackbar.LENGTH_LONG).show(); + registerDeviceBtn.setEnabled(true); + registerDeviceBtn.setText("Update"); + return; + } + SharedPreferenceHelper.setSharedPreferenceString(mContext, AppConstants.SHARED_PREFS_API_KEY_KEY, apiKey); + Snackbar.make(view, "Device Updated Successfully :)", Snackbar.LENGTH_LONG).show(); + registerDeviceBtn.setEnabled(true); + registerDeviceBtn.setText("Update"); + } + + @Override + public void onFailure(Call call, Throwable t) { + Snackbar.make(view, "An error occurred :(", Snackbar.LENGTH_LONG).show(); + Log.e(TAG, "API_ERROR "+ t.getMessage()); + Log.e(TAG, "API_ERROR "+ t.getLocalizedMessage()); + registerDeviceBtn.setEnabled(true); + registerDeviceBtn.setText("Update"); + } + }); + }); + } + private void handleRequestPermissions(View view) { boolean allPermissionsGranted = Arrays.stream(AppConstants.requiredPermissions).allMatch(permission -> TextBeeUtils.isPermissionGranted(mContext, permission)); if (allPermissionsGranted) { From 2809d2bd51f2c2c9ebc07ab275bb200cc658bd7c Mon Sep 17 00:00:00 2001 From: isra el Date: Wed, 28 May 2025 12:38:33 +0300 Subject: [PATCH 2/4] chore(api): disable updating existing device with same model and buildId in register device api --- api/src/gateway/gateway.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/gateway/gateway.service.ts b/api/src/gateway/gateway.service.ts index e47cc92..3866c36 100644 --- a/api/src/gateway/gateway.service.ts +++ b/api/src/gateway/gateway.service.ts @@ -43,7 +43,7 @@ export class GatewayService { buildId: input.buildId, }) - if (device) { + if (device && device.appVersionCode <= 11) { return await this.updateDevice(device._id.toString(), { ...input, enabled: true, From ce4ec6820c6c560d81d77330cbfb1104bd7393fa Mon Sep 17 00:00:00 2001 From: isra el Date: Wed, 28 May 2025 12:39:08 +0300 Subject: [PATCH 3/4] chore(android): bump android version --- android/app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index bb722e7..17449c6 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.vernu.sms" minSdk 24 targetSdk 32 - versionCode 11 - versionName "2.3.1" + versionCode 12 + versionName "2.5.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From 3aa6740ffe483c3f93fa8f2c983b0b14af4a1f81 Mon Sep 17 00:00:00 2001 From: isra el Date: Wed, 28 May 2025 12:43:49 +0300 Subject: [PATCH 4/4] fix(api): fix failing tests --- api/src/gateway/gateway.service.spec.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/src/gateway/gateway.service.spec.ts b/api/src/gateway/gateway.service.spec.ts index e6bf87a..71011ad 100644 --- a/api/src/gateway/gateway.service.spec.ts +++ b/api/src/gateway/gateway.service.spec.ts @@ -150,6 +150,8 @@ describe('GatewayService', () => { _id: 'device123', ...mockDeviceInput, user: mockUser._id, + // TODO: add more tests for different app version codes + appVersionCode: 11, } it('should update device if it already exists', async () => {