Android Open Source - ColorWallpaper Alert Dialog Preference






From Project

Back to project page ColorWallpaper.

License

The source code is released under:

Licensed under the Expat License. Copyright (C) 2013 Peter Occil Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the...

If you think the Android project ColorWallpaper listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.upokecenter.android.ui;
//w  w  w . j  av  a2s. co m
import java.lang.ref.WeakReference;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.os.Parcelable;
import android.preference.Preference;
import android.util.AttributeSet;
import android.widget.Toast;

import com.upokecenter.android.util.AppManager;

public class AlertDialogPreference extends Preference {

  IDialogUpdater updater=null;

  protected IDialogUpdater getDialogUpdater(){
    if(updater==null) {
      updater=new IDialogUpdater(){
        @Override
        public void setValue(Dialog dialog, Object value) {
        }
        @Override
        public Object getValue(Dialog dialog) {
          return 0;
        }
        @Override
        public void prepareDialog(Dialog dialog) {
        }
        @Override
        public Class<?> getType() {
          return Void.TYPE;
        }
        @Override
        public boolean isValid(Object[] value) {
          return true;
        }
      };
    }
    return updater;
  }

  @Override
  protected Parcelable onSaveInstanceState() {
    Parcelable state = super.onSaveInstanceState();
    PreferenceState ret = new PreferenceState(state, this.getClass());
    Bundle b=ret.getBundle();
    Dialog dialog=alertDialog==null ? null : alertDialog.get();
    Class<?> type=getDialogUpdater().getType();
    Object value=getDialogUpdater().getValue(dialog);
    if(type.equals(Integer.TYPE)) {
      b.putInt("value",(Integer)value);
    } else if(type.equals(Long.TYPE)) {
      b.putLong("value",(Long)value);
    } else if(type.equals(Float.TYPE)) {
      b.putFloat("value",(Float)value);
    } else if(type.equals(String.class)) {
      b.putString("value",(String)value);
    } else if(!type.equals(Void.TYPE))
      throw new IllegalStateException();
    boolean showing=dialog==null ? false : dialog.isShowing();
    ret.getBundle().putBoolean("showing",showing);
    state=ret;
    // dismiss the dialog here to avoid leaking it
    if(showing){dialog.dismiss(); alertDialog=null;}
    return state;
  }

  @Override
  protected void onRestoreInstanceState(Parcelable state) {
    boolean isState=PreferenceState.isPreferenceState(state,this.getClass());
    //    DebugUtility.log("isState=%s state=%s [key=%s, getClass=%s]",isState,
    //    isState ? ((PreferenceState)state).getSuperState() : state,
    //      getKey(),this.getClass());
    super.onRestoreInstanceState(isState ? ((PreferenceState)state).getSuperState() : state);
    if(isState){
      Bundle b=((PreferenceState)state).getBundle();
      boolean showing=b.getBoolean("showing");
      if(showing){
        showDialog();
      }
      Class<?> type=getDialogUpdater().getType();
      Object value=null;
      if(type.equals(Integer.TYPE)) {
        value=b.getInt("value");
      } else if(type.equals(Long.TYPE)) {
        value=b.getLong("value");
      } else if(type.equals(Float.TYPE)) {
        value=b.getFloat("value");
      } else if(type.equals(String.class)) {
        value=b.getString("value");
      } else if(!type.equals(Void.TYPE))
        throw new IllegalStateException();
      getDialogUpdater().setValue(alertDialog==null ? null : alertDialog.get(),value);
    }
  }


  @Override
  protected Object onGetDefaultValue(TypedArray a, int index) {
    Class<?> type=getDialogUpdater().getType();
    if(type.equals(Integer.TYPE) || type.equals(Void.TYPE))
      return a.getInteger(index,0);
    else if(type.equals(Long.TYPE)){
      String s=a.getString(index);
      return (long)Long.parseLong((s!=null) ? s : ""); // Unfortunately there's no getLong in TypedArray
    }
    else if(type.equals(Float.TYPE))
      return a.getFloat(index,0f);
    else if(type.equals(String.class))
      return a.getString(index);
    else
      throw new IllegalStateException();
  }

  private String defaultFormat(){
    Class<?> type=getDialogUpdater().getType();
    if(type.equals(Integer.TYPE) || type.equals(Long.TYPE) || type.equals(Float.TYPE))
      return "%d";
    else
      return "%s";
  }

  private void persist(Object value){
    Class<?> type=getDialogUpdater().getType();
    if(type.equals(Integer.TYPE)) {
      persistInt((Integer)value);
    } else if(type.equals(Long.TYPE)) {
      persistLong((Long)value);
    } else if(type.equals(Float.TYPE)) {
      persistFloat((Float)value);
    } else if(type.equals(String.class)) {
      persistString((String)value);
    } else if(!type.equals(Void.TYPE))
      throw new IllegalStateException();
  }

  private Object getPersisted(Object value){
    Class<?> type=getDialogUpdater().getType();
    if(type.equals(Integer.TYPE) || type.equals(Void.TYPE))
      return getPersistedInt(value==null ? 0 : (Integer)value);
    else if(type.equals(Long.TYPE))
      return getPersistedLong(value==null ? 0 : (Long)value);
    else if(type.equals(Float.TYPE))
      return getPersistedFloat(value==null ? 0 : (Float)value);
    else if(type.equals(String.class))
      return getPersistedString(value==null ? "" : (String)value);
    else
      throw new IllegalStateException();
  }

  private String settingSummary = null;
  private int layoutResource = 0;
  private int dialogTitle = 0;
  private WeakReference<AlertDialog> alertDialog = null;
  private int negativeButton = 0;
  private int positiveButton = 0;
  private int dialogMessage = 0;

