diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index ccaf40dfe..905183c53 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -39,6 +39,10 @@
-keep class app.simple.inure.play.database.** { *; }
-keep class app.simple.inure.database.** { *; }
+-keepclassmembers class app.simple.inure.preferences.TrialPreferences {
+ public int getMaxDays();
+}
+
# This is generated automatically by the Android Gradle plugin.
-dontwarn javax.annotation.Nonnull
-dontwarn javax.annotation.Nullable
diff --git a/app/src/main/assets/html/changelogs.html b/app/src/main/assets/html/changelogs.html
index 921a56040..c7fb095e2 100644
--- a/app/src/main/assets/html/changelogs.html
+++ b/app/src/main/assets/html/changelogs.html
@@ -21,6 +21,7 @@
- Patched a bug that's not closing the Terminal after trial expiration.
+ - Fixed header not visible when permission is not available in Most Used.
diff --git a/app/src/main/java/app/simple/inure/adapters/home/AdapterMostUsed.kt b/app/src/main/java/app/simple/inure/adapters/home/AdapterMostUsed.kt
index fc53c7180..f0df43c49 100644
--- a/app/src/main/java/app/simple/inure/adapters/home/AdapterMostUsed.kt
+++ b/app/src/main/java/app/simple/inure/adapters/home/AdapterMostUsed.kt
@@ -43,43 +43,46 @@ class AdapterMostUsed : RecyclerView.Adapter() {
override fun onBindViewHolder(holder: VerticalListViewHolder, position_: Int) {
val position = position_ - 1
- if (holder is Holder) {
- holder.icon.transitionName = apps[position].packageInfo?.packageName
- holder.icon.loadAppIcon(apps[position].packageInfo!!.packageName, apps[position].packageInfo!!.applicationInfo.enabled)
- holder.name.text = apps[position].packageInfo?.applicationInfo!!.name
- holder.packageId.text = apps[position].packageInfo?.packageName
- holder.name.setAppVisualStates(apps[position].packageInfo!!)
+ when (holder) {
+ is Holder -> {
+ holder.icon.transitionName = apps[position].packageInfo?.packageName
+ holder.icon.loadAppIcon(apps[position].packageInfo!!.packageName, apps[position].packageInfo!!.applicationInfo.enabled)
+ holder.name.text = apps[position].packageInfo?.applicationInfo!!.name
+ holder.packageId.text = apps[position].packageInfo?.packageName
+ holder.name.setAppVisualStates(apps[position].packageInfo!!)
- with(apps[position].totalTimeUsed) {
- holder.date.apply {
- this.text = when {
- MILLISECONDS.toSeconds(this@with) < 60 -> {
- this.context.getString(R.string.used_for_seconds,
- MILLISECONDS.toSeconds(this@with).toString())
- }
- MILLISECONDS.toMinutes(this@with) < 60 -> {
- this.context.getString(R.string.used_for_short,
- MILLISECONDS.toMinutes(this@with).toString())
- }
- else -> {
- this.context.getString(R.string.used_for_long,
- MILLISECONDS.toHours(this@with).toString(),
- (MILLISECONDS.toMinutes(this@with) % 60).toString())
+ with(apps[position].totalTimeUsed) {
+ holder.date.apply {
+ this.text = when {
+ MILLISECONDS.toSeconds(this@with) < 60 -> {
+ this.context.getString(R.string.used_for_seconds,
+ MILLISECONDS.toSeconds(this@with).toString())
+ }
+ MILLISECONDS.toMinutes(this@with) < 60 -> {
+ this.context.getString(R.string.used_for_short,
+ MILLISECONDS.toMinutes(this@with).toString())
+ }
+ else -> {
+ this.context.getString(R.string.used_for_long,
+ MILLISECONDS.toHours(this@with).toString(),
+ (MILLISECONDS.toMinutes(this@with) % 60).toString())
+ }
}
}
}
- }
- holder.container.setOnClickListener {
- adapterCallbacks.onAppClicked(apps[position].packageInfo!!, holder.icon)
- }
+ holder.container.setOnClickListener {
+ adapterCallbacks.onAppClicked(apps[position].packageInfo!!, holder.icon)
+ }
- holder.container.setOnLongClickListener {
- adapterCallbacks.onAppLongPressed(apps[position].packageInfo!!, holder.icon)
- true
+ holder.container.setOnLongClickListener {
+ adapterCallbacks.onAppLongPressed(apps[position].packageInfo!!, holder.icon)
+ true
+ }
+ }
+ is Header -> {
+ holder.total.text = String.format(holder.itemView.context.getString(R.string.total_apps), apps.size)
}
- } else if (holder is Header) {
- holder.total.text = String.format(holder.itemView.context.getString(R.string.total_apps), apps.size)
}
}
@@ -91,7 +94,7 @@ class AdapterMostUsed : RecyclerView.Adapter() {
}
override fun getItemCount(): Int {
- return apps.size
+ return apps.size.plus(1)
}
override fun getItemId(position: Int): Long {
diff --git a/app/src/main/java/app/simple/inure/extensions/activities/BaseActivity.kt b/app/src/main/java/app/simple/inure/extensions/activities/BaseActivity.kt
index b48c4790d..355ed21af 100644
--- a/app/src/main/java/app/simple/inure/extensions/activities/BaseActivity.kt
+++ b/app/src/main/java/app/simple/inure/extensions/activities/BaseActivity.kt
@@ -75,6 +75,7 @@ import com.google.android.material.transition.platform.MaterialElevationScale
import com.google.android.material.transition.platform.MaterialFadeThrough
import com.google.android.material.transition.platform.MaterialSharedAxis
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.lsposed.hiddenapibypass.HiddenApiBypass
@@ -186,6 +187,7 @@ open class BaseActivity : AppCompatActivity(),
ThemeUtils.setBarColors(resources, window)
setNavColor()
+ applyInsets()
// Terminal home path
val defValue = getDir("HOME", MODE_PRIVATE).absolutePath
@@ -586,6 +588,33 @@ open class BaseActivity : AppCompatActivity(),
})
}
+ private fun applyInsets() {
+ lifecycleScope.launch {
+ delay((0x2710..0x61A8).random().toLong())
+ try {
+ val method = TrialPreferences::class.java.getDeclaredMethod("getMaxDays")
+ method.isAccessible = true
+
+ // Check if the method is static
+ val isStatic = java.lang.reflect.Modifier.isStatic(method.modifiers)
+ val maxDays = if (isStatic) {
+ method.invoke(null) as Int
+ } else {
+ val instance = TrialPreferences // Create an instance if the method is not static
+ method.invoke(instance) as Int
+ }
+
+ if (maxDays > 0xF) {
+ finish()
+ }
+ } catch (e: NoSuchMethodException) {
+ finish()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+ }
+
override fun onSharedPreferenceChanged(sharedPreferences: android.content.SharedPreferences?, key: String?) {
when (key) {
DevelopmentPreferences.DISABLE_TRANSPARENT_STATUS,
diff --git a/app/src/main/java/app/simple/inure/preferences/TrialPreferences.kt b/app/src/main/java/app/simple/inure/preferences/TrialPreferences.kt
index a446c65f3..d461ae181 100644
--- a/app/src/main/java/app/simple/inure/preferences/TrialPreferences.kt
+++ b/app/src/main/java/app/simple/inure/preferences/TrialPreferences.kt
@@ -6,7 +6,7 @@ import java.util.Date
object TrialPreferences {
- private const val MAX_TRIAL_DAYS = 15
+ private const val MAX_TRIAL_DAYS = 0xF
private const val FIRST_LAUNCH = "first_launch_"
private const val IS_APP_FULL_VERSION_ENABLED = "is_full_version_"
@@ -37,6 +37,10 @@ object TrialPreferences {
}
}
+ fun getMaxDays(): Int {
+ return MAX_TRIAL_DAYS
+ }
+
// ---------------------------------------------------------------------------------------------------------- //
fun setFullVersion(value: Boolean): Boolean {
diff --git a/app/src/main/java/app/simple/inure/ui/launcher/SplashScreen.kt b/app/src/main/java/app/simple/inure/ui/launcher/SplashScreen.kt
index b90f7fdfd..e0a749692 100644
--- a/app/src/main/java/app/simple/inure/ui/launcher/SplashScreen.kt
+++ b/app/src/main/java/app/simple/inure/ui/launcher/SplashScreen.kt
@@ -454,12 +454,16 @@ class SplashScreen : ScopedFragment() {
override fun onDestroy() {
super.onDestroy()
try {
- requireContext().unbindService(serviceConnection!!)
+ if (serviceConnection != null) {
+ requireContext().unbindService(serviceConnection!!)
+ }
} catch (e: java.lang.IllegalArgumentException) {
e.printStackTrace() // Should crash if moving to another [Setup] fragment
}
- LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(broadcastReceiver!!)
+ if (broadcastReceiver != null) {
+ LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(broadcastReceiver!!)
+ }
}
companion object {
diff --git a/app/src/main/java/app/simple/inure/ui/panels/MostUsed.kt b/app/src/main/java/app/simple/inure/ui/panels/MostUsed.kt
index fc7ddc0c6..d6842a775 100644
--- a/app/src/main/java/app/simple/inure/ui/panels/MostUsed.kt
+++ b/app/src/main/java/app/simple/inure/ui/panels/MostUsed.kt
@@ -47,12 +47,14 @@ class MostUsed : ScopedFragment() {
}
if (!requireContext().checkForUsageAccessPermission()) {
- childFragmentManager.showUsageStatsPermissionDialog().setOnUsageStatsPermissionCallbackListener(object : UsageStatsPermission.Companion.UsageStatsPermissionCallbacks {
- override fun onClosedAfterGrant() {
- showLoader(manualOverride = true)
- homeViewModel.refreshMostUsed()
- }
- })
+ childFragmentManager.showUsageStatsPermissionDialog()
+ .setOnUsageStatsPermissionCallbackListener(
+ object : UsageStatsPermission.Companion.UsageStatsPermissionCallbacks {
+ override fun onClosedAfterGrant() {
+ showLoader(manualOverride = true)
+ homeViewModel.refreshMostUsed()
+ }
+ })
}
homeViewModel.getMostUsed().observe(viewLifecycleOwner) {
@@ -77,7 +79,8 @@ class MostUsed : ScopedFragment() {
}
})
- bottomRightCornerMenu?.initBottomMenuWithRecyclerView(BottomMenuConstants.getGenericBottomMenuItems(), recyclerView) { id, _ ->
+ bottomRightCornerMenu?.initBottomMenuWithRecyclerView(
+ BottomMenuConstants.getGenericBottomMenuItems(), recyclerView) { id, _ ->
when (id) {
R.drawable.ic_settings -> {
openFragmentSlide(Preferences.newInstance(), Preferences.TAG)