From 61a666da35b332e6c88dc1b6e0c34262ba21646d Mon Sep 17 00:00:00 2001 From: isra el Date: Sat, 31 May 2025 13:43:36 +0300 Subject: [PATCH] chore(android): track android app version better. --- .../main/java/com/vernu/sms/AppConstants.java | 2 + .../vernu/sms/activities/MainActivity.java | 16 +++ .../com/vernu/sms/helpers/VersionTracker.java | 111 ++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 android/app/src/main/java/com/vernu/sms/helpers/VersionTracker.java diff --git a/android/app/src/main/java/com/vernu/sms/AppConstants.java b/android/app/src/main/java/com/vernu/sms/AppConstants.java index 612c6a5..f7d0d2e 100644 --- a/android/app/src/main/java/com/vernu/sms/AppConstants.java +++ b/android/app/src/main/java/com/vernu/sms/AppConstants.java @@ -16,4 +16,6 @@ public class AppConstants { public static final String SHARED_PREFS_PREFERRED_SIM_KEY = "PREFERRED_SIM"; public static final String SHARED_PREFS_RECEIVE_SMS_ENABLED_KEY = "RECEIVE_SMS_ENABLED"; public static final String SHARED_PREFS_TRACK_SENT_SMS_STATUS_KEY = "TRACK_SENT_SMS_STATUS"; + public static final String SHARED_PREFS_LAST_VERSION_CODE_KEY = "LAST_VERSION_CODE"; + public static final String SHARED_PREFS_LAST_VERSION_NAME_KEY = "LAST_VERSION_NAME"; } 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 63c974f..6cf93bd 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 @@ -31,6 +31,7 @@ import com.vernu.sms.R; import com.vernu.sms.dtos.RegisterDeviceInputDTO; import com.vernu.sms.dtos.RegisterDeviceResponseDTO; import com.vernu.sms.helpers.SharedPreferenceHelper; +import com.vernu.sms.helpers.VersionTracker; import com.google.firebase.crashlytics.FirebaseCrashlytics; import java.util.Arrays; import java.util.Objects; @@ -84,6 +85,12 @@ public class MainActivity extends AppCompatActivity { appVersionNameTxt.setText(versionName); appVersionCodeTxt.setText(String.valueOf(BuildConfig.VERSION_CODE)); + // Check for app version changes and report if needed + if (VersionTracker.hasVersionChanged(mContext)) { + Log.d(TAG, "App version changed or first launch, reporting to server"); + VersionTracker.reportVersionToServer(mContext); + } + // Initialize Crashlytics with user information FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance(); crashlytics.setCustomKey("device_id", deviceId != null ? deviceId : "not_registered"); @@ -357,6 +364,9 @@ public class MainActivity extends AppCompatActivity { gatewaySwitch.setChecked(registerDeviceInput.isEnabled()); } + // Update stored version information + VersionTracker.updateStoredVersion(mContext); + registerDeviceBtn.setEnabled(true); registerDeviceBtn.setText("Update"); } @@ -397,6 +407,9 @@ public class MainActivity extends AppCompatActivity { gatewaySwitch.setChecked(registerDeviceInput.isEnabled()); } + // Update stored version information + VersionTracker.updateStoredVersion(mContext); + registerDeviceBtn.setEnabled(true); registerDeviceBtn.setText("Update"); } @@ -465,6 +478,9 @@ public class MainActivity extends AppCompatActivity { deviceIdEditText.setText(deviceId); } + // Update stored version information + VersionTracker.updateStoredVersion(mContext); + Snackbar.make(view, "Device Updated Successfully :)", Snackbar.LENGTH_LONG).show(); registerDeviceBtn.setEnabled(true); registerDeviceBtn.setText("Update"); diff --git a/android/app/src/main/java/com/vernu/sms/helpers/VersionTracker.java b/android/app/src/main/java/com/vernu/sms/helpers/VersionTracker.java new file mode 100644 index 0000000..4bb55b5 --- /dev/null +++ b/android/app/src/main/java/com/vernu/sms/helpers/VersionTracker.java @@ -0,0 +1,111 @@ +package com.vernu.sms.helpers; + +import android.content.Context; +import android.util.Log; + +import com.vernu.sms.ApiManager; +import com.vernu.sms.AppConstants; +import com.vernu.sms.BuildConfig; +import com.vernu.sms.dtos.RegisterDeviceInputDTO; +import com.vernu.sms.dtos.RegisterDeviceResponseDTO; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class VersionTracker { + private static final String TAG = "VersionTracker"; + + /** + * Checks if the app version has changed since the last time it was run + * @param context Application context + * @return true if version has changed, false otherwise + */ + public static boolean hasVersionChanged(Context context) { + int lastVersionCode = SharedPreferenceHelper.getSharedPreferenceInt( + context, + AppConstants.SHARED_PREFS_LAST_VERSION_CODE_KEY, + -1 + ); + + String lastVersionName = SharedPreferenceHelper.getSharedPreferenceString( + context, + AppConstants.SHARED_PREFS_LAST_VERSION_NAME_KEY, + "" + ); + + int currentVersionCode = BuildConfig.VERSION_CODE; + String currentVersionName = BuildConfig.VERSION_NAME; + + // First app launch or version changed + return lastVersionCode == -1 || + lastVersionCode != currentVersionCode || + !lastVersionName.equals(currentVersionName); + } + + /** + * Updates the stored version information with current version + * @param context Application context + */ + public static void updateStoredVersion(Context context) { + SharedPreferenceHelper.setSharedPreferenceInt( + context, + AppConstants.SHARED_PREFS_LAST_VERSION_CODE_KEY, + BuildConfig.VERSION_CODE + ); + + SharedPreferenceHelper.setSharedPreferenceString( + context, + AppConstants.SHARED_PREFS_LAST_VERSION_NAME_KEY, + BuildConfig.VERSION_NAME + ); + } + + /** + * Reports current app version to the server + * @param context Application context + */ + public static void reportVersionToServer(Context context) { + String deviceId = SharedPreferenceHelper.getSharedPreferenceString( + context, + AppConstants.SHARED_PREFS_DEVICE_ID_KEY, + "" + ); + + String apiKey = SharedPreferenceHelper.getSharedPreferenceString( + context, + AppConstants.SHARED_PREFS_API_KEY_KEY, + "" + ); + + // If device is not registered or no API key, can't report version + if (deviceId.isEmpty() || apiKey.isEmpty()) { + Log.d(TAG, "Can't report version: device not registered or no API key"); + return; + } + + RegisterDeviceInputDTO updateInput = new RegisterDeviceInputDTO(); + updateInput.setAppVersionCode(BuildConfig.VERSION_CODE); + updateInput.setAppVersionName(BuildConfig.VERSION_NAME); + + Call apiCall = ApiManager.getApiService() + .updateDevice(deviceId, apiKey, updateInput); + + apiCall.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + Log.d(TAG, "Version update reported successfully"); + updateStoredVersion(context); + } else { + Log.e(TAG, "Failed to report version update: " + response.code()); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Log.e(TAG, "Error reporting version update: " + t.getMessage()); + } + }); + } +} \ No newline at end of file