altoslib: Store saved state in version-independent format
[fw/altos] / altoslib / AltosPreferences.java
index b853e944bc76ffc8c4d4e186ad1e120237644748..3f8e7a070a98715ab0749a80a35a4c1b32250e85 100644 (file)
@@ -116,7 +116,7 @@ public class AltosPreferences {
        public final static String      frequency_count = "COUNT";
        public final static String      frequency_format = "FREQUENCY-%d";
        public final static String      description_format = "DESCRIPTION-%d";
-       public final static String      frequenciesPreference = "FREQUENCIES";
+       public final static String      frequenciesPreference = "FREQUENCIES-1";
 
        /* Units preference */
 
@@ -136,21 +136,33 @@ public class AltosPreferences {
 
                AltosFrequency[] frequencies = null;
 
-               frequencies = (AltosFrequency[]) backend.getSerializable(frequenciesPreference, null);
+               AltosHashSet[]  sets = AltosHashSet.array(backend.getString(frequenciesPreference,null));
+               if (sets != null) {
+                       ArrayList<AltosFrequency>       freqs = new ArrayList<AltosFrequency>();
+
+                       for (int i = 0; i < sets.length; i++) {
+                               AltosFrequency f = AltosFrequency.fromHashSet(sets[i], null);
+                               if (f != null)
+                                       freqs.add(f);
+                       }
+                       frequencies = freqs.toArray(new AltosFrequency[0]);
+               }
 
                if (frequencies == null) {
                        if (backend.nodeExists(common_frequencies_node_name)) {
                                AltosPreferencesBackend node = backend.node(common_frequencies_node_name);
                                int             count = node.getInt(frequency_count, 0);
 
-                               frequencies = new AltosFrequency[count];
-                               for (int i = 0; i < count; i++) {
-                                       double  frequency;
-                                       String  description;
+                               if (count > 0) {
+                                       frequencies = new AltosFrequency[count];
+                                       for (int i = 0; i < count; i++) {
+                                               double  frequency;
+                                               String  description;
 
-                                       frequency = node.getDouble(String.format(frequency_format, i), 0.0);
-                                       description = node.getString(String.format(description_format, i), null);
-                                       frequencies[i] = new AltosFrequency(frequency, description);
+                                               frequency = node.getDouble(String.format(frequency_format, i), 0.0);
+                                               description = node.getString(String.format(description_format, i), null);
+                                               frequencies[i] = new AltosFrequency(frequency, description);
+                                       }
                                }
                        }
                }
@@ -165,6 +177,14 @@ public class AltosPreferences {
                return frequencies;
        }
 
+       public static void save_common_frequencies() {
+               AltosHashSet[]  sets = new AltosHashSet[common_frequencies.length];
+               for (int i = 0; i < sets.length; i++)
+                       sets[i] = common_frequencies[i].hashSet();
+               backend.putString(frequenciesPreference, AltosHashSet.toString(sets));
+               flush_preferences();
+       }
+
        public static int launcher_serial;
 
        public static int launcher_channel;
@@ -353,7 +373,7 @@ public class AltosPreferences {
        public static void set_state(AltosState state) {
 
                synchronized(backend) {
-                       backend.putSerializable(String.format(statePreferenceFormat, state.serial), state);
+                       backend.putHashSet(String.format(statePreferenceFormat, state.serial), state.hashSet());
                        backend.putInt(statePreferenceLatest, state.serial);
                        flush_preferences();
                }
@@ -378,6 +398,7 @@ public class AltosPreferences {
        public static void remove_state(int serial) {
                synchronized(backend) {
                        backend.remove(String.format(statePreferenceFormat, serial));
+                       flush_preferences();
                }
        }
 
@@ -392,7 +413,7 @@ public class AltosPreferences {
        public static AltosState state(int serial) {
                synchronized(backend) {
                        try {
-                               return (AltosState) backend.getSerializable(String.format(statePreferenceFormat, serial), null);
+                               return AltosState.fromHashSet(backend.getHashSet(String.format(statePreferenceFormat, serial)));
                        } catch (Exception e) {
                                return null;
                        }
@@ -512,8 +533,8 @@ public class AltosPreferences {
        public static void set_common_frequencies(AltosFrequency[] frequencies) {
                synchronized(backend) {
                        common_frequencies = frequencies;
-                       backend.putSerializable(frequenciesPreference, frequencies);
-                       flush_preferences();
+
+                       save_common_frequencies();
                }
        }