package us.achromaticmetaphor.imcktg;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Environment;
import android.provider.ContactsContract;
import android.provider.MediaStore;
public class Tone {
private static final String extrakeyprefix = "us.achromaticmetaphor.imcktg";
public static final String extrakeyRingtone = extrakeyprefix + ".ringtone";
public static final String extrakeyNotification = extrakeyprefix + ".notification";
public static final String extrakeyAlarm = extrakeyprefix + ".alarm";
private File file;
private Uri contenturi;
public File file() {
return file;
}
public Uri contentUri() {
return contenturi;
}
private Tone(File f) {
file = f;
}
protected static final String morsePostPause = " ";
private static final char [] hexdig = "0123456789ABCDEF".toCharArray();
private static String hexPP(byte [] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(hexdig[b & 0xf]);
sb.append(hexdig[(b >> 4) & 0xf]);
}
return sb.toString();
}
protected static String filenameTransform(String s) {
try {
MessageDigest dig = MessageDigest.getInstance("SHA-256");
return hexPP(dig.digest(s.getBytes()));
} catch (NoSuchAlgorithmException e) {
return s;
}
}
protected static String tmpFilename() {
return filenameTransform("us.achromaticmetaphor.imcktg.preview");
}
private static File getToneFilename(Context c, String s, String ext, String typePrefix, Intent i) {
String userFilename = i.getStringExtra(ConfirmContacts.extrakeyFilename);
File rtdir;
File tone;
if (userFilename == null) {
rtdir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES);
tone = new File(rtdir, filenameTransform("us.achromaticmetaphor.imcktg:" + typePrefix + s) + ext);
}
else {
rtdir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "IMCKTG");
tone = new File(rtdir, userFilename + ext);
}
rtdir.mkdirs();
return tone;
}
protected static File tmpfile(File f) {
return new File(f.getAbsolutePath() + ".tmp");
}
protected static Tone generateTone(Context c, String s, ToneGenerator gen, File file) throws IOException {
Tone tone = new Tone(file);
gen.writeTone(tone.file(), s, true);
tone.generateToneTail(c, s);
return tone;
}
protected static Tone generateTone(Context c, String s, ToneGenerator gen, Intent i) throws IOException {
return generateTone(c, s, gen, getToneFilename(c, s, gen.filenameExt(), gen.filenameTypePrefix(), i));
}
protected static void tmpRename(File tone) {
tmpfile(tone).renameTo(tone);
}
protected void expunge(Context c) {
c.getContentResolver().delete(toneStoreUri(c), MediaStore.Audio.Media.DATA + " = ?",
new String [] {file().getAbsolutePath()});
}
protected void delete(Context c) {
expunge(c);
file().delete();
}
protected Uri toneStoreUri(Context c) {
return MediaStore.Audio.Media.getContentUriForPath(file().getAbsolutePath());
}
protected void generateToneTail(Context c, String s) {
expunge(c);
ContentValues storevalues = new ContentValues();
storevalues.put(MediaStore.Audio.Media.DATA, file().getAbsolutePath());
storevalues.put(MediaStore.Audio.Media.TITLE, s);
storevalues.put(MediaStore.Audio.Media.IS_MUSIC, false);
storevalues.put(MediaStore.Audio.Media.IS_ALARM, false);
storevalues.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
storevalues.put(MediaStore.Audio.Media.IS_RINGTONE, false);
contenturi = c.getContentResolver().insert(toneStoreUri(c), storevalues);
}
protected void assign(Context c, Uri contacturi) {
ContentValues values = new ContentValues();
values.put(ContactsContract.Contacts.CUSTOM_RINGTONE, contentUri().toString());
c.getContentResolver().update(contacturi, values, null, null);
}
protected void assignDefault(Context context, Intent intent) {
if (intent.getBooleanExtra(extrakeyRingtone, false))
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, contentUri());
if (intent.getBooleanExtra(extrakeyNotification, false))
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_NOTIFICATION, contentUri());
if (intent.getBooleanExtra(extrakeyAlarm, false))
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_ALARM, contentUri());
}
}