diff --git a/.idea/compiler.xml b/.idea/compiler.xml index fb7f4a8a4..b589d56e9 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 000000000..2b8a50fc2 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index c6a9b368a..e007d8abd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -430,7 +430,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 1ff4c6727..76116872f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,6 +12,7 @@ android { buildFeatures { viewBinding false + aidl true } defaultConfig { @@ -97,12 +98,12 @@ android { compileOptions { coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_11 + jvmTarget = JavaVersion.VERSION_17 } ndkVersion '25.2.9519653' @@ -151,6 +152,7 @@ dependencies { implementation 'androidx.viewpager2:viewpager2:1.1.0-beta02' implementation 'androidx.dynamicanimation:dynamicanimation-ktx:1.0.0-alpha03' implementation "androidx.security:security-crypto:1.1.0-alpha06" + implementation 'androidx.core:core-splashscreen:1.0.1' // Google implementation 'com.google.android.material:material:1.9.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 91c518838..e32d46dd2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -444,7 +444,7 @@ android:documentLaunchMode="intoExisting" android:exported="true" android:icon="@mipmap/ic_audio_player" - android:label="Inure Mini Player" + android:label="@string/audio_player" android:roundIcon="@mipmap/ic_audio_player_round" android:theme="@style/Inure.Transparent" android:windowSoftInputMode="adjustResize"> diff --git a/app/src/main/assets/html/changelogs.html b/app/src/main/assets/html/changelogs.html index a98249e34..9a0e62054 100644 --- a/app/src/main/assets/html/changelogs.html +++ b/app/src/main/assets/html/changelogs.html @@ -13,45 +13,66 @@
(Current Version) -

Build86

+

Build87

-

User Interface

- - -

Bug Fixes

-

Improvements

+

Changes

- -

Removed

- -

+
+ + +
+
+

User Interface

+ +
    +
  • Added new animation in various panel.
  • +
  • Added app icon in Notes Editor panel.
  • +
  • App Info grid layout can be now be adjusted separately for each layouts. +
  • +
  • Added option to change text size in Notes Editor.
  • +
  • Added Share in Notes panel.
  • +
  • Added tooltips popup on various buttons of the app.
  • +
+ +

Bug Fixes

+ +
    +
  • Fixed App Information loading indefinitely.
  • +
  • Fixed empty batch checklist.
  • +
  • Fixed showing permission switch dialog when app is not installed.
  • +
  • Fixed various issues with Installer.
  • +
+ +

Improvements

+ +
    +
  • Improved Inure Theme Engine.
  • +
  • Improved app's animation framework.
  • +
+ +

Removed

+ +
    +
  • Removed JSON spans option from Notes Editor.
  • +
+
+
+
diff --git a/app/src/main/java/app/simple/inure/activities/app/MainActivity.kt b/app/src/main/java/app/simple/inure/activities/app/MainActivity.kt index 341d91289..a33bef999 100644 --- a/app/src/main/java/app/simple/inure/activities/app/MainActivity.kt +++ b/app/src/main/java/app/simple/inure/activities/app/MainActivity.kt @@ -19,13 +19,30 @@ import app.simple.inure.constants.Warnings import app.simple.inure.crash.CrashReporter import app.simple.inure.decorations.theme.ThemeCoordinatorLayout import app.simple.inure.extensions.activities.BaseActivity -import app.simple.inure.preferences.* +import app.simple.inure.preferences.AppearancePreferences +import app.simple.inure.preferences.DevelopmentPreferences +import app.simple.inure.preferences.MainPreferences +import app.simple.inure.preferences.MusicPreferences +import app.simple.inure.preferences.TrialPreferences import app.simple.inure.terminal.Term import app.simple.inure.themes.manager.Theme import app.simple.inure.themes.manager.ThemeManager import app.simple.inure.themes.manager.ThemeUtils import app.simple.inure.ui.launcher.SplashScreen -import app.simple.inure.ui.panels.* +import app.simple.inure.ui.panels.Analytics +import app.simple.inure.ui.panels.Apps +import app.simple.inure.ui.panels.Batch +import app.simple.inure.ui.panels.DeviceInfo +import app.simple.inure.ui.panels.Home +import app.simple.inure.ui.panels.MostUsed +import app.simple.inure.ui.panels.Music +import app.simple.inure.ui.panels.Notes +import app.simple.inure.ui.panels.Preferences +import app.simple.inure.ui.panels.RecentlyInstalled +import app.simple.inure.ui.panels.RecentlyUpdated +import app.simple.inure.ui.panels.Search +import app.simple.inure.ui.panels.Statistics +import app.simple.inure.ui.panels.Uninstalled import app.simple.inure.ui.viewers.AudioPlayerPager import app.simple.inure.util.ActivityUtils.getTopFragment import app.simple.inure.util.AppUtils @@ -36,7 +53,8 @@ import app.simple.inure.util.Logger import app.simple.inure.util.NullSafety.isNull import com.topjohnwu.superuser.ipc.RootService import java.time.ZonedDateTime -import java.util.* +import java.util.Calendar +import java.util.TimeZone class MainActivity : BaseActivity() { @@ -76,6 +94,7 @@ class MainActivity : BaseActivity() { .addToBackStack("analytics") .commit() } + ShortcutConstants.APPS_ACTION -> { openHome() supportFragmentManager.beginTransaction() @@ -84,6 +103,7 @@ class MainActivity : BaseActivity() { .addToBackStack("apps") .commit() } + ShortcutConstants.BATCH_ACTION -> { openHome() supportFragmentManager.beginTransaction() @@ -92,6 +112,7 @@ class MainActivity : BaseActivity() { .addToBackStack("batch") .commit() } + ShortcutConstants.MOST_USED_ACTION -> { openHome() supportFragmentManager.beginTransaction() @@ -100,6 +121,7 @@ class MainActivity : BaseActivity() { .addToBackStack("most_used") .commit() } + ShortcutConstants.NOTES_ACTION -> { openHome() supportFragmentManager.beginTransaction() @@ -108,6 +130,7 @@ class MainActivity : BaseActivity() { .addToBackStack("notes") .commit() } + ShortcutConstants.RECENTLY_INSTALLED_ACTION -> { openHome() supportFragmentManager.beginTransaction() @@ -116,6 +139,7 @@ class MainActivity : BaseActivity() { .addToBackStack("recently_installed") .commit() } + ShortcutConstants.RECENTLY_UPDATED_ACTION -> { openHome() supportFragmentManager.beginTransaction() @@ -124,11 +148,13 @@ class MainActivity : BaseActivity() { .addToBackStack("recently_updated") .commit() } + ShortcutConstants.TERMINAL_ACTION -> { openHome() startActivity(Intent(this, Term::class.java)) finish() } + ShortcutConstants.UNINSTALLED_ACTION -> { openHome() supportFragmentManager.beginTransaction() @@ -137,6 +163,7 @@ class MainActivity : BaseActivity() { .addToBackStack("uninstalled") .commit() } + ShortcutConstants.USAGE_STATS_ACTION -> { openHome() supportFragmentManager.beginTransaction() @@ -145,6 +172,7 @@ class MainActivity : BaseActivity() { .addToBackStack("stats") .commit() } + ShortcutConstants.PREFERENCES_ACTION -> { openHome() supportFragmentManager.beginTransaction() @@ -153,6 +181,7 @@ class MainActivity : BaseActivity() { .addToBackStack("preferences") .commit() } + ShortcutConstants.SEARCH_ACTION -> { openHome() supportFragmentManager.beginTransaction() @@ -161,6 +190,7 @@ class MainActivity : BaseActivity() { .addToBackStack("search") .commit() } + ShortcutConstants.MUSIC_ACTION -> { openHome() supportFragmentManager.beginTransaction() @@ -169,6 +199,7 @@ class MainActivity : BaseActivity() { .addToBackStack("music") .commit() } + ShortcutConstants.AUDIO_PLAYER_ACTION -> { if (supportFragmentManager.findFragmentByTag("audio_player_pager") == null) { supportFragmentManager.beginTransaction() @@ -193,6 +224,7 @@ class MainActivity : BaseActivity() { .commit() } } + "open_device_info" -> { openHome() supportFragmentManager.beginTransaction() @@ -201,6 +233,7 @@ class MainActivity : BaseActivity() { .addToBackStack("device_info") .commit() } + IntentConstants.ACTION_UNLOCK -> { if (packageManager.isPackageInstalled(AppUtils.unlockerPackageName)) { if (TrialPreferences.isFullVersion()) { @@ -233,6 +266,7 @@ class MainActivity : BaseActivity() { .commit() } } + else -> { if (AppUtils.isBetaFlavor()) { supportFragmentManager.beginTransaction() diff --git a/app/src/main/java/app/simple/inure/constants/BundleConstants.kt b/app/src/main/java/app/simple/inure/constants/BundleConstants.kt index b6373c3fc..8b3428f3b 100644 --- a/app/src/main/java/app/simple/inure/constants/BundleConstants.kt +++ b/app/src/main/java/app/simple/inure/constants/BundleConstants.kt @@ -1,6 +1,7 @@ package app.simple.inure.constants object BundleConstants { + const val skip = "skip" const val state = "state" const val size = "size" const val keywords: String = "keywords" diff --git a/app/src/main/java/app/simple/inure/glide/modules/AppIconModule.kt b/app/src/main/java/app/simple/inure/glide/modules/AppIconModule.kt index 3853fdc30..961a6afd0 100644 --- a/app/src/main/java/app/simple/inure/glide/modules/AppIconModule.kt +++ b/app/src/main/java/app/simple/inure/glide/modules/AppIconModule.kt @@ -53,6 +53,5 @@ class AppIconModule : AppGlideModule() { override fun registerComponents(context: Context, glide: Glide, registry: Registry) { registry.append(AppIcon::class.java, Bitmap::class.java, AppIconLoader.Factory()) - //registry.append(AppGraphicsModel::class.java, InputStream::class.java, AppGraphicsLoader.Factory()) } } \ No newline at end of file diff --git a/app/src/main/java/app/simple/inure/preferences/BehaviourPreferences.kt b/app/src/main/java/app/simple/inure/preferences/BehaviourPreferences.kt index 81391546d..dcdb80e49 100644 --- a/app/src/main/java/app/simple/inure/preferences/BehaviourPreferences.kt +++ b/app/src/main/java/app/simple/inure/preferences/BehaviourPreferences.kt @@ -105,7 +105,7 @@ object BehaviourPreferences { SharedPreferences.getSharedPreferences().edit().putBoolean(skipLoading, boolean).apply() } - fun isSkipLoadingMainScreenState(): Boolean { + fun isSkipLoading(): Boolean { return SharedPreferences.getSharedPreferences().getBoolean(skipLoading, false) } 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 c13e92bef..abd9a277f 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 @@ -20,6 +20,7 @@ import androidx.lifecycle.lifecycleScope import androidx.localbroadcastmanager.content.LocalBroadcastManager import app.simple.inure.R import app.simple.inure.apk.utils.PackageUtils.isPackageInstalled +import app.simple.inure.constants.BundleConstants import app.simple.inure.constants.Misc import app.simple.inure.constants.Warnings import app.simple.inure.crash.CrashReporter @@ -75,6 +76,7 @@ class SplashScreen : ScopedFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + startPostponedEnterTransition() intentFilter.addAction(DataLoaderService.APPS_LOADED) intentFilter.addAction(DataLoaderService.UNINSTALLED_APPS_LOADED) @@ -103,8 +105,6 @@ class SplashScreen : ScopedFragment() { } } - startPostponedEnterTransition() - icon = view.findViewById(R.id.imageView) loaderImageView = view.findViewById(R.id.loader) daysLeft = view.findViewById(R.id.days_left) @@ -115,7 +115,7 @@ class SplashScreen : ScopedFragment() { icon.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.app_icon_animation)) } - if (BehaviourPreferences.isSkipLoadingMainScreenState()) { + if (BehaviourPreferences.isSkipLoading()) { loaderImageView.alpha = 0F } @@ -130,20 +130,23 @@ class SplashScreen : ScopedFragment() { } when { - MainPreferences.isDisclaimerAgreed().invert() -> { + MainPreferences.isDisclaimerAgreed().invert() -> { // First check if disclaimer is agreed openFragmentSlide(Disclaimer.newInstance()) } - requireArguments().getBoolean("skip") -> { + + requireArguments().getBoolean(BundleConstants.skip) -> { // Second check if setup is skipped startLoaderService() } + !checkForPermission() -> { - if (SetupPreferences.isDontShowAgain()) { + if (SetupPreferences.isDontShowAgain()) { // If setup not skipped open setup startLoaderService() } else { openFragmentSlide(Setup.newInstance()) } } - else -> { + + else -> { // Load all data startLoaderService() } } @@ -277,14 +280,13 @@ class SplashScreen : ScopedFragment() { openApp() } - if (BehaviourPreferences.isSkipLoadingMainScreenState()) { - openFragmentArc(Home.newInstance(), icon) + if (BehaviourPreferences.isSkipLoading()) { + openApp() } } private fun openApp() { - if (BehaviourPreferences.isSkipLoadingMainScreenState()) return - if (isEverythingLoaded()) { + if (isEverythingLoaded() || BehaviourPreferences.isSkipLoading()) { if (MainPreferences.getLaunchCount() % 7 == 0 && StatusBarHeight.isLandscape(requireContext()).invert() && AppUtils.isPlayFlavor()) { if (MainPreferences.isShowRateReminder()) { requireActivity().supportFragmentManager.beginTransaction() @@ -416,7 +418,7 @@ class SplashScreen : ScopedFragment() { companion object { fun newInstance(skip: Boolean): SplashScreen { val args = Bundle() - args.putBoolean("skip", skip) + args.putBoolean(BundleConstants.skip, skip) val fragment = SplashScreen() fragment.arguments = args return fragment diff --git a/app/src/main/java/app/simple/inure/ui/preferences/mainscreens/BehaviourScreen.kt b/app/src/main/java/app/simple/inure/ui/preferences/mainscreens/BehaviourScreen.kt index 4f6d602db..0afbecf28 100644 --- a/app/src/main/java/app/simple/inure/ui/preferences/mainscreens/BehaviourScreen.kt +++ b/app/src/main/java/app/simple/inure/ui/preferences/mainscreens/BehaviourScreen.kt @@ -64,7 +64,7 @@ class BehaviourScreen : ScopedFragment() { transition.setChecked(BehaviourPreferences.isTransitionOn()) animations.setChecked(BehaviourPreferences.isArcAnimationOn()) marquee.setChecked(BehaviourPreferences.isMarqueeOn()) - skipLoading.setChecked(BehaviourPreferences.isSkipLoadingMainScreenState()) + skipLoading.setChecked(BehaviourPreferences.isSkipLoading()) setTransitionType() setArcType() diff --git a/app/src/main/java/app/simple/inure/viewmodels/panels/BatteryOptimizationViewModel.kt b/app/src/main/java/app/simple/inure/viewmodels/panels/BatteryOptimizationViewModel.kt index 36f1394ed..71eb632a9 100644 --- a/app/src/main/java/app/simple/inure/viewmodels/panels/BatteryOptimizationViewModel.kt +++ b/app/src/main/java/app/simple/inure/viewmodels/panels/BatteryOptimizationViewModel.kt @@ -10,7 +10,6 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import app.simple.inure.apk.utils.PackageUtils import app.simple.inure.constants.SortConstant -import app.simple.inure.constants.Warnings import app.simple.inure.extensions.viewmodels.RootShizukuViewModel import app.simple.inure.models.BatteryOptimizationModel import app.simple.inure.preferences.BatteryOptimizationPreferences @@ -264,7 +263,6 @@ class BatteryOptimizationViewModel(application: Application) : RootShizukuViewMo } override fun onShellDenied() { - warning.postValue(Warnings.getNoRootConnectionWarning()) batteryOptimizationData.postValue(ArrayList()) } diff --git a/build.gradle b/build.gradle index c23ac1fa9..cf1d4108e 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.4.2' + classpath 'com.android.tools.build:gradle:8.0.0' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0' classpath "com.autonomousapps:dependency-analysis-gradle-plugin:1.18.0" diff --git a/gradle.properties b/gradle.properties index ca36a32b3..40628daa8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,4 +19,7 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -org.gradle.unsafe.configuration-cache=true \ No newline at end of file +org.gradle.unsafe.configuration-cache=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 012d6d904..1a26ff28f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionSha256Sum=cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2 -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists