Update WeatherData.kt && WeatherView.kt

This commit is contained in:
LittleTurtle2333
2023-02-27 17:43:58 +08:00
parent 51759aa199
commit 3fbfaa218f
2 changed files with 178 additions and 0 deletions

View File

@@ -0,0 +1,98 @@
package com.lt2333.simplicitytools.views
import android.annotation.SuppressLint
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.database.ContentObserver
import android.net.Uri
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.text.TextUtils
import android.widget.Toast
@SuppressLint("ViewConstructor", "SetTextI18n")
class WeatherData(val context: Context?, private val showCity: Boolean) {
private val mContext: Context
private val WEATHER_URI = Uri.parse("content://weather/weather")
private val mHandler: Handler
private val mWeatherObserver: ContentObserver?
private val mWeatherRunnable: WeatherRunnable
var weatherData: String = "\n"
var callBacks: () -> Unit = {}
init {
mHandler =
object : Handler(Looper.getMainLooper()) {
override fun handleMessage(message: Message) {
val str = message.obj as String
weatherData = if (TextUtils.isEmpty(str)) "\n" else "$str\n"
callBacks()
}
}
mWeatherObserver = WeatherContentObserver(mHandler)
mContext = context!!
mWeatherRunnable = WeatherRunnable()
context.contentResolver.registerContentObserver(WEATHER_URI, true, mWeatherObserver)
updateWeatherInfo()
}
private inner class WeatherContentObserver(handler: Handler?) : ContentObserver(handler) {
override fun onChange(z: Boolean) {
updateWeatherInfo()
}
}
inner class WeatherRunnable : Runnable {
override fun run() {
var str = ""
try {
val query = mContext.contentResolver.query(WEATHER_URI, null, null, null, null)
if (query != null) {
if (query.moveToFirst()) {
str = if (showCity) {
query.getString(query.getColumnIndexOrThrow("city_name")) + " " + query.getString(query.getColumnIndexOrThrow("description")) + " " + query.getString(query.getColumnIndexOrThrow("temperature"))
} else {
query.getString(query.getColumnIndexOrThrow("description")) + " " + query.getString(query.getColumnIndexOrThrow("temperature"))
}
}
query.close()
}
} catch (e: Exception) {
}
val obtainMessage2 = mHandler.obtainMessage()
obtainMessage2.what = 100
obtainMessage2.obj = str
mHandler.sendMessage(obtainMessage2)
}
}
private fun updateWeatherInfo() {
mHandler.removeCallbacks(mWeatherRunnable)
mHandler.postDelayed(mWeatherRunnable, 200)
}
fun onDetachedFromWindow() {
if (mWeatherObserver != null) {
mContext.contentResolver.unregisterContentObserver(mWeatherObserver)
}
}
fun startWeatherApp() {
try {
val intent = Intent().apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
component = ComponentName(
"com.miui.weather2",
"com.miui.weather2.ActivityWeatherMain"
)
}
mContext.startActivity(intent)
} catch (e: Exception) {
Toast.makeText(context, "启动失败", Toast.LENGTH_LONG).show()
}
}
}

View File

@@ -0,0 +1,80 @@
package com.lt2333.simplicitytools.views
import android.annotation.SuppressLint
import android.content.Context
import android.database.ContentObserver
import android.net.Uri
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.text.TextUtils
import android.widget.TextView
@SuppressLint("ViewConstructor")
class WeatherView(context: Context?, private val showCity: Boolean) : TextView(context) {
private val mContext: Context
private val weatherUri = Uri.parse("content://weather/weather")
private val mHandler: Handler
private val mWeatherObserver: ContentObserver?
private val mWeatherRunnable: WeatherRunnable
init {
mHandler =
object : Handler(Looper.getMainLooper()) {
override fun handleMessage(message: Message) {
val str = message.obj as String
this@WeatherView.text = if (TextUtils.isEmpty(str)) " " else str
}
}
mWeatherObserver = WeatherContentObserver(mHandler)
mContext = context!!
mWeatherRunnable = WeatherRunnable()
context.contentResolver.registerContentObserver(weatherUri, true, mWeatherObserver)
updateWeatherInfo()
}
private inner class WeatherContentObserver(handler: Handler?) : ContentObserver(handler) {
override fun onChange(z: Boolean) {
updateWeatherInfo()
}
}
inner class WeatherRunnable : Runnable {
override fun run() {
var str = ""
try {
val query = mContext.contentResolver.query(weatherUri, null, null, null, null)
if (query != null) {
if (query.moveToFirst()) {
str = if (showCity) {
query.getString(query.getColumnIndexOrThrow("city_name")) + " " + query.getString(query.getColumnIndexOrThrow("description")) + " " + query.getString(query.getColumnIndexOrThrow("temperature"))
} else {
query.getString(query.getColumnIndexOrThrow("description")) + " " + query.getString(query.getColumnIndexOrThrow("temperature"))
}
}
query.close()
}
} catch (e: Exception) {
}
val obtainMessage2 = mHandler.obtainMessage()
obtainMessage2.what = 100
obtainMessage2.obj = str
mHandler.sendMessage(obtainMessage2)
}
}
private fun updateWeatherInfo() {
mHandler.removeCallbacks(mWeatherRunnable)
mHandler.postDelayed(mWeatherRunnable, 200)
}
public override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
if (mWeatherObserver != null) {
mContext.contentResolver.unregisterContentObserver(mWeatherObserver)
}
}
}