/* * Calendula - An assistant for personal medication management. * Copyright (C) 2016 CITIUS - USC * * Calendula 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 software. If not, see <http://www.gnu.org/licenses/>. */ package es.usc.citius.servando.calendula.util; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.database.Cursor; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.CheckedTextView; import android.widget.ListView; import java.util.ArrayList; import java.util.List; import es.usc.citius.servando.calendula.R; /** * Created by joseangel.pineiro on 2/23/15. */ public class RingtonePreference extends android.preference.RingtonePreference { String[] titles; String[] values; SimpleListAdapter adapter; int selectedIndex = -1; Ringtone ringtone; public RingtonePreference(Context context) { super(context); getEntriesAndValues(); } public RingtonePreference(Context context, AttributeSet attrs) { super(context, attrs); } public void performClick(){ onClick(); } @Override protected void onClick() { getEntriesAndValues(); adapter = new SimpleListAdapter(getContext(), R.layout.ringtone_list_item, titles); ListView list = new ListView(getContext()); list.setAdapter(adapter); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Uri uri = Uri.parse(values[position]); selectedIndex = position; adapter.notifyDataSetChanged(); stopRingtone(); ringtone = RingtoneManager.getRingtone(getContext(), uri); if (ringtone != null) { ringtone.play(); } } }); AlertDialog.Builder builderSingle = new AlertDialog.Builder(getContext()); builderSingle.setCancelable(true); builderSingle.setTitle(getTitle()) .setView(list) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { stopRingtone(); dialog.dismiss(); } }).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (selectedIndex != -1) { onSaveRingtone(Uri.parse(values[selectedIndex])); setSummary(titles[selectedIndex]); } stopRingtone(); dialog.dismiss(); } }).setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { stopRingtone(); } }).show(); } void stopRingtone() { if (ringtone != null && ringtone.isPlaying()) { ringtone.stop(); } } void getEntriesAndValues() { RingtoneManager manager = new RingtoneManager(getContext()); manager.setType(RingtoneManager.TYPE_RINGTONE); List<CharSequence> _titles = new ArrayList<CharSequence>(); List<CharSequence> _values = new ArrayList<CharSequence>(); Cursor cursor = manager.getCursor(); while (cursor.moveToNext()) { String title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX); String id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX); String uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX) + "/" + id; Log.d("TAG", title + ", " + uri + ", " + id); _titles.add(title); _values.add(uri); } titles = _titles.toArray(new String[_titles.size()]); values = _values.toArray(new String[_values.size()]); Uri value = onRestoreRingtone(); if (value != null) { selectedIndex = _values.indexOf(value.toString()); } } public class SimpleListAdapter extends ArrayAdapter<String> { public SimpleListAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } public SimpleListAdapter(Context context, int resource, String[] items) { super(context, resource, items); } @Override public View getView(final int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi; vi = LayoutInflater.from(getContext()); v = vi.inflate(R.layout.ringtone_list_item, null); } CheckedTextView tv = ((CheckedTextView) v.findViewById(R.id.text1)); tv.setText(titles[position]); if (position == selectedIndex) { tv.setChecked(true); } else { tv.setChecked(false); } return v; } } }