private static void save() { SharedPreferences prefs = ApptentiveInternal.getInstance().getGlobalSharedPrefs(); JSONArray baseArray = getBaseArray(); if (baseArray != null) { prefs.edit().putString(Constants.PREF_KEY_VERSION_HISTORY_V2, baseArray.toString()).apply(); } }
public static synchronized void updateVersionHistory(int newVersionCode, String newVersionName) { updateVersionHistory(newVersionCode, newVersionName, Util.currentTimeSeconds()); }
public static synchronized VersionHistoryEntry getLastVersionSeen() { ensureLoaded(); if (versionHistoryEntries != null && !versionHistoryEntries.isEmpty()) { return versionHistoryEntries.get(versionHistoryEntries.size() - 1); } return null; }
public static void migrateV1ToV2(String oldFormat) { ApptentiveLog.i(CONVERSATION, "Migrating VersionHistoryStore V1 to V2."); ApptentiveLog.i(CONVERSATION, "V1: %s", oldFormat); try { String[] entriesOld = oldFormat.split(OLD_ENTRY_SEP); for (String entryOld : entriesOld) { String[] entryPartsOld = entryOld.split(OLD_FIELD_SEP); try { VersionHistoryStore.updateVersionHistory( Integer.parseInt(entryPartsOld[OLD_POSITION_VERSION_CODE]), entryPartsOld[OLD_POSITION_VERSION_NAME], Double.parseDouble(entryPartsOld[OLD_POSITION_TIMESTAMP]) ); } catch (Exception e) { ApptentiveLog.w(CONVERSATION, "Error migrating old version history entry: %s", entryOld); logException(e); } } ApptentiveLog.i(CONVERSATION, "V2: %s", VersionHistoryStore.getBaseArray().toString()); } catch (Exception e) { ApptentiveLog.w(CONVERSATION, "Error migrating old version history entries: %s", oldFormat); logException(e); } }
public static synchronized void updateVersionHistory(Integer newVersionCode, String newVersionName, double date) { ensureLoaded(); try { boolean exists = false; for (VersionHistoryEntry entry : versionHistoryEntries) { if (entry.getVersionCode() == newVersionCode && entry.getVersionName().equals(newVersionName)) { exists = true; } } // Only modify the store if the version hasn't been seen. if (!exists) { VersionHistoryEntry entry = new VersionHistoryEntry(newVersionCode, newVersionName, date); ApptentiveLog.v(CONVERSATION, "Adding Version History entry: %s", entry); versionHistoryEntries.add(new VersionHistoryEntry(newVersionCode, newVersionName, date)); save(); } } catch (Exception e) { ApptentiveLog.w(CONVERSATION, e, "Error updating VersionHistoryStore."); logException(e); } }
@Test public void testVersionHistoryStoreOrdering() { try { JSONArray expected = new JSONArray(loadTextAssetAsString("model/versionHistoryStore.json")); VersionHistoryStore.updateVersionHistory(1, "3.3.0", 1.472853954087E9d); VersionHistoryStore.updateVersionHistory(2, "3.3.1", 1.472854098019E9d); JSONArray result = VersionHistoryStore.getBaseArray(); boolean equal = JsonDiffer.areObjectsEqual(result, expected); if (!equal) { ApptentiveLog.e("Expected:\n%s", expected); ApptentiveLog.e("Result:\n%s", result); } assertTrue("VersionHistoryStore failed to maintain version history order.", equal); } catch (JSONException e) { assertNull(e); throw new RuntimeException("Error processing JSON in test.", e); } }
private void migrateVersionHistory() { // An existing static initializer will trigger the V1 to V2 migration of VersionHistory when VersionHistoryStore is loaded below. // Then migrate to V3, which is stored in the Conversation object. JSONArray versionHistoryOld = VersionHistoryStore.getBaseArray(); try { if (versionHistoryOld != null && versionHistoryOld.length() > 0) { VersionHistory versionHistory = conversation.getVersionHistory(); for (int i = 0; i < versionHistoryOld.length(); i++) { VersionHistoryEntry versionHistoryEntryOld = new VersionHistoryEntry((JSONObject) versionHistoryOld.get(i)); versionHistory.updateVersionHistory(versionHistoryEntryOld.getTimestamp(), versionHistoryEntryOld.getVersionCode(), versionHistoryEntryOld.getVersionName()); } } } catch (Exception e) { ApptentiveLog.w(CONVERSATION, e, "Error migrating VersionHistory entries V2 to V3."); logException(e); } }
/** * Don't use this directly. Used for debugging only. * * @return the base JSONArray */ public static JSONArray getBaseArray() { ensureLoaded(); JSONArray baseArray = new JSONArray(); for (VersionHistoryEntry entry : versionHistoryEntries) { baseArray.put(entry); } return baseArray; }
@Test public void testVersionHistoryStoreMigration() { String oldFormat = loadTextAssetAsString("model/versionHistoryStoreOld.txt"); VersionHistoryStoreMigrator.migrateV1ToV2(oldFormat); try { JSONArray expected = new JSONArray(loadTextAssetAsString("model/versionHistoryStore.json")); JSONArray result = VersionHistoryStore.getBaseArray(); boolean equal = JsonDiffer.areObjectsEqual(result, expected); if (!equal) { ApptentiveLog.e("Expected:\n%s", expected); ApptentiveLog.e("Result:\n%s", result); } assertTrue("VersionHistoryStoreMigrator migrated incorrectly.", equal); } catch (JSONException e) { assertNull(e); throw new RuntimeException("Error processing JSON in test.", e); } }
/** * Returns true if the current version or build is not the first version or build that we have seen. Basically, it just * looks for two or more versions or builds. * * @param selector - The type of version entry we are looking for: version, or build. * @return True if there are records with more than one version or build, depending on the value of selector. */ public static synchronized boolean isUpdate(Selector selector) { ensureLoaded(); Set<String> uniques = new HashSet<String>(); for (VersionHistoryEntry entry : versionHistoryEntries) { switch (selector) { case version_name: uniques.add(entry.getVersionName()); break; case version_code: uniques.add(String.valueOf(entry.getVersionCode())); break; default: break; } } return uniques.size() > 1; }
ensureLoaded(); for (VersionHistoryEntry entry : versionHistoryEntries) { switch (selector) {