Loading build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ buildscript { propMinSdkVersion = 16 propTargetSdkVersion = propCompileSdkVersion propVersionCode = 1 propVersionName = '3.17.9' propVersionName = '3.17.10' kotlin_version = '1.2.31' support_libs = '27.1.0' } Loading commons/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ dependencies { implementation 'com.andrognito.patternlockview:patternlockview:1.0.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'com.bignerdranch.android:recyclerview-multiselect:0.2' implementation 'com.google.code.gson:gson:2.8.2' compile 'com.github.ajalt.reprint:core:3.2.1@aar' annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1' Loading commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/SelectAlarmSoundDialog.kt 0 → 100644 +155 −0 Original line number Diff line number Diff line package com.simplemobiletools.commons.dialogs import android.annotation.TargetApi import android.content.Intent import android.media.MediaPlayer import android.net.Uri import android.os.Build import android.support.v7.app.AlertDialog import android.view.ViewGroup import android.widget.RadioGroup import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.R import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.isKitkatPlus import com.simplemobiletools.commons.models.AlarmSound import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.views.MyCompatRadioButton import kotlinx.android.synthetic.main.dialog_select_alarm_sound.view.* import java.util.* class SelectAlarmSoundDialog(val activity: BaseSimpleActivity, val currentUri: String, val audioStream: Int, val pickAudioIntentId: Int, val onAlarmPicked: (alarmSound: AlarmSound?) -> Unit, val onAlarmSoundDeleted: (alarmSound: AlarmSound) -> Unit) { private val ADD_NEW_SOUND_ID = -2 private val view = activity.layoutInflater.inflate(R.layout.dialog_select_alarm_sound, null) private var systemAlarmSounds = ArrayList<AlarmSound>() private var yourAlarmSounds = ArrayList<AlarmSound>() private var mediaPlayer = MediaPlayer() private val config = activity.baseConfig private val dialog: AlertDialog init { activity.getAlarmSounds { systemAlarmSounds = it gotSystemAlarms() } view.dialog_select_alarm_your_label.setTextColor(activity.getAdjustedPrimaryColor()) view.dialog_select_alarm_system_label.setTextColor(activity.getAdjustedPrimaryColor()) addYourAlarms() dialog = AlertDialog.Builder(activity) .setOnDismissListener { mediaPlayer.stop() } .setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() }) .setNegativeButton(R.string.cancel, null) .create().apply { activity.setupDialogStuff(view, this) window.volumeControlStream = audioStream } } private fun addYourAlarms() { view.dialog_select_alarm_your_radio.removeAllViews() val token = object : TypeToken<ArrayList<AlarmSound>>() {}.type yourAlarmSounds = Gson().fromJson<ArrayList<AlarmSound>>(config.yourAlarmSounds, token) ?: ArrayList() yourAlarmSounds.add(AlarmSound(ADD_NEW_SOUND_ID, activity.getString(R.string.add_new_sound), "")) yourAlarmSounds.forEach { addAlarmSound(it, view.dialog_select_alarm_your_radio) } } private fun gotSystemAlarms() { systemAlarmSounds.forEach { addAlarmSound(it, view.dialog_select_alarm_system_radio) } } private fun addAlarmSound(alarmSound: AlarmSound, holder: ViewGroup) { val radioButton = (activity.layoutInflater.inflate(R.layout.item_select_alarm_sound, null) as MyCompatRadioButton).apply { text = alarmSound.title isChecked = alarmSound.uri == currentUri id = alarmSound.id setColors(config.textColor, activity.getAdjustedPrimaryColor(), config.backgroundColor) setOnClickListener { alarmClicked(alarmSound) if (holder == view.dialog_select_alarm_system_radio) { view.dialog_select_alarm_your_radio.clearCheck() } else { view.dialog_select_alarm_system_radio.clearCheck() } } if (alarmSound.id != -2 && holder == view.dialog_select_alarm_your_radio) { setOnLongClickListener { val items = arrayListOf(RadioItem(1, context.getString(R.string.remove))) RadioGroupDialog(activity, items) { removeAlarmSound(alarmSound) } true } } } holder.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) } @TargetApi(Build.VERSION_CODES.KITKAT) private fun alarmClicked(alarmSound: AlarmSound) { if (alarmSound.id == ADD_NEW_SOUND_ID) { val action = if (isKitkatPlus()) Intent.ACTION_OPEN_DOCUMENT else Intent.ACTION_GET_CONTENT Intent(action).apply { type = "audio/*" activity.startActivityForResult(this, pickAudioIntentId) if (isKitkatPlus()) { flags = flags or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION } } dialog.dismiss() } else { try { mediaPlayer.stop() mediaPlayer = MediaPlayer().apply { setAudioStreamType(audioStream) setDataSource(activity, Uri.parse(alarmSound.uri)) isLooping = true prepare() start() } } catch (e: Exception) { activity.showErrorToast(e) } } } private fun removeAlarmSound(alarmSound: AlarmSound) { val token = object : TypeToken<ArrayList<AlarmSound>>() {}.type yourAlarmSounds = Gson().fromJson<ArrayList<AlarmSound>>(config.yourAlarmSounds, token) ?: ArrayList() yourAlarmSounds.remove(alarmSound) config.yourAlarmSounds = Gson().toJson(yourAlarmSounds) addYourAlarms() if (alarmSound.id == view.dialog_select_alarm_your_radio.checkedRadioButtonId) { view.dialog_select_alarm_your_radio.clearCheck() view.dialog_select_alarm_system_radio.check(systemAlarmSounds.firstOrNull()?.id ?: 0) } onAlarmSoundDeleted(alarmSound) } private fun dialogConfirmed() { if (view.dialog_select_alarm_your_radio.checkedRadioButtonId != -1) { val checkedId = view.dialog_select_alarm_your_radio.checkedRadioButtonId onAlarmPicked(yourAlarmSounds.firstOrNull { it.id == checkedId }) } else { val checkedId = view.dialog_select_alarm_system_radio.checkedRadioButtonId onAlarmPicked(systemAlarmSounds.firstOrNull { it.id == checkedId }) } } } commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity.kt +41 −4 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.graphics.drawable.ColorDrawable import android.media.RingtoneManager import android.net.Uri import android.os.Looper import android.os.TransactionTooLargeException Loading @@ -26,10 +27,7 @@ import com.simplemobiletools.commons.R import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.dialogs.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.Release import com.simplemobiletools.commons.models.SharedTheme import com.simplemobiletools.commons.models.* import com.simplemobiletools.commons.views.MyTextView import kotlinx.android.synthetic.main.dialog_title.view.* import java.io.* Loading Loading @@ -783,3 +781,42 @@ fun Activity.showPickSecondsDialog(curSeconds: Int, isSnoozePicker: Boolean = fa } } } fun BaseSimpleActivity.getAlarmSounds(callback: (ArrayList<AlarmSound>) -> Unit) { val alarms = ArrayList<AlarmSound>() val manager = RingtoneManager(this) manager.setType(RingtoneManager.TYPE_ALARM) try { val cursor = manager.cursor val defaultAlarm = AlarmSound(0, getDefaultAlarmTitle(getString(R.string.alarm)), getDefaultAlarmUri().toString()) alarms.add(defaultAlarm) var curId = 1 while (cursor.moveToNext()) { val title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX) var uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX) val id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX) if (!uri.endsWith(id)) { uri += "/$id" } val alarmSound = AlarmSound(curId++, title, uri) alarms.add(alarmSound) } callback(alarms) } catch (e: Exception) { if (e is SecurityException) { handlePermission(PERMISSION_READ_STORAGE) { if (it) { getAlarmSounds(callback) } else { showErrorToast(e) callback(ArrayList()) } } } else { showErrorToast(e) callback(ArrayList()) } } } commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context.kt +5 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import android.content.Context import android.content.pm.PackageManager import android.database.Cursor import android.graphics.Color import android.media.RingtoneManager import android.net.Uri import android.os.Environment import android.provider.BaseColumns Loading Loading @@ -443,3 +444,7 @@ fun Context.getFormattedSeconds(seconds: Int, showBefore: Boolean = true) = when } } } fun Context.getDefaultAlarmUri() = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM) fun Context.getDefaultAlarmTitle(defaultTitle: String) = RingtoneManager.getRingtone(this, getDefaultAlarmUri())?.getTitle(this) ?: defaultTitle Loading
build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ buildscript { propMinSdkVersion = 16 propTargetSdkVersion = propCompileSdkVersion propVersionCode = 1 propVersionName = '3.17.9' propVersionName = '3.17.10' kotlin_version = '1.2.31' support_libs = '27.1.0' } Loading
commons/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ dependencies { implementation 'com.andrognito.patternlockview:patternlockview:1.0.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'com.bignerdranch.android:recyclerview-multiselect:0.2' implementation 'com.google.code.gson:gson:2.8.2' compile 'com.github.ajalt.reprint:core:3.2.1@aar' annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1' Loading
commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/SelectAlarmSoundDialog.kt 0 → 100644 +155 −0 Original line number Diff line number Diff line package com.simplemobiletools.commons.dialogs import android.annotation.TargetApi import android.content.Intent import android.media.MediaPlayer import android.net.Uri import android.os.Build import android.support.v7.app.AlertDialog import android.view.ViewGroup import android.widget.RadioGroup import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.R import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.isKitkatPlus import com.simplemobiletools.commons.models.AlarmSound import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.views.MyCompatRadioButton import kotlinx.android.synthetic.main.dialog_select_alarm_sound.view.* import java.util.* class SelectAlarmSoundDialog(val activity: BaseSimpleActivity, val currentUri: String, val audioStream: Int, val pickAudioIntentId: Int, val onAlarmPicked: (alarmSound: AlarmSound?) -> Unit, val onAlarmSoundDeleted: (alarmSound: AlarmSound) -> Unit) { private val ADD_NEW_SOUND_ID = -2 private val view = activity.layoutInflater.inflate(R.layout.dialog_select_alarm_sound, null) private var systemAlarmSounds = ArrayList<AlarmSound>() private var yourAlarmSounds = ArrayList<AlarmSound>() private var mediaPlayer = MediaPlayer() private val config = activity.baseConfig private val dialog: AlertDialog init { activity.getAlarmSounds { systemAlarmSounds = it gotSystemAlarms() } view.dialog_select_alarm_your_label.setTextColor(activity.getAdjustedPrimaryColor()) view.dialog_select_alarm_system_label.setTextColor(activity.getAdjustedPrimaryColor()) addYourAlarms() dialog = AlertDialog.Builder(activity) .setOnDismissListener { mediaPlayer.stop() } .setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() }) .setNegativeButton(R.string.cancel, null) .create().apply { activity.setupDialogStuff(view, this) window.volumeControlStream = audioStream } } private fun addYourAlarms() { view.dialog_select_alarm_your_radio.removeAllViews() val token = object : TypeToken<ArrayList<AlarmSound>>() {}.type yourAlarmSounds = Gson().fromJson<ArrayList<AlarmSound>>(config.yourAlarmSounds, token) ?: ArrayList() yourAlarmSounds.add(AlarmSound(ADD_NEW_SOUND_ID, activity.getString(R.string.add_new_sound), "")) yourAlarmSounds.forEach { addAlarmSound(it, view.dialog_select_alarm_your_radio) } } private fun gotSystemAlarms() { systemAlarmSounds.forEach { addAlarmSound(it, view.dialog_select_alarm_system_radio) } } private fun addAlarmSound(alarmSound: AlarmSound, holder: ViewGroup) { val radioButton = (activity.layoutInflater.inflate(R.layout.item_select_alarm_sound, null) as MyCompatRadioButton).apply { text = alarmSound.title isChecked = alarmSound.uri == currentUri id = alarmSound.id setColors(config.textColor, activity.getAdjustedPrimaryColor(), config.backgroundColor) setOnClickListener { alarmClicked(alarmSound) if (holder == view.dialog_select_alarm_system_radio) { view.dialog_select_alarm_your_radio.clearCheck() } else { view.dialog_select_alarm_system_radio.clearCheck() } } if (alarmSound.id != -2 && holder == view.dialog_select_alarm_your_radio) { setOnLongClickListener { val items = arrayListOf(RadioItem(1, context.getString(R.string.remove))) RadioGroupDialog(activity, items) { removeAlarmSound(alarmSound) } true } } } holder.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) } @TargetApi(Build.VERSION_CODES.KITKAT) private fun alarmClicked(alarmSound: AlarmSound) { if (alarmSound.id == ADD_NEW_SOUND_ID) { val action = if (isKitkatPlus()) Intent.ACTION_OPEN_DOCUMENT else Intent.ACTION_GET_CONTENT Intent(action).apply { type = "audio/*" activity.startActivityForResult(this, pickAudioIntentId) if (isKitkatPlus()) { flags = flags or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION } } dialog.dismiss() } else { try { mediaPlayer.stop() mediaPlayer = MediaPlayer().apply { setAudioStreamType(audioStream) setDataSource(activity, Uri.parse(alarmSound.uri)) isLooping = true prepare() start() } } catch (e: Exception) { activity.showErrorToast(e) } } } private fun removeAlarmSound(alarmSound: AlarmSound) { val token = object : TypeToken<ArrayList<AlarmSound>>() {}.type yourAlarmSounds = Gson().fromJson<ArrayList<AlarmSound>>(config.yourAlarmSounds, token) ?: ArrayList() yourAlarmSounds.remove(alarmSound) config.yourAlarmSounds = Gson().toJson(yourAlarmSounds) addYourAlarms() if (alarmSound.id == view.dialog_select_alarm_your_radio.checkedRadioButtonId) { view.dialog_select_alarm_your_radio.clearCheck() view.dialog_select_alarm_system_radio.check(systemAlarmSounds.firstOrNull()?.id ?: 0) } onAlarmSoundDeleted(alarmSound) } private fun dialogConfirmed() { if (view.dialog_select_alarm_your_radio.checkedRadioButtonId != -1) { val checkedId = view.dialog_select_alarm_your_radio.checkedRadioButtonId onAlarmPicked(yourAlarmSounds.firstOrNull { it.id == checkedId }) } else { val checkedId = view.dialog_select_alarm_system_radio.checkedRadioButtonId onAlarmPicked(systemAlarmSounds.firstOrNull { it.id == checkedId }) } } }
commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity.kt +41 −4 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.graphics.drawable.ColorDrawable import android.media.RingtoneManager import android.net.Uri import android.os.Looper import android.os.TransactionTooLargeException Loading @@ -26,10 +27,7 @@ import com.simplemobiletools.commons.R import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.dialogs.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.Release import com.simplemobiletools.commons.models.SharedTheme import com.simplemobiletools.commons.models.* import com.simplemobiletools.commons.views.MyTextView import kotlinx.android.synthetic.main.dialog_title.view.* import java.io.* Loading Loading @@ -783,3 +781,42 @@ fun Activity.showPickSecondsDialog(curSeconds: Int, isSnoozePicker: Boolean = fa } } } fun BaseSimpleActivity.getAlarmSounds(callback: (ArrayList<AlarmSound>) -> Unit) { val alarms = ArrayList<AlarmSound>() val manager = RingtoneManager(this) manager.setType(RingtoneManager.TYPE_ALARM) try { val cursor = manager.cursor val defaultAlarm = AlarmSound(0, getDefaultAlarmTitle(getString(R.string.alarm)), getDefaultAlarmUri().toString()) alarms.add(defaultAlarm) var curId = 1 while (cursor.moveToNext()) { val title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX) var uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX) val id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX) if (!uri.endsWith(id)) { uri += "/$id" } val alarmSound = AlarmSound(curId++, title, uri) alarms.add(alarmSound) } callback(alarms) } catch (e: Exception) { if (e is SecurityException) { handlePermission(PERMISSION_READ_STORAGE) { if (it) { getAlarmSounds(callback) } else { showErrorToast(e) callback(ArrayList()) } } } else { showErrorToast(e) callback(ArrayList()) } } }
commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context.kt +5 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import android.content.Context import android.content.pm.PackageManager import android.database.Cursor import android.graphics.Color import android.media.RingtoneManager import android.net.Uri import android.os.Environment import android.provider.BaseColumns Loading Loading @@ -443,3 +444,7 @@ fun Context.getFormattedSeconds(seconds: Int, showBefore: Boolean = true) = when } } } fun Context.getDefaultAlarmUri() = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM) fun Context.getDefaultAlarmTitle(defaultTitle: String) = RingtoneManager.getRingtone(this, getDefaultAlarmUri())?.getTitle(this) ?: defaultTitle