forked from recloudstream/cloudstream
		
	testing mal sync
This commit is contained in:
		
							parent
							
								
									2a27c0360d
								
							
						
					
					
						commit
						6d2c609246
					
				
					 10 changed files with 491 additions and 439 deletions
				
			
		|  | @ -109,7 +109,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { | ||||||
|         @JsonProperty("updated_at") val updatedAt: String?, |         @JsonProperty("updated_at") val updatedAt: String?, | ||||||
|         @JsonProperty("media_type") val mediaType: String?, |         @JsonProperty("media_type") val mediaType: String?, | ||||||
|         @JsonProperty("status") val status: String?, |         @JsonProperty("status") val status: String?, | ||||||
|         @JsonProperty("genres") val genres: ArrayList<Genres>, |         @JsonProperty("genres") val genres: ArrayList<Genres>?, | ||||||
|         @JsonProperty("my_list_status") val myListStatus: MyListStatus?, |         @JsonProperty("my_list_status") val myListStatus: MyListStatus?, | ||||||
|         @JsonProperty("num_episodes") val numEpisodes: Int?, |         @JsonProperty("num_episodes") val numEpisodes: Int?, | ||||||
|         @JsonProperty("start_season") val startSeason: StartSeason?, |         @JsonProperty("start_season") val startSeason: StartSeason?, | ||||||
|  | @ -117,12 +117,12 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { | ||||||
|         @JsonProperty("source") val source: String?, |         @JsonProperty("source") val source: String?, | ||||||
|         @JsonProperty("average_episode_duration") val averageEpisodeDuration: Int?, |         @JsonProperty("average_episode_duration") val averageEpisodeDuration: Int?, | ||||||
|         @JsonProperty("rating") val rating: String?, |         @JsonProperty("rating") val rating: String?, | ||||||
|         @JsonProperty("pictures") val pictures: ArrayList<MainPicture>, |         @JsonProperty("pictures") val pictures: ArrayList<MainPicture>?, | ||||||
|         @JsonProperty("background") val background: String?, |         @JsonProperty("background") val background: String?, | ||||||
|         @JsonProperty("related_anime") val relatedAnime: ArrayList<RelatedAnime>, |         @JsonProperty("related_anime") val relatedAnime: ArrayList<RelatedAnime>?, | ||||||
|         @JsonProperty("related_manga") val relatedManga: ArrayList<String>, |         @JsonProperty("related_manga") val relatedManga: ArrayList<String>?, | ||||||
|         @JsonProperty("recommendations") val recommendations: ArrayList<Recommendations>, |         @JsonProperty("recommendations") val recommendations: ArrayList<Recommendations>?, | ||||||
|         @JsonProperty("studios") val studios: ArrayList<Studios>, |         @JsonProperty("studios") val studios: ArrayList<Studios>?, | ||||||
|         @JsonProperty("statistics") val statistics: Statistics?, |         @JsonProperty("statistics") val statistics: Statistics?, | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|  | @ -136,7 +136,6 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { | ||||||
|         @JsonProperty("name") val name: String? = null |         @JsonProperty("name") val name: String? = null | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     data class MyListStatus( |     data class MyListStatus( | ||||||
|         @JsonProperty("status") val status: String? = null, |         @JsonProperty("status") val status: String? = null, | ||||||
|         @JsonProperty("score") val score: Int? = null, |         @JsonProperty("score") val score: Int? = null, | ||||||
|  | @ -172,7 +171,7 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private fun toSearchResult(node : Node?) : SyncAPI.SyncSearchResult? { |     private fun toSearchResult(node: Node?): SyncAPI.SyncSearchResult? { | ||||||
|         return SyncAPI.SyncSearchResult( |         return SyncAPI.SyncSearchResult( | ||||||
|             name = node?.title ?: return null, |             name = node?.title ?: return null, | ||||||
|             syncApiName = this.name, |             syncApiName = this.name, | ||||||
|  | @ -205,19 +204,19 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { | ||||||
|                     else -> null |                     else -> null | ||||||
|                 }, |                 }, | ||||||
|                 nextAiring = null, |                 nextAiring = null, | ||||||
|                 studio = malAnime.studios.mapNotNull { it.name }, |                 studio = malAnime.studios?.mapNotNull { it.name }, | ||||||
|                 genres = malAnime.genres.map { it.name }, |                 genres = malAnime.genres?.map { it.name }, | ||||||
|                 trailerUrl = null, |                 trailerUrl = null, | ||||||
|                 startDate = parseDate(malAnime.startDate), |                 startDate = parseDate(malAnime.startDate), | ||||||
|                 endDate = parseDate(malAnime.endDate), |                 endDate = parseDate(malAnime.endDate), | ||||||
|                 recommendations = malAnime.recommendations.mapNotNull { rec -> |                 recommendations = malAnime.recommendations?.mapNotNull { rec -> | ||||||
|                     val node = rec.node ?: return@mapNotNull null |                     val node = rec.node ?: return@mapNotNull null | ||||||
|                     toSearchResult(node) |                     toSearchResult(node) | ||||||
|                 }, |                 }, | ||||||
|                 nextSeason = malAnime.relatedAnime.firstOrNull { |                 nextSeason = malAnime.relatedAnime?.firstOrNull { | ||||||
|                     return@firstOrNull it.relationType == "sequel" |                     return@firstOrNull it.relationType == "sequel" | ||||||
|                 }?.let { toSearchResult(it.node)  }, |                 }?.let { toSearchResult(it.node) }, | ||||||
|                 prevSeason = malAnime.relatedAnime.firstOrNull { |                 prevSeason = malAnime.relatedAnime?.firstOrNull { | ||||||
|                     return@firstOrNull it.relationType == "prequel" |                     return@firstOrNull it.relationType == "prequel" | ||||||
|                 }?.let { toSearchResult(it.node) }, |                 }?.let { toSearchResult(it.node) }, | ||||||
|                 actors = null, |                 actors = null, | ||||||
|  | @ -229,7 +228,8 @@ class MALApi(index: Int) : AccountManager(index), SyncAPI { | ||||||
|     override suspend fun getStatus(id: String): SyncAPI.SyncStatus? { |     override suspend fun getStatus(id: String): SyncAPI.SyncStatus? { | ||||||
|         val internalId = id.toIntOrNull() ?: return null |         val internalId = id.toIntOrNull() ?: return null | ||||||
| 
 | 
 | ||||||
|         val data = getDataAboutMalId(internalId)?.my_list_status //?: throw ErrorLoadingException("No my_list_status") |         val data = | ||||||
|  |             getDataAboutMalId(internalId)?.my_list_status //?: throw ErrorLoadingException("No my_list_status") | ||||||
|         return SyncAPI.SyncStatus( |         return SyncAPI.SyncStatus( | ||||||
|             score = data?.score, |             score = data?.score, | ||||||
|             status = malStatusAsString.indexOf(data?.status), |             status = malStatusAsString.indexOf(data?.status), | ||||||
|  |  | ||||||
|  | @ -11,15 +11,15 @@ import android.content.res.ColorStateList | ||||||
| import android.content.res.Configuration | import android.content.res.Configuration | ||||||
| import android.graphics.Rect | import android.graphics.Rect | ||||||
| import android.net.Uri | import android.net.Uri | ||||||
|  | import android.os.Build | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
|  | import android.text.Editable | ||||||
| import android.view.LayoutInflater | import android.view.LayoutInflater | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.view.View.GONE | import android.view.View.GONE | ||||||
| import android.view.View.VISIBLE | import android.view.View.VISIBLE | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
| import android.widget.ImageView | import android.widget.* | ||||||
| import android.widget.TextView |  | ||||||
| import android.widget.Toast |  | ||||||
| import androidx.annotation.StringRes | import androidx.annotation.StringRes | ||||||
| import androidx.appcompat.app.AlertDialog | import androidx.appcompat.app.AlertDialog | ||||||
| import androidx.core.content.FileProvider | import androidx.core.content.FileProvider | ||||||
|  | @ -27,6 +27,7 @@ import androidx.core.graphics.drawable.toBitmap | ||||||
| import androidx.core.view.isGone | import androidx.core.view.isGone | ||||||
| import androidx.core.view.isVisible | import androidx.core.view.isVisible | ||||||
| import androidx.core.widget.NestedScrollView | import androidx.core.widget.NestedScrollView | ||||||
|  | import androidx.core.widget.doOnTextChanged | ||||||
| import androidx.fragment.app.Fragment | import androidx.fragment.app.Fragment | ||||||
| import androidx.lifecycle.ViewModelProvider | import androidx.lifecycle.ViewModelProvider | ||||||
| import androidx.preference.PreferenceManager | import androidx.preference.PreferenceManager | ||||||
|  | @ -1149,7 +1150,79 @@ class ResultFragment : Fragment(), PanelsChildGestureRegionObserver.GestureRegio | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         observe(syncModel.status) { status -> |         context?.let { ctx -> | ||||||
|  |             val arrayAdapter = ArrayAdapter<String>(ctx, R.layout.sort_bottom_single_choice) | ||||||
|  |             /* | ||||||
|  |             -1 -> None | ||||||
|  |             0 -> Watching | ||||||
|  |             1 -> Completed | ||||||
|  |             2 -> OnHold | ||||||
|  |             3 -> Dropped | ||||||
|  |             4 -> PlanToWatch | ||||||
|  |             5 -> ReWatching | ||||||
|  |             */ | ||||||
|  |             val items = listOf( | ||||||
|  |                 R.string.none, | ||||||
|  |                 R.string.type_watching, | ||||||
|  |                 R.string.type_completed, | ||||||
|  |                 R.string.type_on_hold, | ||||||
|  |                 R.string.type_dropped, | ||||||
|  |                 R.string.type_plan_to_watch, | ||||||
|  |                 R.string.type_re_watching | ||||||
|  |             ).map { ctx.getString(it) } | ||||||
|  |             arrayAdapter.addAll(items) | ||||||
|  |             result_sync_check?.choiceMode = AbsListView.CHOICE_MODE_SINGLE | ||||||
|  |             result_sync_check?.adapter = arrayAdapter | ||||||
|  |             UIHelper.setListViewHeightBasedOnItems(result_sync_check) | ||||||
|  | 
 | ||||||
|  |             result_sync_check?.setOnItemClickListener { _, _, which, _ -> | ||||||
|  |                 syncModel.setStatus(which - 1) | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             result_sync_rating?.addOnChangeListener { _, value, _ -> | ||||||
|  |                 syncModel.setScore(value.toInt()) | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             result_sync_add_episode?.setOnClickListener { | ||||||
|  |                 syncModel.setEpisodesDelta(1) | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             result_sync_sub_episode?.setOnClickListener { | ||||||
|  |                 syncModel.setEpisodesDelta(-1) | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             result_sync_current_episodes?.doOnTextChanged { text, start, before, count -> | ||||||
|  |                 if(count == before) return@doOnTextChanged | ||||||
|  |                 text?.toString()?.toIntOrNull()?.let { ep -> | ||||||
|  |                     syncModel.setEpisodes(ep) | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         observe(syncModel.metadata) { meta -> | ||||||
|  |             when (meta) { | ||||||
|  |                 is Resource.Success -> { | ||||||
|  |                     val d = meta.value | ||||||
|  |                     result_sync_episodes?.max = (d.totalEpisodes ?: 0)*1000 | ||||||
|  |                     normalSafeApiCall { | ||||||
|  |                         val ctx = result_sync_max_episodes?.context | ||||||
|  |                         result_sync_max_episodes?.text = | ||||||
|  |                             d.totalEpisodes?.let { | ||||||
|  |                                 ctx?.getString(R.string.sync_total_episodes_some)?.format(it) | ||||||
|  |                             } ?: run { | ||||||
|  |                                 ctx?.getString(R.string.sync_total_episodes_none) | ||||||
|  |                             } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 is Resource.Loading -> { | ||||||
|  |                     result_sync_max_episodes?.text = | ||||||
|  |                         result_sync_max_episodes?.context?.getString(R.string.sync_total_episodes_none) | ||||||
|  |                 } | ||||||
|  |                 else -> {} | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         observe(syncModel.userData) { status -> | ||||||
|             var closed = false |             var closed = false | ||||||
|             when (status) { |             when (status) { | ||||||
|                 is Resource.Failure -> { |                 is Resource.Failure -> { | ||||||
|  | @ -1169,17 +1242,20 @@ class ResultFragment : Fragment(), PanelsChildGestureRegionObserver.GestureRegio | ||||||
| 
 | 
 | ||||||
|                     val d = status.value |                     val d = status.value | ||||||
|                     result_sync_rating?.value = d.score?.toFloat() ?: 0.0f |                     result_sync_rating?.value = d.score?.toFloat() ?: 0.0f | ||||||
| 
 |                     result_sync_check?.setItemChecked(d.status + 1, true) | ||||||
|                     /*when(d.status) { |                     val watchedEpisodes = d.watchedEpisodes ?: 0 | ||||||
|                         -1 -> None |                     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { | ||||||
|                         0 -> Watching |                         result_sync_episodes?.setProgress(watchedEpisodes * 1000, true) | ||||||
|                         1 -> Completed |                     } else { | ||||||
|                         2 -> OnHold |                         result_sync_episodes?.progress = watchedEpisodes * 1000 | ||||||
|                         3 -> Dropped |                     } | ||||||
|                         4 -> PlanToWatch |                     result_sync_current_episodes?.text = | ||||||
|                         5 -> ReWatching |                         Editable.Factory.getInstance()?.newEditable(watchedEpisodes.toString()) | ||||||
|                     }*/ |                     normalSafeApiCall { // format might fail | ||||||
|                     //d.status |                         context?.getString(R.string.sync_score_format)?.format(d.score ?: 0)?.let { | ||||||
|  |                             result_sync_score_text?.text = it | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|                 } |                 } | ||||||
|                 null -> { |                 null -> { | ||||||
|                     closed = false |                     closed = false | ||||||
|  | @ -1349,10 +1425,7 @@ class ResultFragment : Fragment(), PanelsChildGestureRegionObserver.GestureRegio | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         result_sync_set_score?.setOnClickListener { |         result_sync_set_score?.setOnClickListener { | ||||||
|             // TODO set score |             syncModel.publishUserData() | ||||||
|             //syncModel.setScore(SyncAPI.SyncStatus( |  | ||||||
|             //    status = |  | ||||||
|             //)) |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         observe(viewModel.publicEpisodesCount) { count -> |         observe(viewModel.publicEpisodesCount) { count -> | ||||||
|  | @ -1455,7 +1528,7 @@ class ResultFragment : Fragment(), PanelsChildGestureRegionObserver.GestureRegio | ||||||
|                                     setAniListSync(d.anilistId?.toString()) |                                     setAniListSync(d.anilistId?.toString()) | ||||||
|                                 ) { |                                 ) { | ||||||
|                                     syncModel.updateMetadata() |                                     syncModel.updateMetadata() | ||||||
|                                     syncModel.updateStatus() |                                     syncModel.updateUserData() | ||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ import com.lagradost.cloudstream3.syncproviders.OAuth2API.Companion.malApi | ||||||
| import com.lagradost.cloudstream3.syncproviders.SyncAPI | import com.lagradost.cloudstream3.syncproviders.SyncAPI | ||||||
| import kotlinx.coroutines.launch | import kotlinx.coroutines.launch | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class SyncViewModel : ViewModel() { | class SyncViewModel : ViewModel() { | ||||||
|     private val repos = SyncApis |     private val repos = SyncApis | ||||||
| 
 | 
 | ||||||
|  | @ -19,10 +20,10 @@ class SyncViewModel : ViewModel() { | ||||||
| 
 | 
 | ||||||
|     val metadata: LiveData<Resource<SyncAPI.SyncResult>> get() = _metaResponse |     val metadata: LiveData<Resource<SyncAPI.SyncResult>> get() = _metaResponse | ||||||
| 
 | 
 | ||||||
|     private val _statusResponse: MutableLiveData<Resource<SyncAPI.SyncStatus>?> = |     private val _userDataResponse: MutableLiveData<Resource<SyncAPI.SyncStatus>?> = | ||||||
|         MutableLiveData(null) |         MutableLiveData(null) | ||||||
| 
 | 
 | ||||||
|     val status: LiveData<Resource<SyncAPI.SyncStatus>?> get() = _statusResponse |     val userData: LiveData<Resource<SyncAPI.SyncStatus>?> get() = _userDataResponse | ||||||
| 
 | 
 | ||||||
|     // prefix, id |     // prefix, id | ||||||
|     private val syncIds = hashMapOf<String, String>() |     private val syncIds = hashMapOf<String, String>() | ||||||
|  | @ -35,29 +36,75 @@ class SyncViewModel : ViewModel() { | ||||||
|         syncIds[aniListApi.idPrefix] = id |         syncIds[aniListApi.idPrefix] = id | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun setScore(status: SyncAPI.SyncStatus) = viewModelScope.launch { |     fun setEpisodesDelta(delta: Int) { | ||||||
|         for ((prefix, id) in syncIds) { |         val user = userData.value | ||||||
|             repos.firstOrNull { it.idPrefix == prefix }?.score(id, status) |         if (user is Resource.Success) { | ||||||
|  |             user.value.watchedEpisodes?.plus( | ||||||
|  |                 delta | ||||||
|  |             )?.let { episode -> | ||||||
|  |                 setEpisodes(episode) | ||||||
|  |             } | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         updateStatus() |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun updateStatus() = viewModelScope.launch { |     fun setEpisodes(episodes: Int) { | ||||||
|         _statusResponse.postValue(Resource.Loading()) |         if (episodes < 0) return | ||||||
|  |         val meta = metadata.value | ||||||
|  |         if (meta is Resource.Success) { | ||||||
|  |             meta.value.totalEpisodes?.let { max -> | ||||||
|  |                 if (episodes > max) { | ||||||
|  |                     setEpisodes(max) | ||||||
|  |                     return | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         val user = userData.value | ||||||
|  |         if (user is Resource.Success) { | ||||||
|  |             _userDataResponse.postValue(Resource.Success(user.value.copy(watchedEpisodes = episodes))) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fun setScore(score: Int) { | ||||||
|  |         val user = userData.value | ||||||
|  |         if (user is Resource.Success) { | ||||||
|  |             _userDataResponse.postValue(Resource.Success(user.value.copy(score = score))) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fun setStatus(which: Int) { | ||||||
|  |         if (which < -1 || which > 5) return // validate input | ||||||
|  |         val user = userData.value | ||||||
|  |         if (user is Resource.Success) { | ||||||
|  |             _userDataResponse.postValue(Resource.Success(user.value.copy(status = which))) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fun publishUserData() = viewModelScope.launch { | ||||||
|  |         val user = userData.value | ||||||
|  |         if (user is Resource.Success) { | ||||||
|  |             for ((prefix, id) in syncIds) { | ||||||
|  |                 repos.firstOrNull { it.idPrefix == prefix }?.score(id, user.value) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         updateUserData() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fun updateUserData() = viewModelScope.launch { | ||||||
|  |         _userDataResponse.postValue(Resource.Loading()) | ||||||
|         var lastError: Resource<SyncAPI.SyncStatus> = Resource.Failure(false, null, null, "No data") |         var lastError: Resource<SyncAPI.SyncStatus> = Resource.Failure(false, null, null, "No data") | ||||||
|         for ((prefix, id) in syncIds) { |         for ((prefix, id) in syncIds) { | ||||||
|             repos.firstOrNull { it.idPrefix == prefix }?.let { |             repos.firstOrNull { it.idPrefix == prefix }?.let { | ||||||
|                 val result = it.getStatus(id) |                 val result = it.getStatus(id) | ||||||
|                 if (result is Resource.Success) { |                 if (result is Resource.Success) { | ||||||
|                     _statusResponse.postValue(result) |                     _userDataResponse.postValue(result) | ||||||
|                     return@launch |                     return@launch | ||||||
|                 } else if (result is Resource.Failure) { |                 } else if (result is Resource.Failure) { | ||||||
|                     lastError = result |                     lastError = result | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         _statusResponse.postValue(lastError) |         _userDataResponse.postValue(lastError) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun updateMetadata() = viewModelScope.launch { |     fun updateMetadata() = viewModelScope.launch { | ||||||
|  | @ -75,5 +122,6 @@ class SyncViewModel : ViewModel() { | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         _metaResponse.postValue(lastError) |         _metaResponse.postValue(lastError) | ||||||
|  |         setEpisodesDelta(0) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -88,7 +88,7 @@ class SettingsFragment : PreferenceFragmentCompat() { | ||||||
|             return uiModeManager?.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION |             return uiModeManager?.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         const val accountEnabled = false |         const val accountEnabled = true | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private var beneneCount = 0 |     private var beneneCount = 0 | ||||||
|  |  | ||||||
|  | @ -12,12 +12,11 @@ import android.content.res.Resources | ||||||
| import android.graphics.Color | import android.graphics.Color | ||||||
| import android.os.Build | import android.os.Build | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.view.Gravity | import android.view.* | ||||||
| import android.view.MenuItem |  | ||||||
| import android.view.View |  | ||||||
| import android.view.WindowManager |  | ||||||
| import android.view.inputmethod.InputMethodManager | import android.view.inputmethod.InputMethodManager | ||||||
| import android.widget.ImageView | import android.widget.ImageView | ||||||
|  | import android.widget.ListAdapter | ||||||
|  | import android.widget.ListView | ||||||
| import androidx.annotation.AttrRes | import androidx.annotation.AttrRes | ||||||
| import androidx.annotation.ColorInt | import androidx.annotation.ColorInt | ||||||
| import androidx.annotation.IdRes | import androidx.annotation.IdRes | ||||||
|  | @ -71,6 +70,36 @@ object UIHelper { | ||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Sets ListView height dynamically based on the height of the items. | ||||||
|  |      * | ||||||
|  |      * @param listView to be resized | ||||||
|  |      * @return true if the listView is successfully resized, false otherwise | ||||||
|  |      */ | ||||||
|  |     fun setListViewHeightBasedOnItems(listView: ListView?) { | ||||||
|  |         val listAdapter: ListAdapter = listView?.adapter ?: return | ||||||
|  |         val numberOfItems: Int = listAdapter.count | ||||||
|  | 
 | ||||||
|  |         // Get total height of all items. | ||||||
|  |         var totalItemsHeight = 0 | ||||||
|  |         for (itemPos in 0 until numberOfItems) { | ||||||
|  |             val item: View = listAdapter.getView(itemPos, null, listView) | ||||||
|  |             item.measure(0, 0) | ||||||
|  |             totalItemsHeight += item.measuredHeight | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Get total height of all item dividers. | ||||||
|  |         val totalDividersHeight: Int = listView.dividerHeight * | ||||||
|  |                 (numberOfItems - 1) | ||||||
|  | 
 | ||||||
|  |         // Set list height. | ||||||
|  |         val params: ViewGroup.LayoutParams = listView.layoutParams | ||||||
|  |         params.height = totalItemsHeight + totalDividersHeight | ||||||
|  |         listView.layoutParams = params | ||||||
|  |         listView.requestLayout() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fun Activity?.getSpanCount(): Int? { |     fun Activity?.getSpanCount(): Int? { | ||||||
|         val compactView = this?.getGridIsCompact() ?: return null |         val compactView = this?.getGridIsCompact() ?: return null | ||||||
|         val spanCountLandscape = if (compactView) 2 else 6 |         val spanCountLandscape = if (compactView) 2 else 6 | ||||||
|  | @ -120,7 +149,7 @@ object UIHelper { | ||||||
|         return color |         return color | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun ImageView?.setImage(url: String?) : Boolean { |     fun ImageView?.setImage(url: String?): Boolean { | ||||||
|         if (this == null || url.isNullOrBlank()) return false |         if (this == null || url.isNullOrBlank()) return false | ||||||
|         return try { |         return try { | ||||||
|             GlideApp.with(this.context) |             GlideApp.with(this.context) | ||||||
|  | @ -316,7 +345,7 @@ object UIHelper { | ||||||
|     fun Activity.showSystemUI() { |     fun Activity.showSystemUI() { | ||||||
|         window.decorView.systemUiVisibility = |         window.decorView.systemUiVisibility = | ||||||
| 
 | 
 | ||||||
|                 (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) |             (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) | ||||||
| 
 | 
 | ||||||
|         changeStatusBarState(isEmulatorSettings()) |         changeStatusBarState(isEmulatorSettings()) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,363 +6,265 @@ | ||||||
|         android:layout_width="match_parent" |         android:layout_width="match_parent" | ||||||
|         android:layout_height="match_parent"> |         android:layout_height="match_parent"> | ||||||
| 
 | 
 | ||||||
|     <LinearLayout |     <ScrollView | ||||||
|  |             android:id="@+id/result_sync_holder" | ||||||
|  |             tools:visibility="visible" | ||||||
|             android:visibility="gone" |             android:visibility="gone" | ||||||
|             android:padding="16dp" |             android:padding="16dp" | ||||||
|             android:orientation="vertical" |  | ||||||
|             android:id="@+id/result_sync_holder" |  | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="match_parent"> |             android:layout_height="wrap_content"> | ||||||
| 
 |  | ||||||
|         <TextView |  | ||||||
|                 android:textStyle="bold" |  | ||||||
|                 android:textSize="16sp" |  | ||||||
|                 android:layout_marginBottom="10dp" |  | ||||||
|                 android:text="MyAnimeList, AniList" |  | ||||||
|                 android:layout_width="wrap_content" |  | ||||||
|                 android:layout_height="wrap_content" /> |  | ||||||
| 
 |  | ||||||
|         <LinearLayout |         <LinearLayout | ||||||
|                 android:visibility="visible" |                 android:orientation="vertical" | ||||||
|                 android:orientation="horizontal" |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 android:layout_height="wrap_content"> |  | ||||||
| 
 |  | ||||||
|             <ImageView |  | ||||||
|                     android:padding="10dp" |  | ||||||
|                     android:layout_width="wrap_content" |  | ||||||
|                     android:layout_height="wrap_content" |  | ||||||
|                     android:background="?android:attr/selectableItemBackgroundBorderless" |  | ||||||
|                     android:src="@drawable/baseline_remove_24" |  | ||||||
|                     android:layout_gravity="end|center_vertical" |  | ||||||
|                     android:contentDescription="@string/result_share" |  | ||||||
|                     app:tint="?attr/textColor" /> |  | ||||||
| 
 |  | ||||||
|             <EditText |  | ||||||
|                     android:id="@+id/result_sync_current_episodes" |  | ||||||
|                     style="@style/AppEditStyle" |  | ||||||
|                     tools:hint="20" |  | ||||||
|                     android:textSize="20sp" |  | ||||||
|                     android:inputType="number" |  | ||||||
|                     android:layout_width="wrap_content" |  | ||||||
|                     android:layout_height="wrap_content" |  | ||||||
|                     tools:ignore="LabelFor" /> |  | ||||||
| 
 |  | ||||||
|             <TextView |  | ||||||
|                     android:id="@+id/result_sync_max_episodes" |  | ||||||
|                     android:layout_gravity="center_vertical" |  | ||||||
|                     android:paddingBottom="1dp" |  | ||||||
|                     android:textSize="20sp" |  | ||||||
|                     android:textColor="?attr/textColor" |  | ||||||
|                     tools:text="/30" |  | ||||||
|                     android:layout_width="wrap_content" |  | ||||||
|                     android:layout_height="wrap_content" /> |  | ||||||
| 
 |  | ||||||
|             <ImageView |  | ||||||
|                     android:padding="10dp" |  | ||||||
|                     android:layout_width="wrap_content" |  | ||||||
|                     android:layout_height="wrap_content" |  | ||||||
|                     android:background="?android:attr/selectableItemBackgroundBorderless" |  | ||||||
|                     android:src="@drawable/ic_baseline_add_24" |  | ||||||
|                     android:layout_gravity="end|center_vertical" |  | ||||||
|                     android:contentDescription="@string/result_share" |  | ||||||
|                     app:tint="?attr/textColor" /> |  | ||||||
|         </LinearLayout> |  | ||||||
| 
 |  | ||||||
|         <androidx.core.widget.ContentLoadingProgressBar |  | ||||||
|                 android:id="@+id/result_sync_episodes" |  | ||||||
|                 android:padding="10dp" |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 android:layout_height="20dp" |  | ||||||
|                 android:progress="50" |  | ||||||
|                 android:indeterminate="false" |  | ||||||
|                 android:progressBackgroundTint="?attr/colorPrimary" |  | ||||||
|                 style="?android:attr/progressBarStyleHorizontal" |  | ||||||
|                 android:max="100" |  | ||||||
|                 android:layout_gravity="end|center_vertical" |  | ||||||
|                 tools:visibility="visible" /> |  | ||||||
| 
 |  | ||||||
|         <!-- |  | ||||||
|                 <LinearLayout |  | ||||||
|                         android:layout_marginBottom="10dp" |  | ||||||
|                         android:layout_width="match_parent" |  | ||||||
|                         android:layout_height="wrap_content"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|                     <TextView |  | ||||||
|                             android:layout_gravity="center_vertical" |  | ||||||
|                             android:padding="10dp" |  | ||||||
|                             android:textSize="17sp" |  | ||||||
|                             android:textColor="?attr/textColor" |  | ||||||
|                             android:text="Status:" |  | ||||||
|                             android:layout_width="wrap_content" |  | ||||||
|                             android:layout_height="wrap_content" /> |  | ||||||
| 
 |  | ||||||
|                     <com.google.android.material.button.MaterialButton |  | ||||||
|                             android:layout_height="30dp" |  | ||||||
|                             android:text="Watching" |  | ||||||
|                             android:minWidth="0dp" |  | ||||||
|                             android:layout_width="wrap_content" |  | ||||||
|                             android:layout_gravity="center_vertical" |  | ||||||
|                             android:layout_marginStart="0dp" |  | ||||||
|                             style="@style/BlackButton" /> |  | ||||||
|                 </LinearLayout> |  | ||||||
| 
 |  | ||||||
|                 <GridLayout |  | ||||||
|                         android:orientation="horizontal" |  | ||||||
|                         android:columnCount="2" |  | ||||||
| 
 |  | ||||||
|                         android:layout_width="match_parent" |  | ||||||
|                         android:layout_height="wrap_content"> |  | ||||||
| 
 |  | ||||||
|                     <com.google.android.material.button.MaterialButton |  | ||||||
|                             android:id="@+id/sync_completed" |  | ||||||
|                             android:nextFocusRight="@id/sync_on_hold" |  | ||||||
|                             android:nextFocusDown="@id/sync_plan_to_watch" |  | ||||||
| 
 |  | ||||||
|                             android:layout_row="0" |  | ||||||
|                             android:layout_column="0" |  | ||||||
|                             android:text="@string/type_completed" |  | ||||||
|                             style="@style/SyncButton" /> |  | ||||||
| 
 |  | ||||||
|                     <com.google.android.material.button.MaterialButton |  | ||||||
|                             android:id="@+id/sync_on_hold" |  | ||||||
|                             android:nextFocusDown="@id/sync_watching" |  | ||||||
|                             android:nextFocusLeft="@id/sync_completed" |  | ||||||
| 
 |  | ||||||
|                             android:layout_row="0" |  | ||||||
|                             android:layout_column="1" |  | ||||||
|                             style="@style/SyncButton" |  | ||||||
|                             android:text="@string/type_on_hold" /> |  | ||||||
| 
 |  | ||||||
|                     <com.google.android.material.button.MaterialButton |  | ||||||
|                             android:id="@+id/sync_plan_to_watch" |  | ||||||
|                             android:nextFocusRight="@id/sync_plan_to_watch" |  | ||||||
|                             android:nextFocusDown="@id/sync_dropped" |  | ||||||
|                             android:nextFocusUp="@id/sync_completed" |  | ||||||
| 
 |  | ||||||
|                             android:layout_row="1" |  | ||||||
|                             android:layout_column="0" |  | ||||||
|                             android:text="@string/type_plan_to_watch" |  | ||||||
|                             style="@style/SyncButton" |  | ||||||
|                             /> |  | ||||||
| 
 |  | ||||||
|                     <com.google.android.material.button.MaterialButton |  | ||||||
|                             android:id="@+id/sync_watching" |  | ||||||
|                             android:nextFocusLeft="@id/sync_plan_to_watch" |  | ||||||
|                             android:nextFocusDown="@id/sync_dropped" |  | ||||||
|                             android:nextFocusUp="@id/sync_on_hold" |  | ||||||
| 
 |  | ||||||
|                             android:layout_row="1" |  | ||||||
|                             android:layout_column="1" |  | ||||||
| 
 |  | ||||||
|                             style="@style/SyncButton" |  | ||||||
|                             android:text="@string/type_watching" /> |  | ||||||
| 
 |  | ||||||
|                 </GridLayout> |  | ||||||
| 
 |  | ||||||
|         <com.google.android.material.button.MaterialButton |  | ||||||
|                 android:id="@+id/sync_dropped" |  | ||||||
|                 android:nextFocusUp="@id/sync_plan_to_watch" |  | ||||||
| 
 |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 style="@style/SyncButton" |  | ||||||
| 
 |  | ||||||
|                 android:text="@string/type_dropped" />--> |  | ||||||
| 
 |  | ||||||
|         <LinearLayout |  | ||||||
|                 android:orientation="horizontal" |  | ||||||
|                 android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|                 android:layout_height="wrap_content"> |                 android:layout_height="wrap_content"> | ||||||
| 
 | 
 | ||||||
|             <TextView |             <TextView | ||||||
|                     android:layout_gravity="center_vertical" |                     android:visibility="gone" | ||||||
|                     android:padding="10dp" |                     android:textStyle="bold" | ||||||
|                     android:textSize="17sp" |                     android:textSize="16sp" | ||||||
|                     android:textColor="?attr/textColor" |                     android:layout_marginBottom="10dp" | ||||||
|                     android:text="Rated:" |                     android:text="MyAnimeList, AniList" | ||||||
|                     android:layout_width="wrap_content" |                     android:layout_width="wrap_content" | ||||||
|                     android:layout_height="wrap_content" /> |                     android:layout_height="wrap_content" /> | ||||||
| <!-- | 
 | ||||||
|  |             <LinearLayout | ||||||
|  |                     android:visibility="visible" | ||||||
|  |                     android:orientation="horizontal" | ||||||
|  |                     android:layout_width="match_parent" | ||||||
|  |                     android:layout_height="wrap_content"> | ||||||
|  | 
 | ||||||
|  |                 <ImageView | ||||||
|  |                         android:id="@+id/result_sync_sub_episode" | ||||||
|  |                         android:padding="10dp" | ||||||
|  |                         android:layout_width="wrap_content" | ||||||
|  |                         android:layout_height="wrap_content" | ||||||
|  |                         android:background="?android:attr/selectableItemBackgroundBorderless" | ||||||
|  |                         android:src="@drawable/baseline_remove_24" | ||||||
|  |                         android:layout_gravity="end|center_vertical" | ||||||
|  |                         app:tint="?attr/textColor" /> | ||||||
|  | 
 | ||||||
|  |                 <EditText | ||||||
|  |                         android:id="@+id/result_sync_current_episodes" | ||||||
|  |                         style="@style/AppEditStyle" | ||||||
|  |                         tools:hint="20" | ||||||
|  |                         android:textSize="20sp" | ||||||
|  |                         android:inputType="number" | ||||||
|  |                         android:layout_width="wrap_content" | ||||||
|  |                         android:layout_height="wrap_content" | ||||||
|  |                         tools:ignore="LabelFor" /> | ||||||
|  | 
 | ||||||
|  |                 <TextView | ||||||
|  |                         android:id="@+id/result_sync_max_episodes" | ||||||
|  |                         android:layout_gravity="center_vertical" | ||||||
|  |                         android:paddingBottom="1dp" | ||||||
|  |                         android:textSize="20sp" | ||||||
|  |                         android:textColor="?attr/textColor" | ||||||
|  |                         tools:text="30" | ||||||
|  |                         android:layout_width="wrap_content" | ||||||
|  |                         android:layout_height="wrap_content" /> | ||||||
|  | 
 | ||||||
|  |                 <ImageView | ||||||
|  |                         android:id="@+id/result_sync_add_episode" | ||||||
|  |                         android:padding="10dp" | ||||||
|  |                         android:layout_width="wrap_content" | ||||||
|  |                         android:layout_height="wrap_content" | ||||||
|  |                         android:background="?android:attr/selectableItemBackgroundBorderless" | ||||||
|  |                         android:src="@drawable/ic_baseline_add_24" | ||||||
|  |                         android:layout_gravity="end|center_vertical" | ||||||
|  |                         app:tint="?attr/textColor" /> | ||||||
|  |             </LinearLayout> | ||||||
|  | 
 | ||||||
|  |             <androidx.core.widget.ContentLoadingProgressBar | ||||||
|  |                     android:id="@+id/result_sync_episodes" | ||||||
|  |                     android:padding="10dp" | ||||||
|  |                     android:layout_width="match_parent" | ||||||
|  |                     android:layout_height="20dp" | ||||||
|  |                     android:progress="0" | ||||||
|  |                     android:indeterminate="false" | ||||||
|  |                     android:progressBackgroundTint="?attr/colorPrimary" | ||||||
|  |                     style="?android:attr/progressBarStyleHorizontal" | ||||||
|  |                     android:max="100" | ||||||
|  |                     android:layout_gravity="end|center_vertical" | ||||||
|  |                     tools:visibility="visible" /> | ||||||
|  | 
 | ||||||
|  |             <!-- | ||||||
|  |                     <LinearLayout | ||||||
|  |                             android:layout_marginBottom="10dp" | ||||||
|  |                             android:layout_width="match_parent" | ||||||
|  |                             android:layout_height="wrap_content"> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                         <TextView | ||||||
|  |                                 android:layout_gravity="center_vertical" | ||||||
|  |                                 android:padding="10dp" | ||||||
|  |                                 android:textSize="17sp" | ||||||
|  |                                 android:textColor="?attr/textColor" | ||||||
|  |                                 android:text="Status:" | ||||||
|  |                                 android:layout_width="wrap_content" | ||||||
|  |                                 android:layout_height="wrap_content" /> | ||||||
|  | 
 | ||||||
|  |                         <com.google.android.material.button.MaterialButton | ||||||
|  |                                 android:layout_height="30dp" | ||||||
|  |                                 android:text="Watching" | ||||||
|  |                                 android:minWidth="0dp" | ||||||
|  |                                 android:layout_width="wrap_content" | ||||||
|  |                                 android:layout_gravity="center_vertical" | ||||||
|  |                                 android:layout_marginStart="0dp" | ||||||
|  |                                 style="@style/BlackButton" /> | ||||||
|  |                     </LinearLayout> | ||||||
|  | 
 | ||||||
|  |                     <GridLayout | ||||||
|  |                             android:orientation="horizontal" | ||||||
|  |                             android:columnCount="2" | ||||||
|  | 
 | ||||||
|  |                             android:layout_width="match_parent" | ||||||
|  |                             android:layout_height="wrap_content"> | ||||||
|  | 
 | ||||||
|  |                         <com.google.android.material.button.MaterialButton | ||||||
|  |                                 android:id="@+id/sync_completed" | ||||||
|  |                                 android:nextFocusRight="@id/sync_on_hold" | ||||||
|  |                                 android:nextFocusDown="@id/sync_plan_to_watch" | ||||||
|  | 
 | ||||||
|  |                                 android:layout_row="0" | ||||||
|  |                                 android:layout_column="0" | ||||||
|  |                                 android:text="@string/type_completed" | ||||||
|  |                                 style="@style/SyncButton" /> | ||||||
|  | 
 | ||||||
|  |                         <com.google.android.material.button.MaterialButton | ||||||
|  |                                 android:id="@+id/sync_on_hold" | ||||||
|  |                                 android:nextFocusDown="@id/sync_watching" | ||||||
|  |                                 android:nextFocusLeft="@id/sync_completed" | ||||||
|  | 
 | ||||||
|  |                                 android:layout_row="0" | ||||||
|  |                                 android:layout_column="1" | ||||||
|  |                                 style="@style/SyncButton" | ||||||
|  |                                 android:text="@string/type_on_hold" /> | ||||||
|  | 
 | ||||||
|  |                         <com.google.android.material.button.MaterialButton | ||||||
|  |                                 android:id="@+id/sync_plan_to_watch" | ||||||
|  |                                 android:nextFocusRight="@id/sync_plan_to_watch" | ||||||
|  |                                 android:nextFocusDown="@id/sync_dropped" | ||||||
|  |                                 android:nextFocusUp="@id/sync_completed" | ||||||
|  | 
 | ||||||
|  |                                 android:layout_row="1" | ||||||
|  |                                 android:layout_column="0" | ||||||
|  |                                 android:text="@string/type_plan_to_watch" | ||||||
|  |                                 style="@style/SyncButton" | ||||||
|  |                                 /> | ||||||
|  | 
 | ||||||
|  |                         <com.google.android.material.button.MaterialButton | ||||||
|  |                                 android:id="@+id/sync_watching" | ||||||
|  |                                 android:nextFocusLeft="@id/sync_plan_to_watch" | ||||||
|  |                                 android:nextFocusDown="@id/sync_dropped" | ||||||
|  |                                 android:nextFocusUp="@id/sync_on_hold" | ||||||
|  | 
 | ||||||
|  |                                 android:layout_row="1" | ||||||
|  |                                 android:layout_column="1" | ||||||
|  | 
 | ||||||
|  |                                 style="@style/SyncButton" | ||||||
|  |                                 android:text="@string/type_watching" /> | ||||||
|  | 
 | ||||||
|  |                     </GridLayout> | ||||||
|  | 
 | ||||||
|             <com.google.android.material.button.MaterialButton |             <com.google.android.material.button.MaterialButton | ||||||
|                     android:layout_height="30dp" |                     android:id="@+id/sync_dropped" | ||||||
|                     android:text="7/10" |                     android:nextFocusUp="@id/sync_plan_to_watch" | ||||||
|                     android:minWidth="0dp" | 
 | ||||||
|  |                     android:layout_width="match_parent" | ||||||
|  |                     style="@style/SyncButton" | ||||||
|  | 
 | ||||||
|  |                     android:text="@string/type_dropped" />--> | ||||||
|  | 
 | ||||||
|  |             <LinearLayout | ||||||
|  |                     android:orientation="horizontal" | ||||||
|  |                     android:layout_width="match_parent" | ||||||
|  |                     android:layout_height="wrap_content"> | ||||||
|  | 
 | ||||||
|  |                 <TextView | ||||||
|  |                         android:layout_gravity="center_vertical" | ||||||
|  |                         android:padding="10dp" | ||||||
|  |                         android:textSize="17sp" | ||||||
|  |                         android:textColor="?attr/textColor" | ||||||
|  |                         android:text="@string/sync_score" | ||||||
|  |                         android:layout_width="wrap_content" | ||||||
|  |                         android:layout_height="wrap_content" /> | ||||||
|  | 
 | ||||||
|  |                 <com.google.android.material.button.MaterialButton | ||||||
|  |                         android:id="@+id/result_sync_score_text" | ||||||
|  | 
 | ||||||
|  |                         android:layout_height="30dp" | ||||||
|  |                         android:text="7/10" | ||||||
|  |                         android:minWidth="0dp" | ||||||
|  |                         android:layout_width="wrap_content" | ||||||
|  |                         android:layout_gravity="center_vertical" | ||||||
|  |                         android:layout_marginStart="0dp" | ||||||
|  |                         style="@style/BlackButton" /> | ||||||
|  |             </LinearLayout> | ||||||
|  | 
 | ||||||
|  |             <com.google.android.material.slider.Slider | ||||||
|  |                     android:id="@+id/result_sync_rating" | ||||||
|  |                     android:valueFrom="0" | ||||||
|  |                     android:valueTo="10" | ||||||
|  |                     android:value="4" | ||||||
|  |                     android:stepSize="1" | ||||||
|  |                     app:tickVisible="false" | ||||||
|  |                     android:layout_marginStart="-5dp" | ||||||
|  |                     android:layout_marginEnd="-5dp" | ||||||
|  |                     app:thumbRadius="10dp" | ||||||
|  |                     app:labelStyle="@style/BlackLabel" | ||||||
|                     android:layout_width="wrap_content" |                     android:layout_width="wrap_content" | ||||||
|                     android:layout_gravity="center_vertical" |                     android:layout_height="wrap_content" /> | ||||||
|                     android:layout_marginStart="0dp" | 
 | ||||||
|                     style="@style/BlackButton" />--> |             <FrameLayout | ||||||
|  |                     android:visibility="gone" | ||||||
|  |                     android:paddingTop="12dp" | ||||||
|  |                     android:paddingBottom="12dp" | ||||||
|  |                     android:orientation="horizontal" | ||||||
|  |                     android:layout_width="match_parent" | ||||||
|  |                     android:layout_height="wrap_content"> | ||||||
|  | 
 | ||||||
|  |                 <TextView | ||||||
|  |                         android:id="@+id/home_parent_item_title" | ||||||
|  |                         style="@style/WatchHeaderText" | ||||||
|  |                         tools:text="Recommended" /> | ||||||
|  | 
 | ||||||
|  |                 <ImageView | ||||||
|  |                         app:tint="?attr/textColor" | ||||||
|  |                         android:layout_marginEnd="5dp" | ||||||
|  |                         android:layout_gravity="end|center_vertical" | ||||||
|  |                         android:src="@drawable/ic_baseline_arrow_forward_24" | ||||||
|  |                         android:layout_width="30dp" | ||||||
|  |                         android:layout_height="match_parent" | ||||||
|  |                         android:contentDescription="@string/home_more_info" /> | ||||||
|  |             </FrameLayout> | ||||||
|  | 
 | ||||||
|  |             <ListView | ||||||
|  |                     android:id="@+id/result_sync_check" | ||||||
|  |                     tools:listitem="@layout/sort_bottom_single_choice" | ||||||
|  |                     android:layout_width="match_parent" | ||||||
|  |                     android:layout_height="match_parent" | ||||||
|  |                     android:layout_rowWeight="1" /> | ||||||
|  | 
 | ||||||
|  |             <com.google.android.material.button.MaterialButton | ||||||
|  |                     android:visibility="gone" | ||||||
|  |                     android:layout_marginTop="10dp" | ||||||
|  |                     android:layout_width="match_parent" | ||||||
|  |                     style="@style/WhiteButton" | ||||||
|  |                     android:text="@string/type_watching" /> | ||||||
|  | 
 | ||||||
|  |             <com.google.android.material.button.MaterialButton | ||||||
|  |                     android:id="@+id/result_sync_set_score" | ||||||
|  |                     android:layout_marginTop="10dp" | ||||||
|  |                     android:layout_width="match_parent" | ||||||
|  |                     style="@style/BlackButton" | ||||||
|  |                     app:icon="@drawable/baseline_sync_24" | ||||||
|  |                     android:text="@string/upload_sync" /> | ||||||
|         </LinearLayout> |         </LinearLayout> | ||||||
| 
 | 
 | ||||||
|         <com.google.android.material.slider.Slider |     </ScrollView> | ||||||
|                 android:id="@+id/result_sync_rating" |  | ||||||
|                 android:valueFrom="0" |  | ||||||
|                 android:valueTo="10" |  | ||||||
|                 android:value="4" |  | ||||||
|                 android:stepSize="1" |  | ||||||
|                 app:tickVisible="false" |  | ||||||
|                 android:layout_marginStart="-5dp" |  | ||||||
|                 android:layout_marginEnd="-5dp" |  | ||||||
|                 app:thumbRadius="10dp" |  | ||||||
|                 app:labelStyle="@style/BlackLabel" |  | ||||||
|                 android:layout_width="wrap_content" |  | ||||||
|                 android:layout_height="wrap_content" /> |  | ||||||
| 
 |  | ||||||
|         <FrameLayout |  | ||||||
|                 android:visibility="gone" |  | ||||||
|                 android:paddingTop="12dp" |  | ||||||
|                 android:paddingBottom="12dp" |  | ||||||
|                 android:orientation="horizontal" |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 android:layout_height="wrap_content"> |  | ||||||
| 
 |  | ||||||
|             <TextView |  | ||||||
|                     android:id="@+id/home_parent_item_title" |  | ||||||
|                     style="@style/WatchHeaderText" |  | ||||||
|                     tools:text="Recommended" /> |  | ||||||
| 
 |  | ||||||
|             <ImageView |  | ||||||
|                     app:tint="?attr/textColor" |  | ||||||
|                     android:layout_marginEnd="5dp" |  | ||||||
|                     android:layout_gravity="end|center_vertical" |  | ||||||
|                     android:src="@drawable/ic_baseline_arrow_forward_24" |  | ||||||
|                     android:layout_width="30dp" |  | ||||||
|                     android:layout_height="match_parent" |  | ||||||
|                     android:contentDescription="@string/home_more_info" /> |  | ||||||
|         </FrameLayout> |  | ||||||
| 
 |  | ||||||
|         <TextView xmlns:android="http://schemas.android.com/apk/res/android" |  | ||||||
|                 xmlns:app="http://schemas.android.com/apk/res-auto" |  | ||||||
|                 xmlns:tools="http://schemas.android.com/tools" |  | ||||||
|                 style="@style/AppTextViewStyle" |  | ||||||
|                 android:id="@android:id/text1" |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 android:layout_height="wrap_content" |  | ||||||
|                 android:minHeight="?android:attr/listPreferredItemHeightSmall" |  | ||||||
|                 android:textAppearance="?android:attr/textAppearanceSmall" |  | ||||||
|                 android:textColor="@color/text_selection_color" |  | ||||||
|                 android:textSize="16sp" |  | ||||||
|                 android:textStyle="bold" |  | ||||||
|                 android:gravity="center_vertical" |  | ||||||
|                 android:paddingStart="12dp" |  | ||||||
|                 android:paddingEnd="7dip" |  | ||||||
|                 android:text="@string/type_watching" |  | ||||||
|                 android:checkMark="?android:attr/listChoiceIndicatorSingle" |  | ||||||
|                 android:ellipsize="marquee" |  | ||||||
|                 android:foreground="?attr/selectableItemBackgroundBorderless" |  | ||||||
|                 tools:drawableTint="?attr/textColor" |  | ||||||
|                 android:drawablePadding="20dp" |  | ||||||
|                 app:drawableTint="@color/check_selection_color" |  | ||||||
|                 app:drawableStartCompat="@drawable/ic_baseline_check_24" /> |  | ||||||
|         <TextView xmlns:android="http://schemas.android.com/apk/res/android" |  | ||||||
|                 xmlns:app="http://schemas.android.com/apk/res-auto" |  | ||||||
|                 xmlns:tools="http://schemas.android.com/tools" |  | ||||||
|                 style="@style/AppTextViewStyle" |  | ||||||
|                 android:id="@android:id/text1" |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 android:layout_height="wrap_content" |  | ||||||
|                 android:minHeight="?android:attr/listPreferredItemHeightSmall" |  | ||||||
|                 android:textAppearance="?android:attr/textAppearanceSmall" |  | ||||||
|                 android:textColor="@color/text_selection_color" |  | ||||||
|                 android:textSize="16sp" |  | ||||||
|                 android:textStyle="bold" |  | ||||||
|                 android:gravity="center_vertical" |  | ||||||
|                 android:paddingStart="12dp" |  | ||||||
|                 android:paddingEnd="7dip" |  | ||||||
|                 android:text="@string/type_on_hold" |  | ||||||
|                 android:checkMark="?android:attr/listChoiceIndicatorSingle" |  | ||||||
|                 android:ellipsize="marquee" |  | ||||||
|                 android:foreground="?attr/selectableItemBackgroundBorderless" |  | ||||||
|                 tools:drawableTint="?attr/textColor" |  | ||||||
|                 android:drawablePadding="20dp" |  | ||||||
|                 app:drawableTint="@color/check_selection_color" |  | ||||||
|                 app:drawableStartCompat="@drawable/ic_baseline_check_24" /> |  | ||||||
|         <TextView xmlns:android="http://schemas.android.com/apk/res/android" |  | ||||||
|                 xmlns:app="http://schemas.android.com/apk/res-auto" |  | ||||||
|                 xmlns:tools="http://schemas.android.com/tools" |  | ||||||
|                 style="@style/AppTextViewStyle" |  | ||||||
|                 android:id="@android:id/text1" |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 android:layout_height="wrap_content" |  | ||||||
|                 android:minHeight="?android:attr/listPreferredItemHeightSmall" |  | ||||||
|                 android:textAppearance="?android:attr/textAppearanceSmall" |  | ||||||
|                 android:textColor="@color/text_selection_color" |  | ||||||
|                 android:textSize="16sp" |  | ||||||
|                 android:textStyle="bold" |  | ||||||
|                 android:gravity="center_vertical" |  | ||||||
|                 android:paddingStart="12dp" |  | ||||||
|                 android:paddingEnd="7dip" |  | ||||||
|                 android:text="@string/type_completed" |  | ||||||
|                 android:checkMark="?android:attr/listChoiceIndicatorSingle" |  | ||||||
|                 android:ellipsize="marquee" |  | ||||||
|                 android:foreground="?attr/selectableItemBackgroundBorderless" |  | ||||||
|                 tools:drawableTint="?attr/textColor" |  | ||||||
|                 android:drawablePadding="20dp" |  | ||||||
|                 app:drawableTint="@color/check_selection_color" |  | ||||||
|                 app:drawableStartCompat="@drawable/ic_baseline_check_24" /> |  | ||||||
|         <TextView xmlns:android="http://schemas.android.com/apk/res/android" |  | ||||||
|                 xmlns:app="http://schemas.android.com/apk/res-auto" |  | ||||||
|                 xmlns:tools="http://schemas.android.com/tools" |  | ||||||
|                 style="@style/AppTextViewStyle" |  | ||||||
|                 android:id="@android:id/text1" |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 android:layout_height="wrap_content" |  | ||||||
|                 android:minHeight="?android:attr/listPreferredItemHeightSmall" |  | ||||||
|                 android:textAppearance="?android:attr/textAppearanceSmall" |  | ||||||
|                 android:textColor="@color/text_selection_color" |  | ||||||
|                 android:textSize="16sp" |  | ||||||
|                 android:textStyle="bold" |  | ||||||
|                 android:gravity="center_vertical" |  | ||||||
|                 android:paddingStart="12dp" |  | ||||||
|                 android:paddingEnd="7dip" |  | ||||||
|                 android:text="@string/type_plan_to_watch" |  | ||||||
|                 android:checkMark="?android:attr/listChoiceIndicatorSingle" |  | ||||||
|                 android:ellipsize="marquee" |  | ||||||
|                 android:foreground="?attr/selectableItemBackgroundBorderless" |  | ||||||
|                 tools:drawableTint="?attr/textColor" |  | ||||||
|                 android:drawablePadding="20dp" |  | ||||||
|                 app:drawableTint="@color/check_selection_color" |  | ||||||
|                 app:drawableStartCompat="@drawable/ic_baseline_check_24" /> |  | ||||||
|         <TextView xmlns:android="http://schemas.android.com/apk/res/android" |  | ||||||
|                 xmlns:app="http://schemas.android.com/apk/res-auto" |  | ||||||
|                 xmlns:tools="http://schemas.android.com/tools" |  | ||||||
|                 style="@style/AppTextViewStyle" |  | ||||||
|                 android:id="@android:id/text1" |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 android:layout_height="wrap_content" |  | ||||||
|                 android:minHeight="?android:attr/listPreferredItemHeightSmall" |  | ||||||
|                 android:textAppearance="?android:attr/textAppearanceSmall" |  | ||||||
|                 android:textColor="@color/text_selection_color" |  | ||||||
|                 android:textSize="16sp" |  | ||||||
|                 android:textStyle="bold" |  | ||||||
|                 android:gravity="center_vertical" |  | ||||||
|                 android:paddingStart="12dp" |  | ||||||
|                 android:paddingEnd="7dip" |  | ||||||
|                 android:text="@string/type_dropped" |  | ||||||
|                 android:checkMark="?android:attr/listChoiceIndicatorSingle" |  | ||||||
|                 android:ellipsize="marquee" |  | ||||||
|                 android:foreground="?attr/selectableItemBackgroundBorderless" |  | ||||||
|                 tools:drawableTint="?attr/textColor" |  | ||||||
|                 android:drawablePadding="20dp" |  | ||||||
|                 app:drawableTint="@color/check_selection_color" |  | ||||||
|                 app:drawableStartCompat="@drawable/ic_baseline_check_24" /> |  | ||||||
| 
 |  | ||||||
|         <com.google.android.material.button.MaterialButton |  | ||||||
|                 android:visibility="gone" |  | ||||||
|                 android:layout_marginTop="10dp" |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 style="@style/WhiteButton" |  | ||||||
|                 android:text="@string/type_watching" /> |  | ||||||
|         <com.google.android.material.button.MaterialButton |  | ||||||
|                 android:id="@+id/result_sync_set_score" |  | ||||||
|                 android:layout_marginTop="10dp" |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 style="@style/BlackButton" |  | ||||||
|                 app:icon="@drawable/baseline_sync_24" |  | ||||||
|                 android:text="@string/upload_sync" /> |  | ||||||
|     </LinearLayout> |  | ||||||
| 
 | 
 | ||||||
|     <com.facebook.shimmer.ShimmerFrameLayout |     <com.facebook.shimmer.ShimmerFrameLayout | ||||||
|  |             tools:visibility="gone" | ||||||
|             android:id="@+id/result_sync_loading_shimmer" |             android:id="@+id/result_sync_loading_shimmer" | ||||||
|             app:shimmer_base_alpha="0.2" |             app:shimmer_base_alpha="0.2" | ||||||
|             app:shimmer_highlight_alpha="0.3" |             app:shimmer_highlight_alpha="0.3" | ||||||
|  | @ -378,32 +280,45 @@ | ||||||
|                 android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|                 android:layout_height="wrap_content" |                 android:layout_height="wrap_content" | ||||||
|                 android:orientation="vertical"> |                 android:orientation="vertical"> | ||||||
|  | 
 | ||||||
|             <Space |             <Space | ||||||
|                     android:layout_width="match_parent" |                     android:layout_width="match_parent" | ||||||
|                     android:layout_height="30dp"/> |                     android:layout_height="30dp" /> | ||||||
|  | 
 | ||||||
|             <include layout="@layout/loading_line_short" /> |             <include layout="@layout/loading_line_short" /> | ||||||
| 
 | 
 | ||||||
|             <include layout="@layout/loading_line" /> |             <include layout="@layout/loading_line" /> | ||||||
|  | 
 | ||||||
|             <Space |             <Space | ||||||
|                     android:layout_width="match_parent" |                     android:layout_width="match_parent" | ||||||
|                     android:layout_height="30dp"/> |                     android:layout_height="30dp" /> | ||||||
|  | 
 | ||||||
|             <include layout="@layout/loading_line_short" /> |             <include layout="@layout/loading_line_short" /> | ||||||
|  | 
 | ||||||
|             <include layout="@layout/loading_line" /> |             <include layout="@layout/loading_line" /> | ||||||
|  | 
 | ||||||
|             <Space |             <Space | ||||||
|                     android:layout_width="match_parent" |                     android:layout_width="match_parent" | ||||||
|                     android:layout_height="30dp"/> |                     android:layout_height="30dp" /> | ||||||
|  | 
 | ||||||
|             <include layout="@layout/loading_line_short" /> |             <include layout="@layout/loading_line_short" /> | ||||||
|  | 
 | ||||||
|             <include layout="@layout/loading_line_short" /> |             <include layout="@layout/loading_line_short" /> | ||||||
|  | 
 | ||||||
|             <include layout="@layout/loading_line_short" /> |             <include layout="@layout/loading_line_short" /> | ||||||
|  | 
 | ||||||
|             <include layout="@layout/loading_line_short" /> |             <include layout="@layout/loading_line_short" /> | ||||||
|  | 
 | ||||||
|             <include layout="@layout/loading_line_short" /> |             <include layout="@layout/loading_line_short" /> | ||||||
|  | 
 | ||||||
|             <Space |             <Space | ||||||
|                     android:layout_width="match_parent" |                     android:layout_width="match_parent" | ||||||
|                     android:layout_height="30dp"/> |                     android:layout_height="30dp" /> | ||||||
|  | 
 | ||||||
|             <include layout="@layout/loading_line" /> |             <include layout="@layout/loading_line" /> | ||||||
|  | 
 | ||||||
|             <include layout="@layout/loading_line" /> |             <include layout="@layout/loading_line" /> | ||||||
| 
 | 
 | ||||||
|         </LinearLayout> |         </LinearLayout> | ||||||
|     </com.facebook.shimmer.ShimmerFrameLayout> |     </com.facebook.shimmer.ShimmerFrameLayout> | ||||||
| 
 |  | ||||||
| </FrameLayout> | </FrameLayout> | ||||||
|  | @ -1,23 +1,7 @@ | ||||||
| <TextView xmlns:android="http://schemas.android.com/apk/res/android" | <TextView xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|         xmlns:tools="http://schemas.android.com/tools" |         xmlns:tools="http://schemas.android.com/tools" | ||||||
|         xmlns:app="http://schemas.android.com/apk/res-auto" |         xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
|         style="@style/AppTextViewStyle" |         style="@style/CheckLabel" | ||||||
|         android:id="@android:id/text1" |         android:id="@android:id/text1" | ||||||
|         android:layout_width="match_parent" |         tools:text="hello" | ||||||
|         android:layout_height="wrap_content" |  | ||||||
|         android:minHeight="?android:attr/listPreferredItemHeightSmall" |  | ||||||
|         android:textAppearance="?android:attr/textAppearanceSmall" |  | ||||||
|         android:textColor="@color/text_selection_color" |  | ||||||
|         android:textSize="16sp" |  | ||||||
|         android:textStyle="bold" |  | ||||||
|         android:gravity="center_vertical" |  | ||||||
|         android:paddingStart="12dp" |  | ||||||
|         android:paddingEnd="7dip" |  | ||||||
|         tools:text="TEST" |  | ||||||
|         android:checkMark="?android:attr/listChoiceIndicatorSingle" |  | ||||||
|         android:ellipsize="marquee" |  | ||||||
|         android:foreground="?attr/selectableItemBackgroundBorderless" |  | ||||||
|         tools:drawableTint="?attr/textColor" |  | ||||||
|         android:drawablePadding="20dp" |  | ||||||
|         app:drawableTint="?attr/textColor" |  | ||||||
|         app:drawableStartCompat="@drawable/ic_baseline_add_24" /> |         app:drawableStartCompat="@drawable/ic_baseline_add_24" /> | ||||||
|  | @ -14,25 +14,7 @@ | ||||||
| --> | --> | ||||||
| 
 | 
 | ||||||
| <TextView xmlns:android="http://schemas.android.com/apk/res/android" | <TextView xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|         xmlns:app="http://schemas.android.com/apk/res-auto" |  | ||||||
|         xmlns:tools="http://schemas.android.com/tools" |         xmlns:tools="http://schemas.android.com/tools" | ||||||
|         style="@style/AppTextViewStyle" |         style="@style/CheckLabel" | ||||||
|         android:id="@android:id/text1" |         tools:text="hello" | ||||||
|         android:layout_width="match_parent" |         android:id="@android:id/text1" /> | ||||||
|         android:layout_height="wrap_content" |  | ||||||
|         android:minHeight="?android:attr/listPreferredItemHeightSmall" |  | ||||||
|         android:textAppearance="?android:attr/textAppearanceSmall" |  | ||||||
|         android:textColor="@color/text_selection_color" |  | ||||||
|         android:textSize="16sp" |  | ||||||
|         android:textStyle="bold" |  | ||||||
|         android:gravity="center_vertical" |  | ||||||
|         android:paddingStart="12dp" |  | ||||||
|         android:paddingEnd="7dip" |  | ||||||
|         tools:text="TEST" |  | ||||||
|         android:checkMark="?android:attr/listChoiceIndicatorSingle" |  | ||||||
|         android:ellipsize="marquee" |  | ||||||
|         android:foreground="?attr/selectableItemBackgroundBorderless" |  | ||||||
|         tools:drawableTint="?attr/textColor" |  | ||||||
|         android:drawablePadding="20dp" |  | ||||||
|         app:drawableTint="@color/check_selection_color" |  | ||||||
|         app:drawableStartCompat="@drawable/ic_baseline_check_24" /> |  | ||||||
|  |  | ||||||
|  | @ -395,7 +395,10 @@ | ||||||
|     <string name="add_sync">Add tracking</string> |     <string name="add_sync">Add tracking</string> | ||||||
|     <string name="added_sync_format" formatted="true">Added %s</string> |     <string name="added_sync_format" formatted="true">Added %s</string> | ||||||
|     <string name="upload_sync">Sync</string> |     <string name="upload_sync">Sync</string> | ||||||
| 
 |     <string name="sync_score">Rated</string> | ||||||
|  |     <string name="sync_score_format" formatted="true">%d / 10</string> | ||||||
|  |     <string name="sync_total_episodes_none">/??</string> | ||||||
|  |     <string name="sync_total_episodes_some" formatted="true">/%d</string> | ||||||
|     <!-- ============ --> |     <!-- ============ --> | ||||||
|     <string name="none">None</string> |     <string name="none">None</string> | ||||||
|     <string name="normal">Normal</string> |     <string name="normal">Normal</string> | ||||||
|  |  | ||||||
|  | @ -370,6 +370,24 @@ | ||||||
|         <item name="android:textColor">?attr/textColor</item> |         <item name="android:textColor">?attr/textColor</item> | ||||||
|     </style> |     </style> | ||||||
| 
 | 
 | ||||||
|  |     <style name="CheckLabel" parent="@style/AppTextViewStyle"> | ||||||
|  |         <item name="android:layout_width">match_parent</item> | ||||||
|  |         <item name="android:layout_height">wrap_content</item> | ||||||
|  |         <item name="android:minHeight">?android:attr/listPreferredItemHeightSmall</item> | ||||||
|  |         <item name="android:textColor">@color/text_selection_color</item> | ||||||
|  |         <item name="android:textSize">16sp</item> | ||||||
|  |         <item name="android:textStyle">bold</item> | ||||||
|  |         <item name="android:gravity">center_vertical</item> | ||||||
|  |         <item name="android:paddingStart">12dp</item> | ||||||
|  |         <item name="android:paddingEnd">12dp</item> | ||||||
|  |         <item name="android:checkMark">?android:attr/listChoiceIndicatorSingle</item> | ||||||
|  |         <item name="android:ellipsize">marquee</item> | ||||||
|  |         <item name="android:foreground">?attr/selectableItemBackgroundBorderless</item> | ||||||
|  |         <item name="android:drawablePadding">20dp</item> | ||||||
|  |         <item name="drawableTint">@color/check_selection_color</item> | ||||||
|  |         <item name="drawableStartCompat">@drawable/ic_baseline_check_24</item> | ||||||
|  |     </style> | ||||||
|  | 
 | ||||||
|     <style name="BlackButton" parent="NiceButton"> |     <style name="BlackButton" parent="NiceButton"> | ||||||
|         <item name="strokeColor">?attr/textColor</item> |         <item name="strokeColor">?attr/textColor</item> | ||||||
|         <item name="backgroundTint">?attr/iconGrayBackground</item> |         <item name="backgroundTint">?attr/iconGrayBackground</item> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue