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 SyncTypePreference extends DialogPreference implements Constants, OnClickListener { private SharedPreferences mPreferences; private final PackageManager mPackageManager; private AlertDialog mDialog; private SyncTypeSpec[] mAvailableSyncTypes; public SyncTypePreference(final Context context) { this(context, null); } public SyncTypePreference(final Context context, final AttributeSet attrs) { this(context, attrs, android.R.attr.preferenceStyle); } public SyncTypePreference(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 SyncTypeSpec spec = mAvailableSyncTypes[which]; if (spec != null) { editor.putString(PREFERENCE_KEY_SYNC_TYPE, spec.cls); editor.commit(); } if (mDialog != null && mDialog.isShowing()) { mDialog.dismiss(); } } @Override public void onPrepareDialogBuilder(final AlertDialog.Builder builder) { mPreferences = getSharedPreferences(); super.onPrepareDialogBuilder(builder); if (mPreferences == null) return; final String component = mPreferences.getString(PREFERENCE_KEY_SYNC_TYPE, null); final ArrayList<SyncTypeSpec> specs = new ArrayList<SyncTypeSpec>(); specs.add(new SyncTypeSpec(getContext().getString(R.string.timeline_sync_tweetmarker), "tweetmarker")); specs.add(new SyncTypeSpec(getContext().getString(R.string.timeline_sync_tweetings), "tweetings")); final Intent query_intent = new Intent(INTENT_ACTION_EXTENSION_SYNC_TYPE); final List<ResolveInfo> result = mPackageManager.queryIntentServices(query_intent, 0); for (final ResolveInfo info : result) { specs.add(new SyncTypeSpec(info.loadLabel(mPackageManager).toString(), info.serviceInfo.packageName + "/" + info.serviceInfo.name)); } mAvailableSyncTypes = specs.toArray(new SyncTypeSpec[specs.size()]); builder.setSingleChoiceItems(mAvailableSyncTypes, getIndex(component), SyncTypePreference.this); builder.setNegativeButton(android.R.string.ok, null); } private int getIndex(final String cls) { if (mAvailableSyncTypes == null) return -1; if (cls == null) return 0; final int count = mAvailableSyncTypes.length; for (int i = 0; i < count; i++) { final SyncTypeSpec spec = mAvailableSyncTypes[i]; if (cls.equals(spec.cls)) return i; } return -1; } static class SyncTypeSpec implements CharSequence { private final String name, cls; SyncTypeSpec(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; } } }