mirror of
https://github.com/mihonapp/mihon.git
synced 2024-09-22 13:42:39 +02:00
b0482003bd
* [SettingsBackupController] Handle ActivityNotFoundException When using `Intent.ACTION_CREATE_DOCUMENT` on SDK >= Lollipop there is no guarantee that the ROM supports the built in file picker such as MIUI * [SettingsBackupController] Add import for ActivityNotFoundException * Add additional handlers to Android document intents * Requested review changes Move `try {`s to top of block Replace version numbers with `Build.VERSION_CODES.LOLLIPOP` Break out custom file picker intent to Context extention `Context.getFilePicker` Rename `val i` to `val intent` to be more clear with variable names * Add version check to custom file picker after exception
164 lines
5.1 KiB
Kotlin
164 lines
5.1 KiB
Kotlin
package eu.kanade.tachiyomi.util
|
|
|
|
import android.app.ActivityManager
|
|
import android.app.Notification
|
|
import android.app.NotificationManager
|
|
import android.content.BroadcastReceiver
|
|
import android.content.Context
|
|
import android.content.Intent
|
|
import android.content.IntentFilter
|
|
import android.content.pm.PackageManager
|
|
import android.content.res.Resources
|
|
import android.net.ConnectivityManager
|
|
import android.os.PowerManager
|
|
import android.support.annotation.StringRes
|
|
import android.support.v4.app.NotificationCompat
|
|
import android.support.v4.content.ContextCompat
|
|
import android.support.v4.content.LocalBroadcastManager
|
|
import android.widget.Toast
|
|
import com.nononsenseapps.filepicker.FilePickerActivity
|
|
import eu.kanade.tachiyomi.widget.CustomLayoutPickerActivity
|
|
|
|
/**
|
|
* Display a toast in this context.
|
|
*
|
|
* @param resource the text resource.
|
|
* @param duration the duration of the toast. Defaults to short.
|
|
*/
|
|
fun Context.toast(@StringRes resource: Int, duration: Int = Toast.LENGTH_SHORT) {
|
|
Toast.makeText(this, resource, duration).show()
|
|
}
|
|
|
|
/**
|
|
* Display a toast in this context.
|
|
*
|
|
* @param text the text to display.
|
|
* @param duration the duration of the toast. Defaults to short.
|
|
*/
|
|
fun Context.toast(text: String?, duration: Int = Toast.LENGTH_SHORT) {
|
|
Toast.makeText(this, text, duration).show()
|
|
}
|
|
|
|
/**
|
|
* Helper method to create a notification.
|
|
*
|
|
* @param id the channel id.
|
|
* @param func the function that will execute inside the builder.
|
|
* @return a notification to be displayed or updated.
|
|
*/
|
|
inline fun Context.notification(channelId: String, func: NotificationCompat.Builder.() -> Unit): Notification {
|
|
val builder = NotificationCompat.Builder(this, channelId)
|
|
builder.func()
|
|
return builder.build()
|
|
}
|
|
|
|
/**
|
|
* Helper method to construct an Intent to use a custom file picker.
|
|
* @param currentDir the path the file picker will open with.
|
|
* @return an Intent to start the file picker activity.
|
|
*/
|
|
fun Context.getFilePicker(currentDir: String): Intent {
|
|
return Intent(this, CustomLayoutPickerActivity::class.java)
|
|
.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false)
|
|
.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, true)
|
|
.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_DIR)
|
|
.putExtra(FilePickerActivity.EXTRA_START_PATH, currentDir)
|
|
}
|
|
|
|
/**
|
|
* Checks if the give permission is granted.
|
|
*
|
|
* @param permission the permission to check.
|
|
* @return true if it has permissions.
|
|
*/
|
|
fun Context.hasPermission(permission: String)
|
|
= ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
|
|
|
|
/**
|
|
* Returns the color for the given attribute.
|
|
*
|
|
* @param resource the attribute.
|
|
*/
|
|
fun Context.getResourceColor(@StringRes resource: Int): Int {
|
|
val typedArray = obtainStyledAttributes(intArrayOf(resource))
|
|
val attrValue = typedArray.getColor(0, 0)
|
|
typedArray.recycle()
|
|
return attrValue
|
|
}
|
|
|
|
/**
|
|
* Converts to dp.
|
|
*/
|
|
val Int.pxToDp: Int
|
|
get() = (this / Resources.getSystem().displayMetrics.density).toInt()
|
|
|
|
/**
|
|
* Converts to px.
|
|
*/
|
|
val Int.dpToPx: Int
|
|
get() = (this * Resources.getSystem().displayMetrics.density).toInt()
|
|
|
|
/**
|
|
* Property to get the notification manager from the context.
|
|
*/
|
|
val Context.notificationManager: NotificationManager
|
|
get() = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
|
|
|
/**
|
|
* Property to get the connectivity manager from the context.
|
|
*/
|
|
val Context.connectivityManager: ConnectivityManager
|
|
get() = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
|
|
|
/**
|
|
* Property to get the power manager from the context.
|
|
*/
|
|
val Context.powerManager: PowerManager
|
|
get() = getSystemService(Context.POWER_SERVICE) as PowerManager
|
|
|
|
/**
|
|
* Function used to send a local broadcast asynchronous
|
|
*
|
|
* @param intent intent that contains broadcast information
|
|
*/
|
|
fun Context.sendLocalBroadcast(intent: Intent) {
|
|
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
|
|
}
|
|
|
|
/**
|
|
* Function used to send a local broadcast synchronous
|
|
*
|
|
* @param intent intent that contains broadcast information
|
|
*/
|
|
fun Context.sendLocalBroadcastSync(intent: Intent) {
|
|
LocalBroadcastManager.getInstance(this).sendBroadcastSync(intent)
|
|
}
|
|
|
|
/**
|
|
* Function used to register local broadcast
|
|
*
|
|
* @param receiver receiver that gets registered.
|
|
*/
|
|
fun Context.registerLocalReceiver(receiver: BroadcastReceiver, filter: IntentFilter) {
|
|
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter)
|
|
}
|
|
|
|
/**
|
|
* Function used to unregister local broadcast
|
|
*
|
|
* @param receiver receiver that gets unregistered.
|
|
*/
|
|
fun Context.unregisterLocalReceiver(receiver: BroadcastReceiver) {
|
|
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver)
|
|
}
|
|
|
|
/**
|
|
* Returns true if the given service class is running.
|
|
*/
|
|
fun Context.isServiceRunning(serviceClass: Class<*>): Boolean {
|
|
val className = serviceClass.name
|
|
val manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
|
|
@Suppress("DEPRECATION")
|
|
return manager.getRunningServices(Integer.MAX_VALUE)
|
|
.any { className == it.service.className }
|
|
} |