diff --git a/app/src/main/java/com/fox2code/mmm/MainActivity.kt b/app/src/main/java/com/fox2code/mmm/MainActivity.kt index 0bce7a8..f9f1a40 100644 --- a/app/src/main/java/com/fox2code/mmm/MainActivity.kt +++ b/app/src/main/java/com/fox2code/mmm/MainActivity.kt @@ -130,7 +130,15 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis // check if this build has expired val buildTime = Timestamp(BuildConfig.BUILD_TIME) // if the build time is more than 30 days ago, throw an exception - check(ts.time < buildTime.time) { "This build has expired. Please download a stable build or update to the latest version." } + if (BuildConfig.DEBUG) { + check(ts.time < buildTime.time) { getString(R.string.build_expired) } + } else { + // non-debug builds expire after 1 year but only show a toast + val ts2 = Timestamp(System.currentTimeMillis() - 365L * 24 * 60 * 60 * 1000) + if (ts2.time > buildTime.time) { + Toast.makeText(this, R.string.build_expired, Toast.LENGTH_LONG).show() + } + } setContentView(R.layout.activity_main) this.setTitle(R.string.app_name) // set window flags to ignore status bar @@ -245,6 +253,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out) finish() } + R.id.online_menu_item -> { TrackHelper.track().event("view_list", "online_modules") .with(MainApplication.INSTANCE!!.tracker) @@ -262,6 +271,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis searchView.setQuery("", false) searchView.clearFocus() } + R.id.installed_menu_item -> { TrackHelper.track().event("view_list", "installed_modules") .with(MainApplication.INSTANCE!!.tracker) @@ -377,13 +387,11 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis RepoManager.getINSTANCE().update { value: Double -> runOnUiThread(if (max == 0) Runnable { progressIndicator.setProgressCompat( - (value * PRECISION).toInt(), - true + (value * PRECISION).toInt(), true ) } else Runnable { progressIndicator.setProgressCompat( - (value * PRECISION * 0.75f).toInt(), - true + (value * PRECISION * 0.75f).toInt(), true ) }) } @@ -597,8 +605,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis RepoManager.getINSTANCE().update { value: Double -> runOnUiThread { progressIndicator!!.setProgressCompat( - (value * PRECISION).toInt(), - true + (value * PRECISION).toInt(), true ) } } @@ -639,13 +646,11 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis RepoManager.getINSTANCE().update { value: Double -> runOnUiThread(if (max == 0) Runnable { progressIndicator!!.setProgressCompat( - (value * PRECISION).toInt(), - true + (value * PRECISION).toInt(), true ) } else Runnable { progressIndicator!!.setProgressCompat( - (value * PRECISION * 0.75f).toInt(), - true + (value * PRECISION * 0.75f).toInt(), true ) }) } @@ -716,8 +721,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis Timber.i("Query submit: %s on online list", query) Thread({ moduleViewListBuilderOnline.applyTo( - moduleListOnline!!, - moduleViewAdapterOnline!! + moduleListOnline!!, moduleViewAdapterOnline!! ) }, "Query update thread").start() } @@ -739,8 +743,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis Timber.i("Query submit: %s on online list", query) Thread({ moduleViewListBuilderOnline.applyTo( - moduleListOnline!!, - moduleViewAdapterOnline!! + moduleListOnline!!, moduleViewAdapterOnline!! ) }, "Query update thread").start() } @@ -759,8 +762,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis if (moduleViewListBuilderOnline.setQueryChange(null)) { Thread({ moduleViewListBuilderOnline.applyTo( - moduleListOnline!!, - moduleViewAdapterOnline!! + moduleListOnline!!, moduleViewAdapterOnline!! ) }, "Query update thread").start() } @@ -789,9 +791,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis } i++ } - if (AndroidacyRepoData.getInstance() - .isEnabled && AndroidacyRepoData.getInstance().memberLevel == null - ) { + if (AndroidacyRepoData.getInstance().isEnabled && AndroidacyRepoData.getInstance().memberLevel == null) { Timber.d("Member level is null, waiting for it to be initialized") i = 0 while (AndroidacyRepoData.getInstance().memberLevel == null && i < 20) { @@ -804,14 +804,10 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis } } // if it's still null, but it's enabled, throw an error - if (AndroidacyRepoData.getInstance() - .isEnabled && AndroidacyRepoData.getInstance().memberLevel == null - ) { + if (AndroidacyRepoData.getInstance().isEnabled && AndroidacyRepoData.getInstance().memberLevel == null) { Timber.e("AndroidacyRepoData is enabled, but member level is null") } - if (AndroidacyRepoData.getInstance() != null && AndroidacyRepoData.getInstance() - .isEnabled && AndroidacyRepoData.getInstance().memberLevel == "Guest" - ) { + if (AndroidacyRepoData.getInstance() != null && AndroidacyRepoData.getInstance().isEnabled && AndroidacyRepoData.getInstance().memberLevel == "Guest") { runtimeUtils!!.showUpgradeSnackbar(this, this) } else { if (!AndroidacyRepoData.getInstance().isEnabled) { @@ -825,9 +821,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis Timber.i("Unknown error, not showing upgrade snackbar 1") } } - } else if (AndroidacyRepoData.getInstance() - .isEnabled && AndroidacyRepoData.getInstance().memberLevel == "Guest" - ) { + } else if (AndroidacyRepoData.getInstance().isEnabled && AndroidacyRepoData.getInstance().memberLevel == "Guest") { runtimeUtils!!.showUpgradeSnackbar(this, this) } else { if (!AndroidacyRepoData.getInstance().isEnabled) { @@ -853,6 +847,7 @@ class MainActivity : FoxActivity(), OnRefreshListener, SearchView.OnQueryTextLis } private const val PRECISION = 10000 + @JvmField var doSetupNowRunning = true var doSetupRestarting = false diff --git a/app/src/main/java/com/fox2code/mmm/MainApplication.kt b/app/src/main/java/com/fox2code/mmm/MainApplication.kt index 9a731ae..6195bf5 100644 --- a/app/src/main/java/com/fox2code/mmm/MainApplication.kt +++ b/app/src/main/java/com/fox2code/mmm/MainApplication.kt @@ -87,7 +87,7 @@ class MainApplication : FoxApplication(), Configuration.Provider { private var markwonThemeContext: FoxThemeWrapper? = null @JvmField var markwon: Markwon? = null - private var existingKey: ByteArray? = byteArrayOf(0) + private var existingKey: ByteArray? = null @JvmField var tracker: Tracker? = null private var makingNewKey = false @@ -450,7 +450,7 @@ class MainApplication : FoxApplication(), Configuration.Provider { } } // attempt to read the existingKey property - if (existingKey != null) { + if (existingKey != null && existingKey!!.isNotEmpty()) { return existingKey as ByteArray } // check if we have a key already @@ -563,14 +563,17 @@ class MainApplication : FoxApplication(), Configuration.Provider { ).apply() Timber.d("Saved the encrypted key in shared preferences.") makingNewKey = false + Timber.d("Returning the new key. Key length: %d", realmKey.size) return realmKey // pass to a realm configuration via encryptionKey() } // Access the encrypted key in the keystore, decrypt it with the secret, // and use it to open and read from the realm again fun getExistingKey(): ByteArray { + Timber.v("Getting existing key.") // attempt to read the existingKey property if (existingKey != null) { + Timber.v("Existing key found in memory.") return existingKey as ByteArray } // open a connection to the android keystore diff --git a/app/src/main/java/com/fox2code/mmm/utils/io/PropUtils.kt b/app/src/main/java/com/fox2code/mmm/utils/io/PropUtils.kt index 52ba7cb..bfeab05 100644 --- a/app/src/main/java/com/fox2code/mmm/utils/io/PropUtils.kt +++ b/app/src/main/java/com/fox2code/mmm/utils/io/PropUtils.kt @@ -127,7 +127,9 @@ enum class PropUtils { ).use { bufferedReader -> var line: String var lineNum = 0 - while (bufferedReader.readLine().also { line = it } != null) { + val iterator = bufferedReader.lineSequence().iterator() + while (iterator.hasNext()) { + line = iterator.next() if (lineNum == 0 && line.startsWith("\u0000")) { while (line.startsWith("\u0000")) line = line.substring(1) } diff --git a/app/src/main/res/layout/activity_setup.xml b/app/src/main/res/layout/activity_setup.xml index 08f887c..f2ad473 100644 --- a/app/src/main/res/layout/activity_setup.xml +++ b/app/src/main/res/layout/activity_setup.xml @@ -282,28 +282,18 @@ android:layout_height="wrap_content" android:layout_marginHorizontal="4dp" android:layout_marginVertical="12dp" - android:text="@string/other_section" + android:text="@string/eula_agree_v2_headline" android:textAppearance="@android:style/TextAppearance.Material.Headline" /> - - - + android:textAppearance="@style/TextAppearance.Material3.LabelSmall" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 525c64e..fb10069 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -429,4 +429,6 @@ Upgrade The stacktrace may be found below. However, we strongly recommend you to use the feedback form below to submit feedback instead. This way, instead of manually copying the stacktrace, it will send it to us automatically. It also is deobfuscated that way and additional details are reported automatically. Most modules should be uninstalled, then reinstalled cleanly. For this reason, AMM does not support reinstalling modules while they are installed on the device. + This build has expired. Please update to the latest version. + EULA and Terms