改包名com.aiosman.ravenow
This commit is contained in:
9
app/src/main/java/com/aiosman/ravenow/exp/Bitmap.kt
Normal file
9
app/src/main/java/com/aiosman/ravenow/exp/Bitmap.kt
Normal file
@@ -0,0 +1,9 @@
|
||||
package com.aiosman.ravenow.exp
|
||||
|
||||
import android.graphics.Bitmap
|
||||
|
||||
fun Bitmap.rotate(degree: Int): Bitmap {
|
||||
val matrix = android.graphics.Matrix()
|
||||
matrix.postRotate(degree.toFloat())
|
||||
return Bitmap.createBitmap(this, 0, 0, this.width, this.height, matrix, true)
|
||||
}
|
||||
81
app/src/main/java/com/aiosman/ravenow/exp/Date.kt
Normal file
81
app/src/main/java/com/aiosman/ravenow/exp/Date.kt
Normal file
@@ -0,0 +1,81 @@
|
||||
package com.aiosman.ravenow.exp
|
||||
|
||||
import android.content.Context
|
||||
import android.icu.text.SimpleDateFormat
|
||||
import android.icu.util.Calendar
|
||||
import com.aiosman.ravenow.R
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
/**
|
||||
* 格式化时间为 xx 前
|
||||
*/
|
||||
fun Date.timeAgo(context: Context): String {
|
||||
val now = Date()
|
||||
val diffInMillis = now.time - this.time
|
||||
|
||||
val seconds = diffInMillis / 1000
|
||||
val minutes = seconds / 60
|
||||
val hours = minutes / 60
|
||||
val days = hours / 24
|
||||
val years = days / 365
|
||||
|
||||
return when {
|
||||
seconds < 60 -> context.getString(R.string.second_ago, seconds)
|
||||
minutes < 60 -> context.getString(R.string.minute_ago, minutes)
|
||||
hours < 24 -> context.getString(R.string.hour_ago, hours)
|
||||
days < 365 -> context.getString(R.string.days_ago, days)
|
||||
else -> SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(this)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化时间为 xx-xx
|
||||
*/
|
||||
fun Date.formatPostTime(): String {
|
||||
val now = Calendar.getInstance()
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar.time = this
|
||||
val year = calendar.get(Calendar.YEAR)
|
||||
var nowYear = now.get(Calendar.YEAR)
|
||||
val dateFormat = if (year == nowYear) {
|
||||
SimpleDateFormat("MM-dd", Locale.getDefault())
|
||||
} else {
|
||||
SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
|
||||
}
|
||||
return dateFormat.format(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* YYYY.DD.MM HH:MM
|
||||
*/
|
||||
fun Date.formatPostTime2(): String {
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar.time = this
|
||||
val year = calendar.get(Calendar.YEAR)
|
||||
val month = calendar.get(Calendar.MONTH) + 1
|
||||
val day = calendar.get(Calendar.DAY_OF_MONTH)
|
||||
val hour = calendar.get(Calendar.HOUR_OF_DAY)
|
||||
val minute = calendar.get(Calendar.MINUTE)
|
||||
return "$year.$month.$day $hour:$minute"
|
||||
}
|
||||
|
||||
fun Date.formatChatTime(context: Context): String {
|
||||
val now = Date()
|
||||
val diffInMillis = now.time - this.time
|
||||
|
||||
val seconds = TimeUnit.MILLISECONDS.toSeconds(diffInMillis)
|
||||
val minutes = TimeUnit.MILLISECONDS.toMinutes(diffInMillis)
|
||||
val hours = TimeUnit.MILLISECONDS.toHours(diffInMillis)
|
||||
val days = TimeUnit.MILLISECONDS.toDays(diffInMillis)
|
||||
val years = days / 365
|
||||
|
||||
return when {
|
||||
seconds < 60 -> context.getString(R.string.seconds_ago, seconds)
|
||||
minutes < 60 -> context.getString(R.string.minutes_ago, minutes)
|
||||
hours < 24 -> SimpleDateFormat("HH:mm", Locale.getDefault()).format(this)
|
||||
days < 365 -> SimpleDateFormat("MM-dd HH:mm", Locale.getDefault()).format(this)
|
||||
else -> SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(this)
|
||||
}
|
||||
}
|
||||
95
app/src/main/java/com/aiosman/ravenow/exp/StatusBarExp.kt
Normal file
95
app/src/main/java/com/aiosman/ravenow/exp/StatusBarExp.kt
Normal file
@@ -0,0 +1,95 @@
|
||||
package com.aiosman.ravenow.exp
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.res.Resources
|
||||
import android.os.Build
|
||||
import android.util.TypedValue
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowManager
|
||||
import androidx.annotation.ColorInt
|
||||
//import androidx.appcompat.app.AppCompatActivity
|
||||
|
||||
private const val COLOR_TRANSPARENT = 0
|
||||
|
||||
@SuppressLint("ObsoleteSdkInt")
|
||||
@JvmOverloads
|
||||
fun Activity.immersive(@ColorInt color: Int = COLOR_TRANSPARENT, darkMode: Boolean? = null) {
|
||||
when {
|
||||
Build.VERSION.SDK_INT >= 21 -> {
|
||||
when (color) {
|
||||
COLOR_TRANSPARENT -> {
|
||||
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
|
||||
var systemUiVisibility = window.decorView.systemUiVisibility
|
||||
systemUiVisibility = systemUiVisibility or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
systemUiVisibility = systemUiVisibility or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
||||
window.decorView.systemUiVisibility = systemUiVisibility
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
|
||||
window.statusBarColor = color
|
||||
}
|
||||
else -> {
|
||||
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
|
||||
var systemUiVisibility = window.decorView.systemUiVisibility
|
||||
systemUiVisibility = systemUiVisibility and View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
systemUiVisibility = systemUiVisibility and View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
||||
window.decorView.systemUiVisibility = systemUiVisibility
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
|
||||
window.statusBarColor = color
|
||||
}
|
||||
}
|
||||
}
|
||||
Build.VERSION.SDK_INT >= 19 -> {
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
|
||||
if (color != COLOR_TRANSPARENT) {
|
||||
setTranslucentView(window.decorView as ViewGroup, color)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (darkMode != null) {
|
||||
darkMode(darkMode)
|
||||
}
|
||||
}
|
||||
|
||||
@JvmOverloads
|
||||
fun Activity.darkMode(darkMode: Boolean = true) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
var systemUiVisibility = window.decorView.systemUiVisibility
|
||||
systemUiVisibility = if (darkMode) {
|
||||
systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
|
||||
} else {
|
||||
systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
|
||||
}
|
||||
window.decorView.systemUiVisibility = systemUiVisibility
|
||||
}
|
||||
}
|
||||
|
||||
private fun Context.setTranslucentView(container: ViewGroup, color: Int) {
|
||||
if (Build.VERSION.SDK_INT >= 19) {
|
||||
var simulateStatusBar: View? = container.findViewById(android.R.id.custom)
|
||||
if (simulateStatusBar == null && color != 0) {
|
||||
simulateStatusBar = View(container.context)
|
||||
simulateStatusBar.id = android.R.id.custom
|
||||
val lp = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight)
|
||||
container.addView(simulateStatusBar, lp)
|
||||
}
|
||||
simulateStatusBar?.setBackgroundColor(color)
|
||||
}
|
||||
}
|
||||
|
||||
val Context?.statusBarHeight: Int
|
||||
get() {
|
||||
this ?: return 0
|
||||
var result = 24
|
||||
val resId = resources.getIdentifier("status_bar_height", "dimen", "android")
|
||||
result = if (resId > 0) {
|
||||
resources.getDimensionPixelSize(resId)
|
||||
} else {
|
||||
TypedValue.applyDimension(
|
||||
TypedValue.COMPLEX_UNIT_DIP,
|
||||
result.toFloat(), Resources.getSystem().displayMetrics
|
||||
).toInt()
|
||||
}
|
||||
return result
|
||||
}
|
||||
9
app/src/main/java/com/aiosman/ravenow/exp/ViewModel.kt
Normal file
9
app/src/main/java/com/aiosman/ravenow/exp/ViewModel.kt
Normal file
@@ -0,0 +1,9 @@
|
||||
package com.aiosman.ravenow.exp
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
|
||||
inline fun <VM : ViewModel> viewModelFactory(crossinline f: () -> VM) =
|
||||
object : ViewModelProvider.Factory {
|
||||
override fun <T : ViewModel> create(aClass: Class<T>):T = f() as T
|
||||
}
|
||||
Reference in New Issue
Block a user