pref: 优化一键签到磁贴样式

This commit is contained in:
HuanChengFly 2020-11-14 15:51:04 +08:00
parent 129b9e7056
commit a38ff0a6c3
3 changed files with 63 additions and 10 deletions

View File

@ -7,8 +7,10 @@ import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Binder
import android.os.Build
import android.os.Handler
import android.os.IBinder
import android.widget.Toast
import androidx.core.app.NotificationCompat
import com.huanchengfly.tieba.post.R
@ -32,7 +34,48 @@ import java.util.concurrent.ThreadLocalRandom
class OKSignService : IntentService(TAG) {
private val signData: MutableList<SignDataBean> = ArrayList()
private var position = 0
private var successCount = 0
lateinit var manager: NotificationManager
private var okSignProgressListener: OKSignProgressListener? = null
fun setProgressListener(listener: OKSignProgressListener?) {
okSignProgressListener = listener
}
interface OKSignProgressListener {
fun onStart(
total: Int
)
fun onFinish(
success: Boolean,
signedCount: Int,
total: Int
)
fun onProgress(
signResultBean: SignResultBean,
current: Int,
total: Int
)
fun onFailure(
current: Int,
total: Int,
errorCode: Int,
errorMsg: String
)
}
inner class OKSignBinder : Binder() {
fun getService(): OKSignService {
return this@OKSignService
}
}
override fun onBind(intent: Intent?): IBinder? {
return OKSignBinder()
}
override fun onCreate() {
super.onCreate()
@ -48,12 +91,14 @@ class OKSignService : IntentService(TAG) {
private fun startSign() {
if (signData.size > 0) {
okSignProgressListener?.onStart(signData.size)
position = 0
sign(signData[position])
updateNotification("即将开始签到", null, 100, 100, true)
Toast.makeText(this@OKSignService, "签到已开始,可在通知栏查看进度", Toast.LENGTH_SHORT).show()
} else {
updateNotification("签到完成", "没有可签到的吧", Intent(this, MainActivity::class.java))
okSignProgressListener?.onFinish(true, 0, 0)
updateNotification(getString(R.string.title_oksign_finish), "没有可签到的吧", Intent(this, MainActivity::class.java))
stopForeground(true)
}
}
@ -61,7 +106,7 @@ class OKSignService : IntentService(TAG) {
private fun buildNotification(title: String, text: String?): NotificationCompat.Builder {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel("1",
"一键签到", NotificationManager.IMPORTANCE_LOW)
getString(R.string.title_oksign), NotificationManager.IMPORTANCE_LOW)
channel.enableLights(false)
channel.setShowBadge(false)
manager.createNotificationChannel(channel)
@ -69,7 +114,7 @@ class OKSignService : IntentService(TAG) {
return NotificationCompat.Builder(this, "1")
.setContentText(text)
.setContentTitle(title)
.setSubText("一键签到")
.setSubText(getString(R.string.title_oksign))
.setSmallIcon(R.drawable.ic_oksign)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
@ -106,15 +151,18 @@ class OKSignService : IntentService(TAG) {
TiebaApi.getInstance().sign(kw, data.tbs).enqueue(object : Callback<SignResultBean> {
override fun onFailure(call: Call<SignResultBean>, t: Throwable) {
if (t is TiebaException) {
okSignProgressListener?.onFailure(position + 1, signData.size, t.code, "${t.message}")
updateNotification(getString(R.string.title_signing_progress, position, signData.size), "${kw}× (${t.code}) ${t.message}", position, signData.size, false)
} else {
okSignProgressListener?.onFailure(position + 1, signData.size, -1, "${t.message}")
updateNotification(getString(R.string.title_signing_progress, position, signData.size), "${kw}× ${t.message}", position, signData.size, false)
}
if (position < signData.size - 1) {
position += 1
handler.postDelayed({ sign(signData[position]) }, ThreadLocalRandom.current().nextInt(1000, 3500).toLong())
} else {
updateNotification("签到完成", getString(R.string.text_oksign_done, signData.size), Intent(this@OKSignService, MainActivity::class.java))
okSignProgressListener?.onFinish(false, successCount, signData.size)
updateNotification(getString(R.string.title_oksign_finish), getString(R.string.text_oksign_done, signData.size), Intent(this@OKSignService, MainActivity::class.java))
sendBroadcast(Intent(ACTION_SIGN_SUCCESS_ALL))
stopForeground(true)
}
@ -124,6 +172,7 @@ class OKSignService : IntentService(TAG) {
val signResultBean = response.body() ?: return
if (position < signData.size - 1) {
position += 1
okSignProgressListener?.onProgress(signResultBean, position + 1, signData.size)
if (signResultBean.userInfo != null) {
updateNotification(getString(R.string.title_signing_progress, position, signData.size), kw + "吧 ✓ 经验 +" + signResultBean.userInfo.signBonusPoint, position, signData.size, false)
} else {
@ -131,12 +180,12 @@ class OKSignService : IntentService(TAG) {
}
handler.postDelayed({ sign(signData[position]) }, ThreadLocalRandom.current().nextInt(1000, 3500).toLong())
} else {
updateNotification("签到完成", getString(R.string.text_oksign_done, signData.size), Intent(this@OKSignService, MainActivity::class.java))
okSignProgressListener?.onFinish(true, successCount, signData.size)
updateNotification(getString(R.string.title_oksign_finish), getString(R.string.text_oksign_done, signData.size), Intent(this@OKSignService, MainActivity::class.java))
sendBroadcast(Intent(ACTION_SIGN_SUCCESS_ALL))
stopForeground(true)
}
}
})
}
@ -149,7 +198,8 @@ class OKSignService : IntentService(TAG) {
override fun onSuccess(data: MyInfoBean) {
TiebaApi.getInstance().forumRecommend().enqueue(object : Callback<ForumRecommend> {
override fun onFailure(call: Call<ForumRecommend>, t: Throwable) {
updateNotification("签到失败", t.message ?: "未知错误", false)
updateNotification(getString(R.string.title_oksign_fail), t.message
?: getString(R.string.error_unknown), false)
stopForeground(true)
}
@ -167,12 +217,12 @@ class OKSignService : IntentService(TAG) {
}
override fun onFailure(code: Int, error: String) {
updateNotification("签到失败", error, false)
updateNotification(getString(R.string.title_oksign_fail), error, false)
stopForeground(true)
}
})
} else {
updateNotification("签到失败", "请先登录", Intent(this, LoginActivity::class.java))
updateNotification(getString(R.string.title_oksign_fail), getString(R.string.text_login_first), Intent(this, LoginActivity::class.java))
stopForeground(true)
}
}

View File

@ -1 +1 @@
package com.huanchengfly.tieba.post.services; import android.annotation.TargetApi; import android.content.Intent; import android.service.quicksettings.Tile; import android.service.quicksettings.TileService; import com.huanchengfly.tieba.post.activities.OKSignActivity; @TargetApi(24) public class OKSignTileService extends TileService { @Override public void onStartListening() { super.onStartListening(); if (getQsTile() == null) { return; } getQsTile().setState(Tile.STATE_ACTIVE); getQsTile().updateTile(); } @Override public void onStopListening() { super.onStopListening(); if (getQsTile() == null) { return; } getQsTile().setState(Tile.STATE_INACTIVE); getQsTile().updateTile(); } @Override public void onClick() { super.onClick(); startActivity(new Intent(this, OKSignActivity.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } }
package com.huanchengfly.tieba.post.services; import android.annotation.TargetApi; import android.content.Intent; import android.service.quicksettings.Tile; import android.service.quicksettings.TileService; import com.huanchengfly.tieba.post.activities.OKSignActivity; @TargetApi(24) public class OKSignTileService extends TileService { @Override public void onStartListening() { super.onStartListening(); if (getQsTile() == null) { return; } getQsTile().setState(Tile.STATE_INACTIVE); getQsTile().updateTile(); } @Override public void onStopListening() { super.onStopListening(); if (getQsTile() == null) { return; } getQsTile().setState(Tile.STATE_INACTIVE); getQsTile().updateTile(); } @Override public void onClick() { super.onClick(); startActivity(new Intent(this, OKSignActivity.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } }

View File

@ -394,4 +394,7 @@
<string name="title_forum_stat">贴吧数据</string>
<string name="title_forum_tops">置顶贴</string>
<string name="text_unliked">未关注</string>
<string name="title_oksign_finish">签到完成</string>
<string name="title_oksign_fail">签到失败</string>
<string name="text_login_first">请先登录</string>
</resources>