Move from java/ to kotlin/ directory

Android 12 dynamic color usage on login screen
This commit is contained in:
2021-08-31 02:18:29 +03:00
parent 2453e534ae
commit 1209c37e24
135 changed files with 140 additions and 57 deletions
@@ -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)
// }
// }
// }
}
}
}