Search code examples
androidsettingslive-wallpaperrajawali

Live wallpaper settings not applying


I have added settings to my live wallpaper but they are not being applied when changed. I would greatly appreciate it if someone could tell me why my settings are not being applied when changed. Here is my code:

settings.xml

       <PreferenceCategory android:title="@string/more">
        <PreferenceScreen android:title="@string/more">
            <intent android:action="android.intent.action.VIEW" 
           android:data="market://search?q=pub:PSP Demo Center" />
         </PreferenceScreen>
         <ListPreference 
            android:persistent="true" 
            android:enabled="true" 
            android:entries="@array/settings_light_number_options" 
            android:title="@string/settings_light_number" 
            android:key="light_power" 
            android:summary="@string/settings_light_number_summary" 
            android:defaultValue="3" 
            android:entryValues="@array/settings_light_number_optionvalues" />
         <ListPreference 
            android:persistent="true" 
            android:enabled="false" 
            android:entries="@array/settings_speed_number_options" 
            android:title="@string/settings_speed_number" 
            android:key="speed" 
            android:summary="@string/settings_speed_number_summary" 
            android:defaultValue="10" 
            android:entryValues="@array/settings_speed_number_optionvalues" />  
        <ListPreference 
            android:persistent="true" 
            android:enabled="false" 
            android:entries="@array/settings_rotate_number_options" 
            android:title="@string/settings_rotate_number" 
            android:key="rotate" 
            android:summary="@string/settings_rotate_number_summary" 
            android:defaultValue="8000" 
            android:entryValues="@array/settings_rotate_number_optionvalues" />

    </PreferenceCategory>

</PreferenceScreen>

Settings.java

    public class GraffitiLWPSettings extends PreferenceActivity 
              implements SharedPreferences
              .OnSharedPreferenceChangeListener {
    public static final String SHARED_PREFS_NAME = "wallpaper_settings";


    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        getPreferenceManager().
            setSharedPreferencesName(GraffitiLWP.SHARED_PREFS_NAME);
        addPreferencesFromResource(R.xml.settings);
        getPreferenceManager().getSharedPreferences().
            registerOnSharedPreferenceChangeListener(this);
    }

    protected void onResume() {
        super.onResume();
    }

    protected void onDestroy() {
        getPreferenceManager().getSharedPreferences()
            .unregisterOnSharedPreferenceChangeListener(this);
        super.onDestroy();
    }

    public void onSharedPreferenceChanged(SharedPreferences 
            sharedPreferences, String key) {
    }
}

wallpaper.java

    public class GraffitiLWP extends Wallpaper {
    private GraffitiLWPRenderer mRenderer;
    public static final String SHARED_PREFS_NAME = "wallpaper_settings";
    public Engine onCreateEngine() {
        mRenderer = new GraffitiLWPRenderer(this);
        return new WallpaperEngine(
            this.getSharedPreferences(SHARED_PREFS_NAME,
        Context.MODE_PRIVATE), getBaseContext(), mRenderer);
    }
}

renderer.java

    public class GraffitiLWPRenderer extends RajawaliRenderer {
    private Animation3D mAnim;
    private BaseObject3D mCan;
    private SettingsUpdater settingsUpdater;
    //private SharedPreferences preferences;


    public GraffitiLWPRenderer(Context context) {
        super(context);
        setFrameRate(20);
    }

    public class SettingsUpdater implements SharedPreferences
             .OnSharedPreferenceChangeListener {
        private GraffitiLWPRenderer renderer;

        public SettingsUpdater(GraffitiLWPRenderer renderer)
        {
            this.renderer = renderer;
        }

        public void onSharedPreferenceChanged(
                SharedPreferences sharedPreferences, String key) {
            preferences.getInt("wallpaper_settings", 0);

            renderer.setSharedPreferences(preferences);
        }
    }

    public void initScene() {
        System.gc();
        ALight light = new DirectionalLight();
        light.setPower(this.preferences.getLong("light_power", 3));
        light.setPosition(0, 0, -10);
        mCamera.setPosition(0, -1, -7);
        mCamera.setLookAt(0, 2, 0);
        mCamera.setFarPlane(1000);

        ObjParser parser = new ObjParser(mContext
                    .getResources(), mTextureManager, R.raw.spraycan_obj);
        parser.parse();
        mCan = parser.getParsedObject();
        mCan.addLight(light);
        mCan.setScale(1.2f);
        addChild(mCan);

        Number3D axis = new Number3D(0, 
             this.preferences.getLong("speed", 10), 0);
        axis.normalize();
        mAnim = new RotateAnimation3D(axis, 360);
        mAnim.setDuration(this.preferences.getLong("rotate", 8000));
        mAnim.setRepeatCount(Animation3D.INFINITE);
        mAnim.setInterpolator(new AccelerateDecelerateInterpolator());
        mAnim.setTransformable3D(mCan);


        setSkybox(R.drawable.posz, R.drawable.posx, 
            R.drawable.negz, R.drawable.negx, R.drawable.posy, 
            R.drawable.negy);
    }
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        settingsUpdater = new SettingsUpdater(this);
        this.preferences.registerOnSharedPreferenceChangeListener(
            settingsUpdater);
        settingsUpdater.onSharedPreferenceChanged(preferences, null);
        super.onSurfaceCreated(gl, config);
        mAnim.start();          
    }

    public void onDrawFrame(GL10 glUnused) {
        super.onDrawFrame(glUnused);
        mSkybox.setRotY(mSkybox.getRotY() + .5f);           
    }
}

I know the code is long but I would greatly appreciate any help that someone could give me. Thank you.


Solution

  • You have the PreferenceScreen nested inside the PreferenceCategory.

    -- EDIT -- On closer inspection, the tags are all mixed up. (You're closing the PreferenceScreen twice)

    I believe the basic structure is:

       <PreferenceScreen android:title="@string/more">
         <PreferenceCategory android:title="@string/more">
           <ListPreference android:title="@string/settings_something"/>
         </PreferenceCategory>
       </PreferenceScreen>
    

    Also, you have android:enabled="false" added to each preference. I can imagine this will disable the input...