diff --git a/app/build.gradle b/app/build.gradle index c0f01108..2efe91cd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,6 +18,7 @@ android { compileSdk 33 var isBuildSigned = (System.getenv("CI") == "true") && (System.getenv("IS_SKYLINE_SIGNED") == "true") + var gitCommitHash = 'git rev-parse --verify HEAD'.execute().text.trim() defaultConfig { applicationId "skyline.emu" @@ -28,6 +29,8 @@ android { versionCode 3 versionName "0.0.3" + buildConfigField("String", "GIT_HASH", "\"${gitCommitHash}\"") + ndk { //noinspection ChromeOsAbiSupport abiFilters "arm64-v8a" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9bf670ce..8ac30e44 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ + " + if (message.contains("\n")) + changelog += "

${message.substringAfter("\n")}

" + + withContext(Dispatchers.Main) { + builder.setTitle("${applicationContext.getString(R.string.new_version)} ${newestBuild.get("runNumber")}") + .setMessage(Html.fromHtml(changelog, 0)) + .setCancelable(true) + .setPositiveButton(applicationContext.getString(R.string.update)) { dialogInterface, _ -> + val receiver = AppUpdater() + applicationContext.registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) + receiver.downloadApk(applicationContext, uri) + dialogInterface.dismiss() + }.setNegativeButton(applicationContext.getString(R.string.cancel)){ dialogInterface, _ -> + dialogInterface.cancel() + }.show() + } + } else { + withContext(Dispatchers.Main) { + builder.setTitle(applicationContext.getString(R.string.no_updates_available)) + .setMessage(Html.fromHtml("${applicationContext.getString(R.string.changelog)}

${commit.getString("message")}

", 0)) + .setCancelable(true) + .setPositiveButton(applicationContext.getString(R.string.close)) { dialogInterface, _ -> + dialogInterface.dismiss() + }.show() + } + } + } + } + } + + @com.google.android.material.badge.ExperimentalBadgeUtils + fun notifyUpdateBadge(context : Context, icon : ImageView) { + CoroutineScope(Dispatchers.IO).launch { + val newestBuild = checkRemoteForUpdates() + if (newestBuild != null) { + val remoteBuildGitHash = newestBuild.getJSONObject("commit").getString("id") + if (BuildConfig.GIT_HASH != remoteBuildGitHash) { + val badge = BadgeDrawable.create(context) + badge.badgeGravity = BOTTOM_END + badge.verticalOffset = 25 + badge.horizontalOffset = 25 + badge.backgroundColor = ContextCompat.getColor(context, R.color.colorPrimary) + BadgeUtils.attachBadgeDrawable(badge, icon) + } + } + } + } + + private fun checkRemoteForUpdates() : JSONObject? { + val url = URL("$baseUrl/builds") + try { + val response = url.readText() + val jsonBuilds = JSONTokener(response).nextValue() as JSONArray + + var ftx1Index = 0 + while (ftx1Index < jsonBuilds.length() && jsonBuilds.getJSONObject(ftx1Index).get("branch") != branch) { + ftx1Index++ + } + if (ftx1Index >= jsonBuilds.length()) + ftx1Index = 0 + + return jsonBuilds.getJSONObject(ftx1Index) + } catch (e : IOException) { + e.printStackTrace() + return null + } + } + + fun removeApk(){ + if (File(SkylineApplication.instance.getPublicFilesDir().canonicalPath + "/skyline.apk").exists()) { + File(SkylineApplication.instance.getPublicFilesDir().canonicalPath + "/skyline.apk").delete() + } + } + } +} diff --git a/app/src/main/java/emu/skyline/MainActivity.kt b/app/src/main/java/emu/skyline/MainActivity.kt index 955cac75..ff057aad 100644 --- a/app/src/main/java/emu/skyline/MainActivity.kt +++ b/app/src/main/java/emu/skyline/MainActivity.kt @@ -291,6 +291,18 @@ class MainActivity : AppCompatActivity() { } } }) + + binding.checkUpdatesIcon.apply { + if (BuildConfig.FLAVOR == "edge") { + visibility = View.GONE + } else { + AppUpdater.removeApk() + AppUpdater.notifyUpdateBadge(context, this) + this.setOnClickListener { + AppUpdater.checkForUpdates(context) + } + } + } } override fun onResume() { diff --git a/app/src/main/res/drawable/ic_check_updates.xml b/app/src/main/res/drawable/ic_check_updates.xml new file mode 100644 index 00000000..6346d876 --- /dev/null +++ b/app/src/main/res/drawable/ic_check_updates.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index abfce0c9..ad572042 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -40,12 +40,28 @@ android:padding="5dp" android:visibility="invisible" app:layout_constraintBottom_toBottomOf="@id/sub_text" - app:layout_constraintEnd_toStartOf="@id/log_icon" + app:layout_constraintEnd_toStartOf="@id/check_updates_icon" app:layout_constraintTop_toTopOf="@id/title_text" app:srcCompat="@drawable/ic_refresh" app:tint="?attr/colorOnBackground" tools:visibility="visible" /> + + Settings Share Logs Refresh + Check for updates Share log file No logs were created during the last run + + New version + Changelog + Update + Download completed + No updates available + Close All Metadata Missing