Add purchased app history

This commit is contained in:
Rahul Kumar Patel
2021-02-20 02:27:59 +05:30
parent c394a9347d
commit c6f528c82e
22 changed files with 246 additions and 25 deletions

View File

@@ -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_

View File

@@ -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(

View File

@@ -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>() {

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
}
}
}

View File

@@ -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

View File

@@ -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_

View File

@@ -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
)
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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_

View File

@@ -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()
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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">