改包名com.aiosman.ravenow

This commit is contained in:
2024-11-17 20:07:42 +08:00
parent 914cfca6be
commit 074244c0f8
168 changed files with 897 additions and 970 deletions

View 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)
}

View 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)
}
}

View 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
}

View 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
}