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