  public AlertDialogPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
    negativeButton=attrs.getAttributeResourceValue(
        "http://schemas.android.com/apk/res/android","negativeButtonText",0);
    String strNeg=attrs.getAttributeValue(
        "http://schemas.android.com/apk/res/android","negativeButtonText");
    positiveButton=attrs.getAttributeResourceValue(
        "http://schemas.android.com/apk/res/android","positiveButtonText",0);
    String strPos=attrs.getAttributeValue(
        "http://schemas.android.com/apk/res/android","positiveButtonText");
    if(negativeButton==0 && strNeg==null) {
      negativeButton=android.R.string.cancel;
    }
    if(positiveButton==0 && strPos==null) {
      positiveButton=android.R.string.ok;
    }
    int summaryId=attrs.getAttributeResourceValue(
        "http://schemas.android.com/apk/res/android","summary",0);
    layoutResource=attrs.getAttributeResourceValue(
        "http://schemas.android.com/apk/res/android","dialogLayout",0);
    dialogTitle=attrs.getAttributeResourceValue(
        "http://schemas.android.com/apk/res/android","dialogTitle",0);
    dialogMessage=attrs.getAttributeResourceValue(
        "http://schemas.android.com/apk/res/android","dialogMessage",0);
    if(summaryId!=0){
      settingSummary=context.getResources().getString(summaryId);
    }
  }


  private void showDialog() {
    AlertDialog.Builder builder=new AlertDialog.Builder(getContext());
    if(dialogMessage!=0 && "string".equals(getContext().getResources().getResourceTypeName(dialogMessage))) {
      builder=builder.setMessage(dialogMessage);
    }
    if(dialogTitle!=0) {
      builder=builder.setTitle(dialogTitle);
    }
    if(positiveButton!=0){
      builder=builder.setPositiveButton(positiveButton,new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {
          Object newValue=getDialogUpdater().getValue(alertDialog==null ? null : alertDialog.get());
          Object[] validatedValue=new Object[]{newValue};
          if(!getDialogUpdater().isValid(validatedValue)){
            Toast.makeText(getContext(),AppManager.getStringResourceValue("textnotvalid","Not valid"),Toast.LENGTH_SHORT).show();
            showDialog();
          } else {
            if(callChangeListener(validatedValue[0])){
              persist(validatedValue[0]);
              if(!getDialogUpdater().getType().equals(Void.TYPE)) {
                setSummary(String.format(settingSummary==null ? defaultFormat() : settingSummary,
                    getPersisted(null)));
              }
            }
            alertDialog=null;
          }
        }});
    }
    if(negativeButton!=0){
      builder=builder.setNegativeButton(negativeButton,new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {
          alertDialog=null;
        }});
    }
    if(getContext() instanceof Activity && layoutResource!=0){
      builder=builder.setView(((Activity)getContext()).getLayoutInflater()
          .inflate(layoutResource,null));
    }
    AlertDialog dialog=builder.show();
    getDialogUpdater().prepareDialog(dialog);
    getDialogUpdater().setValue(dialog,getPersisted(null));
    alertDialog=new WeakReference<AlertDialog>(dialog);
  }

  @Override
  protected void onClick() {
    super.onClick();
    showDialog();
  }

  @Override
  protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
    if (restorePersistedValue) {
      getDialogUpdater().setValue(alertDialog==null ? null : alertDialog.get(),
          getPersisted(defaultValue));
      if(!getDialogUpdater().getType().equals(Void.TYPE)) {
        setSummary(String.format(settingSummary==null ? defaultFormat() : settingSummary,getPersisted(defaultValue)));
      }
    } else {
      persist(defaultValue);
      getDialogUpdater().setValue(alertDialog==null ? null : alertDialog.get(),
          defaultValue);
      if(!getDialogUpdater().getType().equals(Void.TYPE)) {
        setSummary(String.format(settingSummary==null ? defaultFormat() : settingSummary,getPersisted(defaultValue)));
      }
    }
  }

}




Java Source Code List

com.upokecenter.android.colorwallpaper.ColorWallpaperService.java
com.upokecenter.android.colorwallpaper.LauncherActivity.java
com.upokecenter.android.colorwallpaper.SettingsActivity.java
com.upokecenter.android.location.DummyLocationHelper.java
com.upokecenter.android.location.ILocationHelper.java
com.upokecenter.android.location.ISimpleLocationListener.java
com.upokecenter.android.location.LocationHelper.java
com.upokecenter.android.net.ConnectivityHelper.java
com.upokecenter.android.net.DownloadService.java
com.upokecenter.android.net.IConnectionListener.java
com.upokecenter.android.ui.AlertDialogActivity.java
com.upokecenter.android.ui.AlertDialogPreference.java
com.upokecenter.android.ui.BaseSettingsActivity.java
com.upokecenter.android.ui.ChoosePicturePreference.java
com.upokecenter.android.ui.ColorPickerDialog.java
com.upokecenter.android.ui.ContinuousValuePreference.java
com.upokecenter.android.ui.DialogUtility.java
com.upokecenter.android.ui.GetContentActivity.java
com.upokecenter.android.ui.IChoiceListener.java
com.upokecenter.android.ui.IDialogUpdater.java
com.upokecenter.android.ui.IntentPreference.java
com.upokecenter.android.ui.PreferenceState.java
com.upokecenter.android.ui.ShareActivity.java
com.upokecenter.android.ui.UriPreference.java
com.upokecenter.android.util.AppManager.java
com.upokecenter.android.util.BitmapUtility.java
com.upokecenter.android.util.StorageUtility.java
com.upokecenter.android.wallpaper.BaseWallpaperService.java
com.upokecenter.util.XmlHelper.java