Explorar o código

[移动云相册] 修复accesstoken失效后邀请进云相册,或者获取相册照片时一直卡在加载中的问题

songchengcheng hai 2 semanas
pai
achega
7d4643651d

+ 20 - 2
app/src/main/java/com/sikey/interconnect/k2/ui/cloudAlbum/CloudAlbumActivity.kt

@@ -34,6 +34,7 @@ class CloudAlbumActivity : BaseNoActionBarActivity() {
     }
 
     private lateinit var photoListLayout: LinearLayout
+    private lateinit var noPhotoTv: TextView
     private lateinit var recyclerView: RecyclerView
     private lateinit var adapter: PhotoAdapter
     private val viewModel: PhotoViewModel by viewModels()
@@ -56,6 +57,7 @@ class CloudAlbumActivity : BaseNoActionBarActivity() {
             this.text = getText(R.string.cloud_album)
         }
 
+        noPhotoTv = findViewById(R.id.photoEmptyTv)
         photoListLayout = findViewById(R.id.photoListLayout)
         recyclerView = findViewById(R.id.recyclerView)
 
@@ -96,7 +98,7 @@ class CloudAlbumActivity : BaseNoActionBarActivity() {
                 super.onScrolled(recyclerView, dx, dy)
                 if (!isLoading && !recyclerView.canScrollVertically(1)) {
                     isLoading = true
-                    viewModel.loadNextPage (mTicket?: DataManager.instance.currentChildInfo?.device?.ticket!!) {
+                    viewModel.loadNextPage (this@CloudAlbumActivity, mTicket?: DataManager.instance.currentChildInfo?.device?.ticket!!) {
                         handler.post {
                             Logger.d("PhotoViewModel", "onScrolled photo_size:${viewModel.groupedPhotos.size}")
                             adapter.updateData(viewModel.groupedPhotos)
@@ -109,15 +111,31 @@ class CloudAlbumActivity : BaseNoActionBarActivity() {
 
         // Observe ViewModel data
         viewModel.groupedPhotosLiveData.observe(this) { groupedPhotos ->
+            if (groupedPhotos.isEmpty()) {
+                noPhotoTv.visibility = View.VISIBLE
+            } else {
+                noPhotoTv.visibility = View.GONE
+            }
             adapter.updateData(groupedPhotos)
             isLoading = false
             hideProgressDialog()
         }
 
+        viewModel.cloudStatusLiveData.observe(this) { status ->
+            isLoading = false
+            hideProgressDialog()
+            if (status == 0) {
+                val intent = Intent(this@CloudAlbumActivity, MCloudAuthActivity::class.java)
+                intent.putExtra("cloud_album_ticket", mTicket?: DataManager.instance.currentChildInfo?.device?.ticket!!)
+                startActivity(intent)
+                finish()
+            }
+        }
+
         // Initial data load
         //viewModel.queryContentInfo(0)
         Logger.d("CloudAlbumActivity", "oncreate mTicket:$mTicket")
-        viewModel.getCloudId(mTicket?: DataManager.instance.currentChildInfo?.device?.ticket!!)
+        viewModel.getCloudId(this, mTicket?: DataManager.instance.currentChildInfo?.device?.ticket!!)
         showProgressDialog(R.string.loading_tip)
     }
 

+ 1 - 0
app/src/main/java/com/sikey/interconnect/k2/ui/cloudAlbum/MCloudAuthActivity.kt

@@ -174,6 +174,7 @@ class MCloudAuthActivity : BaseNoActionBarActivity()  {
                 mAccessToken = tokenInfo.accessToken
                 finish()
                 val intent = Intent(this, CloudAlbumActivity::class.java)
+                intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP)
                 intent.putExtra("cloud_album_ticket", mTicket)
                 startActivity(intent)
             }

+ 23 - 9
app/src/main/java/com/sikey/interconnect/k2/ui/cloudAlbum/PhotoViewModel.kt

@@ -77,6 +77,8 @@ class PhotoViewModel(private val application: Application) : AndroidViewModel(ap
     private val _groupedPhotosLiveData = MutableLiveData<List<GroupedPhoto>>()
     val groupedPhotosLiveData: LiveData<List<GroupedPhoto>> = _groupedPhotosLiveData
     val groupedPhotos: List<GroupedPhoto> get() = _groupedPhotosLiveData.value ?: emptyList()
+    private val _cloudStatusLiveData = MutableLiveData<Int>()
+    val cloudStatusLiveData: LiveData<Int> get() = _cloudStatusLiveData
     private var lastLoadedIndex = 0
     private val pageSize = 28
     // LiveData for download status
@@ -118,7 +120,7 @@ class PhotoViewModel(private val application: Application) : AndroidViewModel(ap
         }
     }
 
-    fun getCloudId(ticket: String) {
+    fun getCloudId(context: Context, ticket: String) {
         CoroutineScope(Dispatchers.IO).launch {
             mAccessToken = getTokenInfoFromDatabase(ticket)!!.accessToken
             HttpServiceExecutor.execute(
@@ -132,7 +134,7 @@ class PhotoViewModel(private val application: Application) : AndroidViewModel(ap
                     mCloudID = (this.mData as GetCloudIdRepo).data.cloudId
                     mPhotoID = (this.mData as GetCloudIdRepo).data.photoId
                     Logger.d(TAG, "successfully get cloud id:$mCloudID, photoID:$mPhotoID")
-                    queryContentInfo(0, ticket)
+                    queryContentInfo(context, 0, ticket)
                 } else if (this.code == "1001") {
                     GlobalScope.launch {
                         withContext(Dispatchers.Main) {
@@ -162,6 +164,8 @@ class PhotoViewModel(private val application: Application) : AndroidViewModel(ap
                                 ).flowable
                             ).apply {
                                 if (this.code == "200") {
+                                    val responseBody = (this.mData as ConfirmInvitationRepo).data
+                                    Logger.d(TAG, "Success: $responseBody")
                                     mCloudID = (this.mData as ConfirmInvitationRepo).data.cloudId
                                     mPhotoID = (this.mData as ConfirmInvitationRepo).data.photoId
                                     Logger.d(TAG, "ConfirmInvitationRepo cloud id:$mCloudID, photoID:$mPhotoID")
@@ -170,9 +174,21 @@ class PhotoViewModel(private val application: Application) : AndroidViewModel(ap
                                             ToastUtils.showLongToast(R.string.cloud_album_joined_successfully)
                                         }
                                     }
-                                    queryContentInfo(0, ticket)
+                                    queryContentInfo(context, 0, ticket)
+                                } else if (this.code == "12002" || this.code == "20010" || this.code == "20011") {
+                                    Logger.d(TAG, "confirmInvitation Failed: code=${this.code}")
+                                    _cloudStatusLiveData.postValue(0)
+                                    deleteTokenFromDatabase(ticket)
                                 }
                             }
+                        } else {
+                            Logger.d(TAG, "getInvitationCode error, code: ${this.code}")
+                            GlobalScope.launch {
+                                withContext(Dispatchers.Main) {
+                                    ToastUtils.showLongToast(R.string.cloud_album_failed_to_join)
+                                }
+                            }
+                            _cloudStatusLiveData.postValue(1)
                         }
                     }
                 }
@@ -180,7 +196,7 @@ class PhotoViewModel(private val application: Application) : AndroidViewModel(ap
         }
     }
 
-    fun queryContentInfo(startIndex: Int, ticket: String) {
+    fun queryContentInfo(context: Context, startIndex: Int, ticket: String) {
         CoroutineScope(Dispatchers.IO).launch {
             mAccessToken = getTokenInfoFromDatabase(ticket)!!.accessToken
             val request = QueryContentReq(
@@ -223,10 +239,8 @@ class PhotoViewModel(private val application: Application) : AndroidViewModel(ap
                         }
                     } else if (responseBody.code == 12002 || responseBody.code == 20010 || responseBody.code == 20011) {
                         Logger.d(TAG, "Failed: code=$responseBody!!.body.code")
+                        _cloudStatusLiveData.postValue(0)
                         deleteTokenFromDatabase(ticket)
-                        val intent = Intent(application, MCloudAuthActivity::class.java)
-                        intent.putExtra("cloud_album_ticket", ticket)
-                        application.startActivity(intent)
                     } else {
                         GlobalScope.launch {
                             withContext(Dispatchers.Main) {
@@ -335,13 +349,13 @@ class PhotoViewModel(private val application: Application) : AndroidViewModel(ap
         _groupedPhotosLiveData.postValue(groupedPhotos)
     }
 
-    fun loadNextPage(ticket: String, onComplete: () -> Unit) {
+    fun loadNextPage(context: Context, ticket: String, onComplete: () -> Unit) {
         executor.execute {
             Logger.d(TAG, "loadNextPage lastLoadedIndex:$lastLoadedIndex, photos.size:${photos.size}")
             if (lastLoadedIndex < photos.size) {
                 lastLoadedIndex = min(lastLoadedIndex + pageSize, photos.size)
                 Logger.d(TAG, "loadNextPage (in if) lastLoadedIndex:$lastLoadedIndex")
-                queryContentInfo(lastLoadedIndex, ticket)
+                queryContentInfo(context, lastLoadedIndex, ticket)
             }
             onComplete()
         }

+ 7 - 0
app/src/main/res/layout/activity_cloud_album.xml

@@ -21,6 +21,13 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="vertical">
+        <TextView
+            android:id="@+id/photoEmptyTv"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:gravity="center_horizontal"
+            android:text = "@string/cloud_album_empty"/>
         <androidx.recyclerview.widget.RecyclerView
             android:id="@+id/recyclerView"
             android:layout_width="match_parent"

+ 2 - 0
app/src/main/res/values-zh-rCN/strings.xml

@@ -1068,8 +1068,10 @@
     <string name="cloud_album_websocket_content1">确认云相册服务授权</string>
     <string name="cloud_album_websocket_content2">宝贝已开通云相册服务</string>
     <string name="cloud_album_joined_successfully">加入云相册成功!</string>
+    <string name="cloud_album_failed_to_join">加入云相册失败!</string>
     <string name="cloud_album_warning_use_different_number">请勿使用开通云相册的手表sim卡账号进行登录。</string>
     <string name="cloud_album_watch_not_activated">宝贝还未开通云相册,请通知管理员授权</string>
+    <string name="cloud_album_empty">无照片</string>
 
     <string name="watch_package_manager">第三方应用管理</string>
     <string name="alipay">支付宝</string>

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -1166,8 +1166,10 @@
     <string name="cloud_album_websocket_content1">Confirm cloud album service authorization.</string>
     <string name="cloud_album_websocket_content2">Your baby has activated cloud album service.</string>
     <string name="cloud_album_joined_successfully">Joined cloud album successfully!</string>
+    <string name="cloud_album_failed_to_join">Failed to join cloud album!</string>
     <string name="cloud_album_warning_use_different_number">Do not use the SIM card account of a watch with cloud photo album enabled for login.</string>
     <string name="cloud_album_watch_not_activated">Your baby has not activated cloud album service yet</string>
+    <string name="cloud_album_empty">No photo</string>
 
     <string name="xiaomi_app_id">2882303761520427299</string>
     <string name="xiaomi_app_key">5802042734299</string>