Browse Source

chore(android): track android app version better.

pull/79/head
isra el 9 months ago
parent
commit
61a666da35
  1. 2
      android/app/src/main/java/com/vernu/sms/AppConstants.java
  2. 16
      android/app/src/main/java/com/vernu/sms/activities/MainActivity.java
  3. 111
      android/app/src/main/java/com/vernu/sms/helpers/VersionTracker.java

2
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";
}

16
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");

111
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<RegisterDeviceResponseDTO> apiCall = ApiManager.getApiService()
.updateDevice(deviceId, apiKey, updateInput);
apiCall.enqueue(new Callback<RegisterDeviceResponseDTO>() {
@Override
public void onResponse(Call<RegisterDeviceResponseDTO> call, Response<RegisterDeviceResponseDTO> 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<RegisterDeviceResponseDTO> call, Throwable t) {
Log.e(TAG, "Error reporting version update: " + t.getMessage());
}
});
}
}
Loading…
Cancel
Save