package rabbitescape.ui.android; import android.content.SharedPreferences; import java.util.HashMap; import java.util.Map; import rabbitescape.engine.config.Config; import rabbitescape.engine.config.ConfigKeys; import rabbitescape.engine.config.ConfigTools; import rabbitescape.engine.config.IConfigStorage; import rabbitescape.engine.config.IConfigUpgrade; public class AndroidConfigUpgradeTo1 implements IConfigUpgrade { @Override public void run( IConfigStorage storage ) { if ( storage instanceof IAndroidConfigStorage ) { upgradeAndroid( (IAndroidConfigStorage)storage ); storage.set( Config.CFG_VERSION, "1" ); } else { throw new RuntimeException( "Unexpected config storage type: " + storage.getClass().getSimpleName() ); } } private void upgradeAndroid( IAndroidConfigStorage storage ) { /* AndroidPreferencesBasedLevelsCompleted held your progress like this: levels.completed.01_easy = 13 levels.completed.02_medium = 3 and we must transform that to something like what ByNumberConfigBasedLevelsCompleted does: levels.completed = '{"easy":13,"medium":3}' Note also that in Android we never properly dealt with the transition from e.g. "easy" to "01_easy" so we'll fix that up here too. */ SharedPreferences prefs = storage.getPrefs(); SharedPreferences.Editor editor = prefs.edit(); boolean doneSomething = false; doneSomething = upgradeLevelsCompleted( prefs, editor ) || doneSomething; doneSomething = upgradeMuted( prefs, editor ) || doneSomething; if ( doneSomething ) { editor.commit(); } } private static boolean upgradeLevelsCompleted( SharedPreferences prefs, SharedPreferences.Editor editor ) { boolean doneSomething = false; Map<String, Integer> newMap = new HashMap<String, Integer>(); final String LEVELS_COMPLETED = "levels.completed."; for ( Map.Entry<String, ?> entry : prefs.getAll().entrySet() ) { if ( entry.getKey().startsWith( LEVELS_COMPLETED ) ) { newMap.put( stripNumber_( entry.getKey().substring( LEVELS_COMPLETED.length() ) ), (Integer)entry.getValue() ); editor.remove( entry.getKey() ); doneSomething = true; } } if ( doneSomething ) { editor.putString( ConfigKeys.CFG_LEVELS_COMPLETED, ConfigTools.mapToString( newMap ) ); } return doneSomething; } private static String stripNumber_( String levelsDir ) { return levelsDir.replaceAll( "[0-9_]", "" ); } private static boolean upgradeMuted( SharedPreferences prefs, SharedPreferences.Editor editor ) { boolean doneSomething = false; final String RABBITESCAPE_MUTED = "rabbitescape.muted"; final String MUTED = "muted"; if ( prefs.contains( RABBITESCAPE_MUTED ) ) { boolean muted = prefs.getBoolean( RABBITESCAPE_MUTED, false ); editor.remove( RABBITESCAPE_MUTED ); editor.putString( MUTED, String.valueOf( muted ) ); doneSomething = true; } return doneSomething; } }