/*
* Firetweet - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.getlantern.firetweet.preference;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.database.Cursor;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.util.AttributeSet;
import org.apache.commons.lang3.ArrayUtils;
import org.getlantern.firetweet.R;
public class RingtonePreference extends AutoInvalidateListPreference {
private Ringtone[] mRingtones;
private String[] mEntries, mValues;
private int mSelectedItem;
public RingtonePreference(final Context context, final AttributeSet attrs) {
super(context, attrs);
}
public int getSelectedItem() {
return mSelectedItem;
}
public Ringtone getSelectedRingtone() {
return mRingtones[mSelectedItem];
}
public void setSelectedItem(final int selected) {
mSelectedItem = selected >= 0 && selected < mValues.length ? selected : 0;
}
@Override
protected void onDialogClosed(final boolean positiveResult) {
final Ringtone ringtone = getSelectedRingtone();
if (ringtone != null && ringtone.isPlaying()) {
ringtone.stop();
}
if (positiveResult && mSelectedItem >= 0 && mSelectedItem < mValues.length) {
if (callChangeListener(mValues[mSelectedItem])) {
persistString(mValues[mSelectedItem]);
}
}
}
@Override
protected void onPrepareDialogBuilder(final Builder builder) {
loadRingtones(getContext());
setSelectedItem(ArrayUtils.indexOf(mValues, getPersistedString(null)));
builder.setSingleChoiceItems(getEntries(), getSelectedItem(), new OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, final int which) {
setSelectedItem(which);
final Ringtone ringtone = getSelectedRingtone();
if (ringtone.isPlaying()) {
ringtone.stop();
}
ringtone.play();
}
});
}
private void loadRingtones(final Context context) {
final RingtoneManager manager = new RingtoneManager(context);
manager.setType(RingtoneManager.TYPE_NOTIFICATION);
final Cursor cur = manager.getCursor();
cur.moveToFirst();
final int count = cur.getCount();
mRingtones = new Ringtone[count + 1];
mEntries = new String[count + 1];
mValues = new String[count + 1];
final Uri default_uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
final Ringtone default_ringtone = RingtoneManager.getRingtone(context, default_uri);
mRingtones[0] = default_ringtone;
mEntries[0] = context.getString(R.string.default_ringtone);
mValues[0] = default_uri.toString();
for (int i = 0; i < count; i++) {
final Ringtone ringtone = manager.getRingtone(i);
mRingtones[i + 1] = ringtone;
mEntries[i + 1] = ringtone.getTitle(context);
mValues[i + 1] = manager.getRingtoneUri(i).toString();
}
setEntries(mEntries);
setEntryValues(mValues);
cur.close();
}
}