Migrate DetailsExodusActivity to fragment

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2023-07-06 10:32:29 +05:30
parent 7fab0496b9
commit e65b35f014
8 changed files with 69 additions and 119 deletions

View File

@@ -22,6 +22,7 @@
plugins { plugins {
id 'com.android.application' id 'com.android.application'
id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.android'
id 'org.jetbrains.kotlin.plugin.parcelize'
id 'org.jetbrains.kotlin.kapt' id 'org.jetbrains.kotlin.kapt'
id 'androidx.navigation.safeargs.kotlin' id 'androidx.navigation.safeargs.kotlin'
id 'org.jlleitschuh.gradle.ktlint' id 'org.jlleitschuh.gradle.ktlint'

View File

@@ -95,7 +95,6 @@
</activity> </activity>
<activity android:name=".view.ui.account.GoogleActivity" /> <activity android:name=".view.ui.account.GoogleActivity" />
<activity android:name=".view.ui.details.DetailsExodusActivity" />
<service android:name=".data.service.NotificationService" /> <service android:name=".data.service.NotificationService" />
<service android:name=".data.installer.InstallerService" /> <service android:name=".data.installer.InstallerService" />

View File

@@ -19,25 +19,29 @@
package com.aurora.store.data.model package com.aurora.store.data.model
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import java.text.DateFormat import java.text.DateFormat
import java.text.ParseException import java.text.ParseException
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
class ExodusReport { data class ExodusReport(
val creator: String = String() val creator: String = String(),
val name: String = String() val name: String = String(),
val reports: List<Report> = listOf() val reports: List<Report> = listOf()
} )
class Report { @Parcelize
val id: Int = 0 data class Report(
val downloads: String = String() val id: Int = 0,
val version: String = String() val downloads: String = String(),
val creationDate: String = String() val version: String = String(),
val updatedAt: String = String() val creationDate: String = String(),
val versionCode: String = String() val updatedAt: String = String(),
val versionCode: String = String(),
val trackers: List<Int> = listOf() val trackers: List<Int> = listOf()
) : Parcelable {
fun getFormattedCreationDate(): String { fun getFormattedCreationDate(): String {
return try { return try {
@@ -52,16 +56,17 @@ class Report {
} }
} }
class ExodusTracker { data class ExodusTracker(
var id: Int = 0 var id: Int = 0,
var name: String = String() var name: String = String(),
var url: String = String() var url: String = String(),
var signature: String = String() var signature: String = String(),
var date: String = String() var date: String = String(),
var description: String = String() var description: String = String(),
var networkSignature: String = String() var networkSignature: String = String(),
var documentation: List<String> = emptyList() var documentation: List<String> = emptyList(),
var categories: List<String> = emptyList() var categories: List<String> = emptyList()
) {
override fun hashCode(): Int { override fun hashCode(): Int {
return id return id

View File

@@ -1,48 +0,0 @@
/*
* 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.util
import android.app.ActivityOptions
import android.content.Context
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import com.aurora.Constants
import com.aurora.gplayapi.data.models.App
import com.aurora.store.data.model.Report
import com.aurora.store.view.ui.details.DetailsExodusActivity
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import java.lang.reflect.Modifier
object NavigationUtil {
val gson: Gson = GsonBuilder().excludeFieldsWithModifiers(Modifier.TRANSIENT).create()
fun openExodusActivity(context: Context, app: App, report: Report) {
val intent = Intent(
context,
DetailsExodusActivity::class.java
).apply {
putExtra(Constants.STRING_APP, gson.toJson(app))
putExtra(Constants.STRING_EXTRA, gson.toJson(report))
}
val options = ActivityOptions.makeSceneTransitionAnimation(context as AppCompatActivity)
context.startActivity(intent, options.toBundle())
}
}

View File

@@ -62,7 +62,6 @@ import com.aurora.gplayapi.data.models.StreamBundle
import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.gplayapi.helpers.AppDetailsHelper import com.aurora.gplayapi.helpers.AppDetailsHelper
import com.aurora.gplayapi.helpers.ReviewsHelper import com.aurora.gplayapi.helpers.ReviewsHelper
import com.aurora.store.MainActivity
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.State import com.aurora.store.State
import com.aurora.store.data.ViewState import com.aurora.store.data.ViewState
@@ -86,7 +85,6 @@ import com.aurora.store.databinding.LayoutDetailsPrivacyBinding
import com.aurora.store.databinding.LayoutDetailsReviewBinding import com.aurora.store.databinding.LayoutDetailsReviewBinding
import com.aurora.store.util.CommonUtil import com.aurora.store.util.CommonUtil
import com.aurora.store.util.Log import com.aurora.store.util.Log
import com.aurora.store.util.NavigationUtil
import com.aurora.store.util.PackageUtil import com.aurora.store.util.PackageUtil
import com.aurora.store.util.PathUtil import com.aurora.store.util.PathUtil
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
@@ -1036,7 +1034,10 @@ class AppDetailsFragment : BaseFragment(R.layout.fragment_details) {
} }
B.headerPrivacy.addClickListener { B.headerPrivacy.addClickListener {
NavigationUtil.openExodusActivity(requireContext(), app, report) findNavController().navigate(
AppDetailsFragmentDirections
.actionAppDetailsFragmentToDetailsExodusFragment(report)
)
} }
} else { } else {
B.txtStatus.apply { B.txtStatus.apply {

View File

@@ -20,76 +20,57 @@
package com.aurora.store.view.ui.details package com.aurora.store.view.ui.details
import android.os.Bundle import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.aurora.Constants import com.aurora.Constants
import com.aurora.gplayapi.data.models.App import com.aurora.extensions.browse
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.model.ExodusTracker import com.aurora.store.data.model.ExodusTracker
import com.aurora.store.data.model.Report import com.aurora.store.data.model.Report
import com.aurora.store.data.providers.ExodusDataProvider import com.aurora.store.data.providers.ExodusDataProvider
import com.aurora.store.databinding.ActivityGenericRecyclerBinding import com.aurora.store.databinding.ActivityGenericRecyclerBinding
import com.aurora.extensions.browse
import com.aurora.store.view.epoxy.views.HeaderViewModel_ import com.aurora.store.view.epoxy.views.HeaderViewModel_
import com.aurora.store.view.epoxy.views.details.ExodusViewModel_ import com.aurora.store.view.epoxy.views.details.ExodusViewModel_
import com.aurora.store.view.ui.commons.BaseActivity
import org.json.JSONObject import org.json.JSONObject
class DetailsExodusActivity : BaseActivity() { class DetailsExodusFragment : Fragment(R.layout.activity_generic_recycler) {
private lateinit var B: ActivityGenericRecyclerBinding private var _binding: ActivityGenericRecyclerBinding? = null
private lateinit var app: App private val binding: ActivityGenericRecyclerBinding
private lateinit var report: Report get() = _binding!!
override fun onConnected() { private val args: DetailsExodusFragmentArgs by navArgs()
} override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = ActivityGenericRecyclerBinding.bind(view)
override fun onDisconnected() { // Toolbar
binding.layoutToolbarAction.apply {
} txtTitle.text = ""
toolbar.setOnClickListener {
override fun onReconnected() { findNavController().navigateUp()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
B = ActivityGenericRecyclerBinding.inflate(layoutInflater)
setContentView(B.root)
val rawApp: String? = intent.getStringExtra(Constants.STRING_APP)
val rawExodusTrackers: String? = intent.getStringExtra(Constants.STRING_EXTRA)
if (rawApp != null) {
app = gson.fromJson(rawApp, App::class.java)
report = gson.fromJson(
rawExodusTrackers,
Report::class.java
)
app.let {
attachToolbar()
report.let {
updateController(getExodusTrackersFromReport(report))
}
} }
} }
updateController(getExodusTrackersFromReport(args.report))
} }
private fun attachToolbar() { override fun onDestroyView() {
B.layoutToolbarAction.toolbar.setOnClickListener { super.onDestroyView()
finishAfterTransition() _binding = null
}
B.layoutToolbarAction.txtTitle.text = app.displayName
} }
private fun updateController(reviews: List<ExodusTracker>) { private fun updateController(reviews: List<ExodusTracker>) {
B.recycler.withModels { binding.recycler.withModels {
add( add(
HeaderViewModel_() HeaderViewModel_()
.id("header") .id("header")
.title(getString(R.string.exodus_view_report)) .title(getString(R.string.exodus_view_report))
.browseUrl("browse") .browseUrl("browse")
.click { _ -> browse(Constants.EXODUS_REPORT_URL + report.id) } .click { _ -> context?.browse(Constants.EXODUS_REPORT_URL + args.report.id) }
) )
reviews.forEach { reviews.forEach {
add( add(
@@ -97,7 +78,7 @@ class DetailsExodusActivity : BaseActivity() {
.id(it.id) .id(it.id)
.tracker(it) .tracker(it)
.click { _ -> .click { _ ->
browse(it.url) context?.browse(it.url)
} }
) )
} }
@@ -124,7 +105,7 @@ class DetailsExodusActivity : BaseActivity() {
private fun fetchLocalTrackers(trackerIds: List<Int>): List<JSONObject> { private fun fetchLocalTrackers(trackerIds: List<Int>): List<JSONObject> {
return try { return try {
ExodusDataProvider ExodusDataProvider
.with(this) .with(requireContext())
.getFilteredTrackers(trackerIds) .getFilteredTrackers(trackerIds)
} catch (e: Exception) { } catch (e: Exception) {
emptyList() emptyList()

View File

@@ -117,6 +117,9 @@
<action <action
android:id="@+id/action_appDetailsFragment_to_detailsReviewFragment" android:id="@+id/action_appDetailsFragment_to_detailsReviewFragment"
app:destination="@id/detailsReviewFragment" /> app:destination="@id/detailsReviewFragment" />
<action
android:id="@+id/action_appDetailsFragment_to_detailsExodusFragment"
app:destination="@id/detailsExodusFragment" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/categoryBrowseFragment" android:id="@+id/categoryBrowseFragment"
@@ -199,7 +202,6 @@
<fragment <fragment
android:id="@+id/detailsMoreFragment" android:id="@+id/detailsMoreFragment"
android:name="com.aurora.store.view.ui.details.DetailsMoreFragment" android:name="com.aurora.store.view.ui.details.DetailsMoreFragment"
android:label="fragment_details_more"
tools:layout="@layout/fragment_details_more" > tools:layout="@layout/fragment_details_more" >
<argument <argument
android:name="app" android:name="app"
@@ -215,6 +217,14 @@
<argument android:name="packageName" <argument android:name="packageName"
app:argType="string" /> app:argType="string" />
</fragment> </fragment>
<fragment
android:id="@+id/detailsExodusFragment"
android:name="com.aurora.store.view.ui.details.DetailsExodusFragment"
tools:layout="@layout/activity_generic_recycler" >
<argument
android:name="report"
app:argType="com.aurora.store.data.model.Report" />
</fragment>
<action <action
android:id="@+id/action_global_appDetailsFragment" android:id="@+id/action_global_appDetailsFragment"
app:destination="@id/appDetailsFragment" /> app:destination="@id/appDetailsFragment" />

View File

@@ -22,6 +22,7 @@
plugins { plugins {
id 'com.android.application' version '8.0.2' apply false id 'com.android.application' version '8.0.2' apply false
id 'org.jetbrains.kotlin.android' version '1.8.21' apply false id 'org.jetbrains.kotlin.android' version '1.8.21' apply false
id 'org.jetbrains.kotlin.plugin.parcelize' version '1.8.21' apply false
id 'androidx.navigation.safeargs.kotlin' version '2.6.0' apply false id 'androidx.navigation.safeargs.kotlin' version '2.6.0' apply false
id 'org.jlleitschuh.gradle.ktlint' version '11.4.0' apply false id 'org.jlleitschuh.gradle.ktlint' version '11.4.0' apply false
id 'com.starter.easylauncher' version '6.2.0' apply false id 'com.starter.easylauncher' version '6.2.0' apply false