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" 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) { 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 () => { 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,