From 3fbfaa218f2e1a417479b8772f71f922265df724 Mon Sep 17 00:00:00 2001 From: LittleTurtle2333 Date: Mon, 27 Feb 2023 17:43:58 +0800 Subject: [PATCH] Update WeatherData.kt && WeatherView.kt --- .../simplicitytools/views/WeatherData.kt | 98 +++++++++++++++++++ .../simplicitytools/views/WeatherView.kt | 80 +++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 app/src/main/java/com/lt2333/simplicitytools/views/WeatherData.kt create mode 100644 app/src/main/java/com/lt2333/simplicitytools/views/WeatherView.kt diff --git a/app/src/main/java/com/lt2333/simplicitytools/views/WeatherData.kt b/app/src/main/java/com/lt2333/simplicitytools/views/WeatherData.kt new file mode 100644 index 00000000..738120a9 --- /dev/null +++ b/app/src/main/java/com/lt2333/simplicitytools/views/WeatherData.kt @@ -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() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/views/WeatherView.kt b/app/src/main/java/com/lt2333/simplicitytools/views/WeatherView.kt new file mode 100644 index 00000000..395f3eb7 --- /dev/null +++ b/app/src/main/java/com/lt2333/simplicitytools/views/WeatherView.kt @@ -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) + } + } + +} \ No newline at end of file