Skip to content

Commit 51f81be

Browse files
committed
refactor: 重构项目结构,更新依赖
1 parent 9eed457 commit 51f81be

14 files changed

+182
-131
lines changed

.idea/gradle.xml

+2-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle.kts

+3-3
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ android {
4141

4242
dependencies {
4343

44-
implementation("androidx.core:core-ktx:1.10.1")
44+
implementation("androidx.core:core-ktx:1.12.0")
4545
implementation("androidx.appcompat:appcompat:1.6.1")
46-
implementation("com.google.android.material:material:1.9.0")
46+
implementation("com.google.android.material:material:1.11.0")
4747
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
4848
testImplementation("junit:junit:4.13.2")
4949
androidTestImplementation("androidx.test.ext:junit:1.1.5")
5050
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
5151

52-
implementation("com.squareup.okhttp3:okhttp:4.11.0")
52+
implementation("com.squareup.okhttp3:okhttp:4.12.0")
5353
implementation("com.google.code.gson:gson:2.10.1")
5454
}

app/src/main/AndroidManifest.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
android:theme="@style/Theme.QQVersionList"
1616
tools:targetApi="31">
1717
<activity
18-
android:name=".MainActivity"
18+
android:name=".ui.MainActivity"
1919
android:exported="true">
2020
<intent-filter>
2121
<action android:name="android.intent.action.MAIN" />

app/src/main/java/com/xiaoniu/qqversionlist/Util.kt

-33
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
1-
package com.xiaoniu.qqversionlist
1+
package com.xiaoniu.qqversionlist.ui
22

33
import android.app.ProgressDialog
4-
import android.content.ClipData
5-
import android.content.ClipboardManager
64
import android.os.Bundle
7-
import android.util.Log
85
import android.view.View
9-
import android.widget.Toast
106
import androidx.appcompat.app.AppCompatActivity
7+
import androidx.recyclerview.widget.LinearLayoutManager
118
import com.google.android.material.dialog.MaterialAlertDialogBuilder
12-
import com.xiaoniu.qqversionlist.Util.Companion.getVersionBig
139
import com.xiaoniu.qqversionlist.databinding.ActivityMainBinding
10+
import com.xiaoniu.qqversionlist.util.ClipboardUtil.copyText
11+
import com.xiaoniu.qqversionlist.util.InfoUtil.dlgErr
12+
import com.xiaoniu.qqversionlist.util.InfoUtil.toasts
13+
import com.xiaoniu.qqversionlist.util.LogUtil.log
14+
import com.xiaoniu.qqversionlist.util.SpUtil
15+
import com.xiaoniu.qqversionlist.util.StringUtil.getVersionBig
1416
import okhttp3.OkHttpClient
17+
import okhttp3.Request
1518
import java.lang.Thread.sleep
1619
import kotlin.concurrent.thread
1720

@@ -24,11 +27,19 @@ class MainActivity : AppCompatActivity() {
2427
binding = ActivityMainBinding.inflate(layoutInflater)
2528
setContentView(binding.root)
2629

30+
initButtons()
31+
initSpinner()
32+
initData()
33+
34+
binding.btnGet.performClick()
35+
}
36+
37+
private fun initButtons() {
2738
binding.btnGet.setOnClickListener {
2839
thread {
2940
try {
3041
val okHttpClient = OkHttpClient()
31-
val request = okhttp3.Request.Builder()
42+
val request = Request.Builder()
3243
.url("https://im.qq.com/rainbow/androidQQVersionList")
3344
.build()
3445
val response = okHttpClient.newCall(request).execute()
@@ -39,15 +50,15 @@ class MainActivity : AppCompatActivity() {
3950
"start: $start, end: $end".log()
4051
val totalJson = responseData.substring(start, end)//.apply { log() }
4152
val qqVersion = totalJson.split("},{").reversed().map {
42-
val start = it.indexOf("{\"versions")
43-
val end = it.indexOf(",\"length")
44-
it.substring(start, end)
53+
val pstart = it.indexOf("{\"versions")
54+
val pend = it.indexOf(",\"length")
55+
it.substring(pstart, pend)
4556
}
4657
runOnUiThread {
4758
adapter = MyAdapter()
4859
binding.rvContent.adapter = adapter
4960
binding.rvContent.layoutManager =
50-
androidx.recyclerview.widget.LinearLayoutManager(this@MainActivity)
61+
LinearLayoutManager(this@MainActivity)
5162
adapter.setData(qqVersion)
5263
binding.etVersionBig.setText(
5364
qqVersion.first().toString().getVersionBig()
@@ -62,32 +73,6 @@ class MainActivity : AppCompatActivity() {
6273
}
6374
}
6475

65-
val memVersion = getSharedPreferences("data", MODE_PRIVATE).getInt("version", -1)
66-
if (memVersion != -1) {
67-
binding.spinnerVersion.setSelection(memVersion)
68-
}
69-
binding.spinnerVersion.onItemSelectedListener = object :
70-
android.widget.AdapterView.OnItemSelectedListener {
71-
override fun onItemSelected(
72-
parent: android.widget.AdapterView<*>?,
73-
view: View?,
74-
position: Int,
75-
id: Long
76-
) {
77-
if (position == 0) {
78-
binding.etVersionSmall.visibility = View.VISIBLE
79-
} else {
80-
binding.etVersionSmall.visibility = View.GONE
81-
}
82-
getSharedPreferences("data", MODE_PRIVATE).edit()
83-
.putInt("version", position)
84-
.apply()
85-
}
86-
87-
override fun onNothingSelected(parent: android.widget.AdapterView<*>?) {
88-
}
89-
}
90-
9176
binding.btnGuess.setOnClickListener {
9277
binding.llGuess.visibility = if (binding.llGuess.visibility == View.VISIBLE) {
9378
View.GONE
@@ -96,18 +81,12 @@ class MainActivity : AppCompatActivity() {
9681
}
9782
}
9883

99-
val memVersionSmall = getSharedPreferences("data", MODE_PRIVATE).getInt("versionSmall", -1)
100-
if (memVersionSmall != -1) {
101-
binding.etVersionSmall.setText(memVersionSmall.toString())
102-
}
10384
binding.btnGuessStart.setOnClickListener {
10485
try {
10586
val versionBig = binding.etVersionBig.text.toString()
10687
val versionSmall = binding.etVersionSmall.text.toString().toInt()
10788
if (versionSmall % 5 != 0) throw Exception("小版本确定不填5的倍数?")
108-
getSharedPreferences("data", MODE_PRIVATE).edit()
109-
.putInt("versionSmall", versionSmall)
110-
.apply()
89+
SpUtil.putInt(this, "versionSmall", versionSmall)
11190
val mode = binding.spinnerVersion.selectedItemPosition
11291
guessUrl(versionBig, versionSmall, mode)
11392
} catch (e: Exception) {
@@ -124,37 +103,63 @@ class MainActivity : AppCompatActivity() {
124103
.show()
125104
}
126105

106+
}
127107

128-
binding.btnGet.performClick()
108+
private fun initData() {
109+
val memVersion = SpUtil.getInt(this, "version", -1)
110+
if (memVersion != -1) {
111+
binding.spinnerVersion.setSelection(memVersion)
112+
}
113+
val memVersionSmall = SpUtil.getInt(this, "versionSmall", -1)
114+
if (memVersionSmall != -1) {
115+
binding.etVersionSmall.setText(memVersionSmall.toString())
116+
}
129117
}
130118

131-
fun Any.log(): Any {
132-
Log.i("QQVersionList", this.toString())
133-
return this
119+
private fun initSpinner() {
120+
binding.spinnerVersion.onItemSelectedListener = object :
121+
android.widget.AdapterView.OnItemSelectedListener {
122+
override fun onItemSelected(
123+
parent: android.widget.AdapterView<*>?,
124+
view: View?,
125+
position: Int,
126+
id: Long
127+
) {
128+
if (position == 0) {
129+
binding.etVersionSmall.visibility = View.VISIBLE
130+
} else {
131+
binding.etVersionSmall.visibility = View.GONE
132+
}
133+
SpUtil.putInt(this@MainActivity, "version", position)
134+
}
135+
136+
override fun onNothingSelected(parent: android.widget.AdapterView<*>?) {
137+
}
138+
}
134139
}
135140

136141

137142
//https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_8.9.75.XXXXX_64.apk
138-
fun guessUrl(versionBig: String, versionSmall: Int, mode: Int) {
143+
private fun guessUrl(versionBig: String, versionSmall: Int, mode: Int) {
139144
lateinit var progressDialog: ProgressDialog
140-
var status = 0 //0:进行中,1:暂停,2:结束
145+
var status = STATUS_ONGOING
141146

142-
var link: String = ""
147+
var link = ""
143148
val thr = Thread {
144149
var vSmall = versionSmall
145150
try {
146151
while (true) {
147152
when (status) {
148-
0 -> {
149-
if (mode == 0) {
153+
STATUS_ONGOING -> {
154+
if (mode == MODE_TEST) {
150155
link =
151156
"https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_$versionBig.${vSmall}_64.apk"
152157
} else {
153158
if (link == "") {
154159
link =
155160
"https://downv6.qq.com/qqweb/QQ_1/android_apk/Android_${versionBig}_64.apk"
156161
} else if (link.endsWith("HB.apk")) {
157-
status = 2
162+
status = STATUS_END
158163
continue
159164
} else {
160165
link =
@@ -163,40 +168,39 @@ class MainActivity : AppCompatActivity() {
163168
}
164169
progressDialog.setMessage("正在猜测下载地址:$link")
165170
val okHttpClient = OkHttpClient()
166-
val request = okhttp3.Request.Builder()
171+
val request = Request.Builder()
167172
.url(link)
168173
.build()
169174
val response = okHttpClient.newCall(request).execute()
170175
val success = response.isSuccessful
171176
if (success) {
172-
status = 1
177+
status = STATUS_PAUSE
173178
runOnUiThread {
174179
MaterialAlertDialogBuilder(this)
175180
.setTitle("猜测成功")
176181
.setMessage("下载地址:$link")
177182
.setPositiveButton("复制并停止") { _, _ ->
178183
copyText(link)
179-
status = 2
184+
status = STATUS_END
180185
}
181186
.setNegativeButton("仅停止") { _, _ ->
182-
status = 2
187+
status = STATUS_END
183188
}
184189
.setNeutralButton("继续猜测") { _, _ ->
185-
status = 0
190+
status = STATUS_ONGOING
186191
}
187192
.setCancelable(false)
188193
.show()
189194
}
190195
}
191196
vSmall += 5
192-
193197
}
194198

195-
1 -> {
199+
STATUS_PAUSE -> {
196200
sleep(500)
197201
}
198202

199-
2 -> {
203+
STATUS_END -> {
200204
toasts("已停止猜测")
201205
progressDialog.dismiss()
202206
break
@@ -213,35 +217,21 @@ class MainActivity : AppCompatActivity() {
213217
setMessage("正在猜测下载地址")
214218
setCancelable(true)
215219
setOnCancelListener {
216-
status = 2
220+
status = STATUS_END
217221
}
218222
show()
219223
}
220224
thr.start()
221225
}
222226

223-
fun copyText(text: String) {
224-
val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
225-
clipboardManager.setPrimaryClip(ClipData.newPlainText("", text))
226-
toasts("已复制:$text")
227-
}
228227

229-
fun toasts(text: String) {
230-
runOnUiThread {
231-
Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
232-
}
233-
}
228+
companion object {
229+
const val STATUS_ONGOING = 0
230+
const val STATUS_PAUSE = 1
231+
const val STATUS_END = 2
234232

235-
fun dlgErr(e: Exception) {
236-
runOnUiThread {
237-
MaterialAlertDialogBuilder(this@MainActivity)
238-
.setTitle("程序出错,联系小牛")
239-
.setMessage(e.toString())
240-
.setPositiveButton("确定", null)
241-
.setNeutralButton("复制") { _, _ ->
242-
copyText(e.toString())
243-
}
244-
.show()
245-
}
233+
const val MODE_TEST = 0
234+
const val MODE_OFFICIAL = 1
246235
}
236+
247237
}

app/src/main/java/com/xiaoniu/qqversionlist/MyAdapter.kt app/src/main/java/com/xiaoniu/qqversionlist/ui/MyAdapter.kt

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.xiaoniu.qqversionlist
1+
package com.xiaoniu.qqversionlist.ui
22

33
import android.annotation.SuppressLint
44
import android.view.View
@@ -7,9 +7,10 @@ import android.widget.TextView
77
import androidx.core.view.setPadding
88
import androidx.recyclerview.widget.RecyclerView
99
import com.google.android.material.dialog.MaterialAlertDialogBuilder
10-
import com.xiaoniu.qqversionlist.Util.Companion.getSize
11-
import com.xiaoniu.qqversionlist.Util.Companion.getVersionBig
12-
import com.xiaoniu.qqversionlist.Util.Companion.toPrettyFormat
10+
import com.xiaoniu.qqversionlist.R
11+
import com.xiaoniu.qqversionlist.util.StringUtil.getSize
12+
import com.xiaoniu.qqversionlist.util.StringUtil.getVersionBig
13+
import com.xiaoniu.qqversionlist.util.StringUtil.toPrettyFormat
1314

1415
class MyAdapter : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
1516

0 commit comments

Comments
 (0)