Add purchased app history
This commit is contained in:
@@ -26,7 +26,7 @@ import com.aurora.gplayapi.data.models.StreamCluster
|
||||
import com.aurora.store.R
|
||||
import com.aurora.store.view.epoxy.groups.CarouselModelGroup
|
||||
import com.aurora.store.view.epoxy.groups.CarouselShimmerGroup
|
||||
import com.aurora.store.view.epoxy.views.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.AppProgressViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.NoAppViewModel_
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ import com.aurora.store.R
|
||||
import com.aurora.store.util.Log
|
||||
import com.aurora.store.view.epoxy.controller.GenericCarouselController
|
||||
import com.aurora.store.view.epoxy.views.AppProgressViewModel_
|
||||
import com.aurora.store.view.epoxy.views.AppViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppViewModel_
|
||||
import com.aurora.store.view.epoxy.views.HeaderViewModel_
|
||||
|
||||
class CarouselModelGroup(
|
||||
|
||||
@@ -22,6 +22,7 @@ package com.aurora.store.view.epoxy.views
|
||||
import android.view.View
|
||||
import android.view.animation.AnimationUtils
|
||||
import com.airbnb.epoxy.EpoxyModel
|
||||
import com.aurora.store.view.epoxy.views.app.AppListView
|
||||
|
||||
abstract class BaseView<T : View?> : EpoxyModel<T>() {
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
package com.aurora.store.view.epoxy.views
|
||||
package com.aurora.store.view.epoxy.views.app
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
@@ -33,6 +33,7 @@ import com.aurora.store.util.CommonUtil
|
||||
import com.aurora.store.util.extensions.clear
|
||||
import com.aurora.store.util.extensions.getString
|
||||
import com.aurora.store.util.extensions.load
|
||||
import com.aurora.store.view.epoxy.views.BaseView
|
||||
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
|
||||
|
||||
@ModelView(
|
||||
@@ -90,7 +91,7 @@ class AppListView : RelativeLayout {
|
||||
if (app.dependencies.dependentPackages.isNotEmpty())
|
||||
extras.add(getString(R.string.details_gsf_dependent))
|
||||
|
||||
B.txtLine3.text = extras.joinToString(separator = " • ")
|
||||
B.txtLine3.text = extras.joinToString(separator = " • ")
|
||||
}
|
||||
|
||||
@CallbackProp
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
package com.aurora.store.view.epoxy.views
|
||||
package com.aurora.store.view.epoxy.views.app
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
@@ -34,6 +34,7 @@ import com.aurora.store.databinding.ViewAppUpdateBinding
|
||||
import com.aurora.store.util.CommonUtil
|
||||
import com.aurora.store.util.extensions.clear
|
||||
import com.aurora.store.util.extensions.load
|
||||
import com.aurora.store.view.epoxy.views.BaseView
|
||||
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
|
||||
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
package com.aurora.store.view.epoxy.views
|
||||
package com.aurora.store.view.epoxy.views.app
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
@@ -32,6 +32,7 @@ import com.aurora.store.databinding.ViewAppBinding
|
||||
import com.aurora.store.util.CommonUtil
|
||||
import com.aurora.store.util.extensions.clear
|
||||
import com.aurora.store.util.extensions.load
|
||||
import com.aurora.store.view.epoxy.views.BaseView
|
||||
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
|
||||
|
||||
|
||||
|
||||
@@ -73,6 +73,7 @@ class AppsGamesActivity : BaseActivity() {
|
||||
when (position) {
|
||||
0 -> tab.text = getString(R.string.title_installed)
|
||||
1 -> tab.text = getString(R.string.title_library)
|
||||
2 -> tab.text = getString(R.string.title_purchase_history)
|
||||
else -> {
|
||||
}
|
||||
}
|
||||
@@ -89,6 +90,7 @@ class AppsGamesActivity : BaseActivity() {
|
||||
return when (position) {
|
||||
0 -> InstalledAppsFragment.newInstance()
|
||||
1 -> LibraryAppsFragment.newInstance()
|
||||
2 -> PurchasedAppsFragment.newInstance()
|
||||
else -> Fragment()
|
||||
}
|
||||
}
|
||||
@@ -97,7 +99,7 @@ class AppsGamesActivity : BaseActivity() {
|
||||
return if (isAnonymous)
|
||||
1
|
||||
else
|
||||
2
|
||||
3
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,7 @@ import com.aurora.Constants
|
||||
import com.aurora.gplayapi.data.models.App
|
||||
import com.aurora.store.R
|
||||
import com.aurora.store.databinding.FragmentUpdatesBinding
|
||||
import com.aurora.store.view.epoxy.views.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.HeaderViewModel_
|
||||
import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
|
||||
import com.aurora.store.view.ui.commons.BaseFragment
|
||||
|
||||
@@ -28,7 +28,7 @@ import com.aurora.gplayapi.data.models.StreamCluster
|
||||
import com.aurora.store.R
|
||||
import com.aurora.store.databinding.FragmentUpdatesBinding
|
||||
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
|
||||
import com.aurora.store.view.epoxy.views.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.AppProgressViewModel_
|
||||
import com.aurora.store.view.epoxy.views.HeaderViewModel_
|
||||
import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
* Aurora Store
|
||||
* Copyright (C) 2021, Rahul Kumar Patel <whyorean@gmail.com>
|
||||
*
|
||||
* Aurora Store is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Aurora Store is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Aurora Store. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.aurora.store.view.ui.all
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import com.aurora.Constants
|
||||
import com.aurora.gplayapi.data.models.App
|
||||
import com.aurora.store.R
|
||||
import com.aurora.store.databinding.FragmentUpdatesBinding
|
||||
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
|
||||
import com.aurora.store.view.epoxy.views.app.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.HeaderViewModel_
|
||||
import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
|
||||
import com.aurora.store.view.ui.commons.BaseFragment
|
||||
import com.aurora.store.view.ui.sheets.AppMenuSheet
|
||||
import com.aurora.store.viewmodel.all.InstalledViewModel
|
||||
import com.aurora.store.viewmodel.all.PurchasedViewModel
|
||||
|
||||
class PurchasedAppsFragment : BaseFragment() {
|
||||
|
||||
private lateinit var VM: PurchasedViewModel
|
||||
private lateinit var B: FragmentUpdatesBinding
|
||||
lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun newInstance(): PurchasedAppsFragment {
|
||||
return PurchasedAppsFragment().apply {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
B = FragmentUpdatesBinding.bind(
|
||||
inflater.inflate(
|
||||
R.layout.fragment_updates,
|
||||
container,
|
||||
false
|
||||
)
|
||||
)
|
||||
|
||||
VM = ViewModelProvider(requireActivity()).get(PurchasedViewModel::class.java)
|
||||
|
||||
return B.root
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
VM.liveData.observe(viewLifecycleOwner, {
|
||||
updateController(it)
|
||||
B.swipeRefreshLayout.isRefreshing = false
|
||||
})
|
||||
|
||||
B.swipeRefreshLayout.setOnRefreshListener {
|
||||
VM.observe()
|
||||
}
|
||||
|
||||
attachRecycler()
|
||||
|
||||
updateController(null)
|
||||
}
|
||||
|
||||
private fun attachRecycler() {
|
||||
endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() {
|
||||
override fun onLoadMore(currentPage: Int) {
|
||||
VM.observe()
|
||||
}
|
||||
}
|
||||
B.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)
|
||||
}
|
||||
|
||||
|
||||
private fun updateController(appList: List<App>?) {
|
||||
B.recycler.withModels {
|
||||
setFilterDuplicates(true)
|
||||
if (appList == null) {
|
||||
for (i in 1..6) {
|
||||
add(
|
||||
AppListViewShimmerModel_()
|
||||
.id(i)
|
||||
)
|
||||
}
|
||||
} else {
|
||||
add(
|
||||
HeaderViewModel_()
|
||||
.id("header")
|
||||
.title("${appList.size} apps purchased")
|
||||
)
|
||||
appList.forEach { app ->
|
||||
add(
|
||||
AppListViewModel_()
|
||||
.id(app.id)
|
||||
.app(app)
|
||||
.click { _ -> openDetailsActivity(app) }
|
||||
.longClick { _ ->
|
||||
openAppMenuSheet(app)
|
||||
false
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun openAppMenuSheet(app: App) {
|
||||
val fragment = childFragmentManager.findFragmentByTag(AppMenuSheet.TAG)
|
||||
if (fragment != null)
|
||||
childFragmentManager.beginTransaction().remove(fragment)
|
||||
|
||||
AppMenuSheet().apply {
|
||||
arguments = Bundle().apply {
|
||||
putString(Constants.STRING_EXTRA, gson.toJson(app))
|
||||
}
|
||||
}.show(
|
||||
childFragmentManager,
|
||||
AppMenuSheet.TAG
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@ import com.aurora.gplayapi.data.models.StreamCluster
|
||||
import com.aurora.store.R
|
||||
import com.aurora.store.databinding.FragmentTopContainerBinding
|
||||
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
|
||||
import com.aurora.store.view.epoxy.views.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.AppProgressViewModel_
|
||||
import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
|
||||
import com.aurora.store.view.ui.commons.BaseFragment
|
||||
|
||||
@@ -26,7 +26,7 @@ import com.aurora.gplayapi.data.models.StreamCluster
|
||||
import com.aurora.store.databinding.ActivityGenericRecyclerBinding
|
||||
import com.aurora.store.util.extensions.close
|
||||
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
|
||||
import com.aurora.store.view.epoxy.views.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.AppProgressViewModel_
|
||||
import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
|
||||
import com.aurora.store.viewmodel.browse.StreamBrowseViewModel
|
||||
|
||||
@@ -29,7 +29,7 @@ import com.aurora.gplayapi.data.models.SearchBundle
|
||||
import com.aurora.store.databinding.ActivityGenericRecyclerBinding
|
||||
import com.aurora.store.util.extensions.close
|
||||
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
|
||||
import com.aurora.store.view.epoxy.views.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.AppProgressViewModel_
|
||||
import com.aurora.store.view.ui.commons.BaseActivity
|
||||
import com.aurora.store.viewmodel.search.SearchResultViewModel
|
||||
|
||||
@@ -32,8 +32,8 @@ import com.aurora.store.util.extensions.close
|
||||
import com.aurora.store.util.extensions.load
|
||||
import com.aurora.store.util.extensions.toast
|
||||
import com.aurora.store.view.epoxy.groups.CarouselHorizontalModel_
|
||||
import com.aurora.store.view.epoxy.views.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.AppViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppViewModel_
|
||||
import com.aurora.store.view.epoxy.views.HeaderViewModel_
|
||||
import com.aurora.store.view.epoxy.views.details.ScreenshotViewModel_
|
||||
import com.aurora.store.view.ui.commons.BaseActivity
|
||||
|
||||
@@ -29,7 +29,7 @@ import com.aurora.gplayapi.data.models.StreamCluster
|
||||
import com.aurora.store.R
|
||||
import com.aurora.store.databinding.FragmentTopContainerBinding
|
||||
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
|
||||
import com.aurora.store.view.epoxy.views.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.AppProgressViewModel_
|
||||
import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
|
||||
import com.aurora.store.view.ui.commons.BaseFragment
|
||||
|
||||
@@ -26,7 +26,7 @@ import com.aurora.store.R
|
||||
import com.aurora.store.databinding.ActivityGenericRecyclerBinding
|
||||
import com.aurora.store.util.extensions.close
|
||||
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
|
||||
import com.aurora.store.view.epoxy.views.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.AppProgressViewModel_
|
||||
import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
|
||||
import com.aurora.store.view.ui.commons.BaseActivity
|
||||
|
||||
@@ -33,7 +33,7 @@ import com.aurora.store.databinding.ActivitySearchResultBinding
|
||||
import com.aurora.store.util.extensions.close
|
||||
import com.aurora.store.util.extensions.open
|
||||
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
|
||||
import com.aurora.store.view.epoxy.views.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppListViewModel_
|
||||
import com.aurora.store.view.epoxy.views.AppProgressViewModel_
|
||||
import com.aurora.store.view.ui.commons.BaseActivity
|
||||
import com.aurora.store.view.ui.downloads.DownloadActivity
|
||||
|
||||
@@ -37,7 +37,7 @@ import com.aurora.store.databinding.FragmentUpdatesBinding
|
||||
import com.aurora.store.util.Log
|
||||
import com.aurora.store.util.extensions.flushAndAdd
|
||||
import com.aurora.store.util.extensions.toast
|
||||
import com.aurora.store.view.epoxy.views.AppUpdateViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.AppUpdateViewModel_
|
||||
import com.aurora.store.view.epoxy.views.UpdateHeaderViewModel_
|
||||
import com.aurora.store.view.epoxy.views.app.NoAppViewModel_
|
||||
import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Aurora Store
|
||||
* Copyright (C) 2021, Rahul Kumar Patel <whyorean@gmail.com>
|
||||
*
|
||||
* Aurora Store is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Aurora Store is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Aurora Store. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.aurora.store.viewmodel.all
|
||||
|
||||
import android.app.Application
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.aurora.gplayapi.data.models.App
|
||||
import com.aurora.gplayapi.helpers.PurchaseHelper
|
||||
import com.aurora.store.data.RequestState
|
||||
import com.aurora.store.data.network.HttpClient
|
||||
import com.aurora.store.data.providers.AuthProvider
|
||||
import com.aurora.store.viewmodel.BaseAndroidViewModel
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.supervisorScope
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
|
||||
class PurchasedViewModel(application: Application) : BaseAndroidViewModel(application) {
|
||||
|
||||
private val authData = AuthProvider
|
||||
.with(application)
|
||||
.getAuthData()
|
||||
|
||||
private val purchaseHelper = PurchaseHelper(authData)
|
||||
.using(HttpClient.getPreferredClient())
|
||||
|
||||
val liveData: MutableLiveData<List<App>> = MutableLiveData()
|
||||
|
||||
var appList: MutableList<App> = mutableListOf()
|
||||
|
||||
init {
|
||||
requestState = RequestState.Init
|
||||
observe()
|
||||
}
|
||||
|
||||
override fun observe() {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
supervisorScope {
|
||||
try {
|
||||
appList.addAll(purchaseHelper.getPurchaseHistory(appList.size))
|
||||
liveData.postValue(appList)
|
||||
requestState = RequestState.Complete
|
||||
} catch (e: Exception) {
|
||||
requestState = RequestState.Pending
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCleared() {
|
||||
super.onCleared()
|
||||
}
|
||||
}
|
||||
@@ -117,13 +117,13 @@
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Aurora.Tab" parent="Widget.AppCompat.Light.ActionBar.TabText">
|
||||
<item name="android:fontFamily">@font/gilroy_extra_bold</item>
|
||||
<item name="android:textSize">12sp</item>
|
||||
<item name="android:textSize">14sp</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Aurora.Tab.Title" parent="TextAppearance.Aurora.Tab">
|
||||
<item name="android:letterSpacing">0.075</item>
|
||||
<item name="textAllCaps">true</item>
|
||||
<item name="textAllCaps">false</item>
|
||||
<item name="android:textStyle">bold</item>
|
||||
<item name="android:textSize">14sp</item>
|
||||
</style>
|
||||
|
||||
|
||||
@@ -286,6 +286,7 @@
|
||||
<string name="title_installed">"Installed"</string>
|
||||
<string name="title_language">"Language"</string>
|
||||
<string name="title_library">"Library"</string>
|
||||
<string name="title_purchase_history">"Purchase history"</string>
|
||||
<string name="title_settings">"Settings"</string>
|
||||
<string name="title_spoof_manager">"Spoof manager"</string>
|
||||
<string name="title_updates">"Updates"</string>
|
||||
|
||||
@@ -125,13 +125,11 @@
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Aurora.Tab" parent="Widget.AppCompat.Light.ActionBar.TabText">
|
||||
<item name="android:fontFamily">@font/gilroy_extra_bold</item>
|
||||
<item name="android:textSize">12sp</item>
|
||||
<item name="android:textSize">14sp</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Aurora.Tab.Title" parent="TextAppearance.Aurora.Tab">
|
||||
<item name="textAllCaps">true</item>
|
||||
<item name="android:textSize">14sp</item>
|
||||
<item name="textAllCaps">false</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Aurora.Chip" parent="TextAppearance.Aurora.SubTitle">
|
||||
|
||||
Reference in New Issue
Block a user