Move from java/ to kotlin/ directory
Android 12 dynamic color usage on login screen
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
package com.meloda.fast.common
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.res.Resources
|
||||
import android.database.sqlite.SQLiteDatabase
|
||||
import android.os.Handler
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import androidx.core.content.pm.PackageInfoCompat
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.meloda.fast.BuildConfig
|
||||
import com.meloda.fast.R
|
||||
import com.meloda.fast.database.DatabaseHelper
|
||||
import com.meloda.fast.util.AndroidUtils
|
||||
import dagger.hilt.android.HiltAndroidApp
|
||||
import org.acra.ACRA
|
||||
import org.acra.ReportingInteractionMode
|
||||
import org.acra.annotation.ReportsCrashes
|
||||
import java.util.*
|
||||
|
||||
@SuppressLint("NonConstantResourceId")
|
||||
@ReportsCrashes(
|
||||
mailTo = "lischenkodev@gmail.com",
|
||||
mode = ReportingInteractionMode.DIALOG,
|
||||
resDialogTitle = R.string.app_has_been_crashed,
|
||||
resDialogText = R.string.empty,
|
||||
resDialogTheme = R.style.AppTheme_Dialog,
|
||||
resDialogPositiveButtonText = R.string.send_crash_report,
|
||||
resDialogNegativeButtonText = R.string.ok
|
||||
)
|
||||
@HiltAndroidApp
|
||||
class AppGlobal : Application() {
|
||||
|
||||
companion object {
|
||||
|
||||
lateinit var inputMethodManager: InputMethodManager
|
||||
|
||||
lateinit var preferences: SharedPreferences
|
||||
lateinit var locale: Locale
|
||||
lateinit var handler: Handler
|
||||
lateinit var resources: Resources
|
||||
lateinit var packageName: String
|
||||
lateinit var instance: AppGlobal
|
||||
|
||||
lateinit var dbHelper: DatabaseHelper
|
||||
lateinit var database: SQLiteDatabase
|
||||
|
||||
lateinit var packageManager: PackageManager
|
||||
|
||||
var versionName = ""
|
||||
var versionCode = 0L
|
||||
|
||||
var screenWidth = 0
|
||||
var screenHeight = 0
|
||||
|
||||
fun post(runnable: Runnable) {
|
||||
handler.post(runnable)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
instance = this
|
||||
|
||||
if (!BuildConfig.DEBUG) {
|
||||
ACRA.init(this)
|
||||
}
|
||||
|
||||
preferences = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
handler = Handler(mainLooper)
|
||||
locale = Locale.getDefault()
|
||||
|
||||
dbHelper = DatabaseHelper(this)
|
||||
database = dbHelper.writableDatabase
|
||||
|
||||
val info = packageManager.getPackageInfo(this.packageName, PackageManager.GET_ACTIVITIES)
|
||||
versionName = info.versionName
|
||||
versionCode = PackageInfoCompat.getLongVersionCode(info)
|
||||
|
||||
Companion.resources = resources
|
||||
Companion.packageName = packageName
|
||||
Companion.packageManager = packageManager
|
||||
|
||||
screenWidth = AndroidUtils.getDisplayWidth()
|
||||
screenHeight = AndroidUtils.getDisplayHeight()
|
||||
|
||||
inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
package com.meloda.fast.common
|
||||
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import com.meloda.fast.R
|
||||
|
||||
object FragmentSwitcher {
|
||||
|
||||
fun getCurrentFragment(fragmentManager: FragmentManager): Fragment? {
|
||||
val fragments = fragmentManager.fragments
|
||||
|
||||
if (fragments.isEmpty()) throw RuntimeException("FragmentManager's fragments is empty")
|
||||
|
||||
for (fragment in fragments) {
|
||||
if (fragment.isVisible) {
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
fun addFragments(
|
||||
fragmentManager: FragmentManager,
|
||||
containerId: Int,
|
||||
fragments: Collection<Fragment>
|
||||
) {
|
||||
val transaction = fragmentManager.beginTransaction()
|
||||
|
||||
for (fragment in fragments) {
|
||||
transaction.add(containerId, fragment, fragment.javaClass.simpleName)
|
||||
}
|
||||
|
||||
transaction.commitNow()
|
||||
}
|
||||
|
||||
fun showFragment(fragmentManager: FragmentManager, tag: String) {
|
||||
showFragment(fragmentManager, tag, false)
|
||||
}
|
||||
|
||||
fun showFragment(
|
||||
fragmentManager: FragmentManager,
|
||||
tag: String,
|
||||
hideOthers: Boolean,
|
||||
containerId: Int = R.id.fragmentContainer
|
||||
) {
|
||||
val fragments = fragmentManager.fragments
|
||||
|
||||
if (fragments.isEmpty()) throw RuntimeException("FragmentManager's fragments is empty")
|
||||
|
||||
var fragmentToShow: Fragment? = null
|
||||
|
||||
for (fragment in fragments) {
|
||||
if (fragment.tag != null && fragment.tag == tag) {
|
||||
fragmentToShow = fragment
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
val transaction = fragmentManager.beginTransaction()
|
||||
|
||||
if (fragmentToShow == null) {
|
||||
throw NullPointerException("Required fragment is null")
|
||||
} else {
|
||||
transaction.show(fragmentToShow)
|
||||
}
|
||||
|
||||
if (hideOthers) {
|
||||
for (fragment in fragments) {
|
||||
if (fragment.tag != null && fragment.tag == tag) continue
|
||||
transaction.hide(fragment)
|
||||
}
|
||||
}
|
||||
|
||||
transaction.commit()
|
||||
}
|
||||
|
||||
fun clearFragments(fragmentManager: FragmentManager) {
|
||||
val fragments = fragmentManager.fragments
|
||||
|
||||
if (fragments.isEmpty()) throw RuntimeException("FragmentManager's fragments is empty")
|
||||
|
||||
val transaction = fragmentManager.beginTransaction()
|
||||
|
||||
for (fragment in fragments) {
|
||||
transaction.remove(fragment)
|
||||
}
|
||||
|
||||
transaction.commitNow()
|
||||
}
|
||||
|
||||
fun hideFragments(fragmentManager: FragmentManager) {
|
||||
val fragments = fragmentManager.fragments
|
||||
|
||||
if (fragments.isEmpty()) throw RuntimeException("FragmentManager's fragments is empty")
|
||||
|
||||
val transaction = fragmentManager.beginTransaction()
|
||||
|
||||
for (fragment in fragments) {
|
||||
transaction.hide(fragment)
|
||||
}
|
||||
|
||||
transaction.commitNow()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package com.meloda.fast.common
|
||||
|
||||
import android.content.Context
|
||||
import android.content.IntentFilter
|
||||
import com.meloda.fast.receiver.MinuteReceiver
|
||||
import java.util.*
|
||||
|
||||
object TimeManager {
|
||||
|
||||
var currentHour = 0
|
||||
var currentMinute = 0
|
||||
var currentSecond = 0
|
||||
|
||||
private val onHourChangeListeners: ArrayList<OnHourChangeListener> = ArrayList()
|
||||
private val onMinuteChangeListeners: ArrayList<OnMinuteChangeListener> = ArrayList()
|
||||
private val onSecondChangeListeners: ArrayList<OnSecondChangeListener> = ArrayList()
|
||||
private val onTimeChangeListeners: ArrayList<OnTimeChangeListener> = ArrayList()
|
||||
|
||||
fun init(context: Context) {
|
||||
context.registerReceiver(MinuteReceiver(), IntentFilter("android.intent.action.TIME_TICK"))
|
||||
|
||||
addOnMinuteChangeListener(minuteChangeListener)
|
||||
}
|
||||
|
||||
private var minuteChangeListener = object : OnMinuteChangeListener {
|
||||
override fun onMinuteChange(currentMinute: Int) {
|
||||
TimeManager.currentMinute = currentMinute
|
||||
}
|
||||
}
|
||||
|
||||
fun destroy() {
|
||||
removeOnMinuteChangeListener(minuteChangeListener)
|
||||
}
|
||||
|
||||
fun broadcastMinute() {
|
||||
for (onMinuteChangeListener in onMinuteChangeListeners) {
|
||||
onMinuteChangeListener.onMinuteChange(0)
|
||||
}
|
||||
}
|
||||
|
||||
val isMorning = currentHour in 7..11
|
||||
|
||||
val isAfternoon = currentHour in 12..16
|
||||
|
||||
val isEvening = currentHour in 17..22
|
||||
|
||||
val isNight = currentHour == 23 || currentHour < 6 && currentHour > -1
|
||||
|
||||
fun addOnHourChangeListener(onHourChangeListeners: OnHourChangeListener) {
|
||||
TimeManager.onHourChangeListeners.add(onHourChangeListeners)
|
||||
}
|
||||
|
||||
fun removeOnHourChangeListener(onHourChangeListener: OnHourChangeListener?) {
|
||||
onHourChangeListeners.remove(onHourChangeListener)
|
||||
}
|
||||
|
||||
fun addOnMinuteChangeListener(onMinuteChangeListener: OnMinuteChangeListener) {
|
||||
onMinuteChangeListeners.add(onMinuteChangeListener)
|
||||
}
|
||||
|
||||
fun removeOnMinuteChangeListener(onMinuteChangeListener: OnMinuteChangeListener?) {
|
||||
onMinuteChangeListeners.remove(onMinuteChangeListener)
|
||||
}
|
||||
|
||||
fun addOnSecondChangeListener(onSecondChangeListener: OnSecondChangeListener) {
|
||||
onSecondChangeListeners.add(onSecondChangeListener)
|
||||
}
|
||||
|
||||
fun removeOnSecondChangeListener(onSecondChangeListener: OnSecondChangeListener?) {
|
||||
onSecondChangeListeners.remove(onSecondChangeListener)
|
||||
}
|
||||
|
||||
fun addOnTimeChangeListener(onTimeChangeListener: OnTimeChangeListener) {
|
||||
onTimeChangeListeners.add(onTimeChangeListener)
|
||||
}
|
||||
|
||||
fun removeOnTimeChangeListener(onTimeChangeListener: OnTimeChangeListener?) {
|
||||
onTimeChangeListeners.remove(onTimeChangeListener)
|
||||
}
|
||||
|
||||
interface OnHourChangeListener {
|
||||
fun onHourChange(currentHour: Int)
|
||||
}
|
||||
|
||||
interface OnMinuteChangeListener {
|
||||
fun onMinuteChange(currentMinute: Int)
|
||||
}
|
||||
|
||||
interface OnSecondChangeListener {
|
||||
fun onSecondChange(currentSecond: Int)
|
||||
}
|
||||
|
||||
interface OnTimeChangeListener {
|
||||
fun onHourChange(currentHour: Int)
|
||||
fun onMinuteChange(currentMinute: Int)
|
||||
fun onSecondChange(currentSecond: Int)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package com.meloda.fast.common
|
||||
|
||||
import android.util.Log
|
||||
import androidx.collection.arrayMapOf
|
||||
import com.meloda.fast.concurrent.TaskManager
|
||||
import com.meloda.fast.BuildConfig
|
||||
import com.meloda.fast.model.NewUpdateInfo
|
||||
import com.meloda.fast.net.HttpRequest
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONObject
|
||||
|
||||
object UpdateManager {
|
||||
|
||||
interface OnUpdateListener {
|
||||
fun onNewUpdate(updateInfo: NewUpdateInfo)
|
||||
|
||||
fun onNoUpdates()
|
||||
}
|
||||
|
||||
private const val checkLink = "https://melodev.procsec.top/vkm/project_vkm_ota.json"
|
||||
|
||||
private const val PRODUCT_NAME = "project_vkm"
|
||||
private const val BRANCH = "alpha"
|
||||
private const val OFFSET = 0
|
||||
|
||||
private const val TAG = "UpdateManager"
|
||||
|
||||
fun checkUpdates(onUpdateListener: OnUpdateListener) {
|
||||
TaskManager.execute {
|
||||
val newLink = "https://temply.procsec.top/prop/deploy/api/method/getOTA"
|
||||
|
||||
val params = arrayMapOf<String, String>()
|
||||
params["product"] = PRODUCT_NAME
|
||||
params["branch"] = BRANCH
|
||||
params["offset"] = OFFSET.toString()
|
||||
params["code"] = AppGlobal.versionCode.toString()
|
||||
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "Request started")
|
||||
}
|
||||
|
||||
HttpRequest[newLink, params].asString().let {
|
||||
AppGlobal.post {
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.d(TAG, "response: $it")
|
||||
}
|
||||
|
||||
val response: Any = if (it == "[]") JSONArray(it) else JSONObject(it)
|
||||
|
||||
val newUpdateInfo: NewUpdateInfo? =
|
||||
if (response is JSONArray) null else NewUpdateInfo(response as JSONObject)
|
||||
|
||||
if (response is JSONArray || newUpdateInfo?.version?.isEmpty() == true || newUpdateInfo?.version == AppGlobal.versionName) {
|
||||
onUpdateListener.onNoUpdates()
|
||||
return@post
|
||||
} else {
|
||||
newUpdateInfo?.let { onUpdateListener.onNewUpdate(it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// HttpRequest[checkLink].asString().let {
|
||||
// val response = JSONObject(it)
|
||||
//
|
||||
// val updateInfo = UpdateInfo(response)
|
||||
//
|
||||
// AppGlobal.handler.post {
|
||||
// if (updateInfo.version.isEmpty() || updateInfo.version == AppGlobal.versionName) {
|
||||
// onUpdateListener.onNoUpdates()
|
||||
// return@post
|
||||
// }
|
||||
//
|
||||
// if (AppGlobal.versionName != updateInfo.version) {
|
||||
// onUpdateListener.onNewUpdate(updateInfo)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user