package android.app;
import android.app.Activity;
import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.media.VibrationPattern;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Vibrator;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import java.io.Serializable;
import com.android.internal.R;
public class VibrationPickerDialog extends DialogFragment {
private static final String TAG = "VibrationPickerDialog";
private final int VIB_OK = 10;
private final int VIB_CANCEL = 11;
private final int VIB_DEL = 12;
private boolean mIsDel;
private Context mContext;
private Handler mHandler;
private Vibrator mVibrator;
private AlertDialog.Builder mBuilder;
private VibrationPattern mPattern;
public static VibrationPickerDialog newInstance(Handler handler, boolean isDel,
String selectedUri) {
VibrationPickerDialog vpd = new VibrationPickerDialog();
Bundle args = new Bundle();
args.putBoolean("isdel", isDel);
if (selectedUri == null) {
args.putString("uri", "");
} else {
args.putString("uri", selectedUri);
}
args.putSerializable("handler", new HandlerHolder(handler));
vpd.setArguments(args);
return vpd;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
mIsDel = getArguments().getBoolean("isdel");
String mUriString = getArguments().getString("uri");
mHandler = ((HandlerHolder) getArguments().getSerializable("handler")).getHandler();
mContext = getActivity();
mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
final Uri allVibrations = Uri.parse(VibrationPattern.URI);
final Cursor vibrations = mContext.getContentResolver().
query(allVibrations, null, null, null, null);
vibrations.moveToFirst();
int ID = -1;
if (!mUriString.isEmpty()) {
Uri mUri = Uri.parse(mUriString);
do {
try {
if (Integer.parseInt(mUri.getLastPathSegment()) == vibrations.getInt(0)) {
ID = vibrations.getPosition();
}
} catch (Exception ex) {
// nothing to do here
}
} while (vibrations.moveToNext());
}
final int selectedID = ID;
final SimpleCursorAdapter adapter = new SimpleCursorAdapter(mContext,
android.R.layout.simple_list_item_single_choice,
vibrations,
new String[] {
"name"
},
new int[] {
android.R.id.text1
}, 0) {
@Override
public Object getItem(int pos) {
vibrations.moveToPosition(pos);
int id = vibrations.getInt(0);
setSelectedVibration(new VibrationPattern(
Uri.parse(VibrationPattern.URI + "/" + id), mContext));
return getSelectedVibration();
}
};
LayoutInflater factory = LayoutInflater.from(mContext);
final View vibListView = factory.inflate(R.layout.vibration_picker_dialog, null);
return new AlertDialog.Builder(mContext)
.setTitle(
mIsDel ? R.string.vibration_picker_del_title
: R.string.vibration_picker_title)
.setIcon(
mIsDel ? R.drawable.ic_dialog_alert
: 0)
.setView(vibListView)
.setSingleChoiceItems(adapter, selectedID,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
((VibrationPattern) adapter.getItem(which)).play();
}
})
.setPositiveButton(mIsDel ? R.string.delete : R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if (mIsDel) {
delVib(getSelectedVibration());
adapter.notifyDataSetChanged();
} else {
selectVib(getSelectedVibration());
}
stopAllVibrations();
}
})
.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
stopAllVibrations();
sendCancel();
}
})
.create();
}
private void selectVib(VibrationPattern vib) {
final Message m = new Message();
m.obj = vib;
m.what = VIB_OK;
mHandler.sendMessage(m);
}
private void sendCancel() {
final Message m = new Message();
m.what = VIB_CANCEL;
mHandler.sendMessage(m);
}
private void delVib(VibrationPattern vib) {
final Message m = new Message();
m.obj = vib;
m.what = VIB_DEL;
mHandler.sendMessage(m);
}
public void stopAllVibrations() {
if (mVibrator != null) {
mVibrator.cancel();
}
}
private void setSelectedVibration(VibrationPattern pattern) {
mPattern = pattern;
}
private VibrationPattern getSelectedVibration() {
return mPattern;
}
static class HandlerHolder implements Serializable {
Handler tHandler;
public HandlerHolder(Handler handler) {
tHandler = handler;
}
public Handler getHandler() {
return tHandler;
}
}
}