package com.dwdesign.tweetings.preference;
import java.util.ArrayList;
import java.util.List;
import com.dwdesign.tweetings.Constants;
import com.dwdesign.tweetings.R;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.preference.DialogPreference;
import android.util.AttributeSet;
public class TweetShortenerPickerPreference extends DialogPreference implements Constants, OnClickListener {
private SharedPreferences mPreferences;
private final PackageManager mPackageManager;
private TweetShortenerSpec[] mAvailableTweetShorteners;
public TweetShortenerPickerPreference(final Context context) {
this(context, null);
}
public TweetShortenerPickerPreference(final Context context, final AttributeSet attrs) {
this(context, attrs, android.R.attr.preferenceStyle);
}
public TweetShortenerPickerPreference(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
mPackageManager = context.getPackageManager();
}
@Override
public void onClick(final DialogInterface dialog, final int which) {
final SharedPreferences.Editor editor = getEditor();
if (editor == null) return;
final TweetShortenerSpec spec = mAvailableTweetShorteners[which];
if (spec != null) {
editor.putString(PREFERENCE_KEY_TWEET_SHORTENER, spec.cls);
editor.commit();
}
dialog.dismiss();
}
@Override
public void onPrepareDialogBuilder(final AlertDialog.Builder builder) {
super.onPrepareDialogBuilder(builder);
mPreferences = getSharedPreferences();
if (mPreferences == null) return;
final String component = mPreferences.getString(PREFERENCE_KEY_TWEET_SHORTENER, null);
final ArrayList<TweetShortenerSpec> specs = new ArrayList<TweetShortenerSpec>();
specs.add(new TweetShortenerSpec(getContext().getString(R.string.tweet_shortener_default), null));
final Intent query_intent = new Intent(INTENT_ACTION_EXTENSION_SHORTEN_TWEET);
final List<ResolveInfo> result = mPackageManager.queryIntentServices(query_intent, 0);
for (final ResolveInfo info : result) {
specs.add(new TweetShortenerSpec(info.loadLabel(mPackageManager).toString(), info.serviceInfo.packageName
+ "/" + info.serviceInfo.name));
}
mAvailableTweetShorteners = specs.toArray(new TweetShortenerSpec[specs.size()]);
builder.setSingleChoiceItems(mAvailableTweetShorteners, getIndex(component),
TweetShortenerPickerPreference.this);
builder.setNegativeButton(android.R.string.cancel, null);
}
private int getIndex(final String cls) {
if (mAvailableTweetShorteners == null) return -1;
if (cls == null) return 0;
final int count = mAvailableTweetShorteners.length;
for (int i = 0; i < count; i++) {
final TweetShortenerSpec spec = mAvailableTweetShorteners[i];
if (cls.equals(spec.cls)) return i;
}
return -1;
}
static class TweetShortenerSpec implements CharSequence {
private final String name, cls;
TweetShortenerSpec(final String name, final String cls) {
this.name = name;
this.cls = cls;
}
@Override
public char charAt(final int index) {
return name.charAt(index);
}
@Override
public int length() {
return name.length();
}
@Override
public CharSequence subSequence(final int start, final int end) {
return name.subSequence(start, end);
}
@Override
public String toString() {
return name;
}
}
}