diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml new file mode 100644 index 00000000..86d1a1a4 --- /dev/null +++ b/.github/workflows/prerelease.yml @@ -0,0 +1,37 @@ +name: Pre-release + +on: + push: + branches: [ master ] + +concurrency: + group: "pre-release" + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 8 + uses: actions/setup-java@v2 + with: + java-version: '8' + distribution: 'adopt' + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Update prerelease_commit_hash + run: | + COMMIT_HASH="$(git log -1 --format='%H')" + sed -i "s/unknown_prerelease<\/string>/$COMMIT_HASH<\/string>/g" app/src/main/res/values/strings.xml + - name: Run Gradle + run: ./gradlew assembleDebug + - name: Create pre-release + uses: "marvinpinto/action-automatic-releases@latest" + with: + repo_token: "${{ secrets.GITHUB_TOKEN }}" + automatic_release_tag: "pre-release" + prerelease: true + title: "Pre-release Build" + files: | + app/build/outputs/apk/debug/*.apk diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 00000000..281bb10b --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,23 @@ +name: Artifact Build + +on: [pull_request] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 8 + uses: actions/setup-java@v2 + with: + java-version: '8' + distribution: 'adopt' + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Run Gradle + run: ./gradlew assembleDebug + - name: Upload Artifact + uses: actions/upload-artifact@v2 + with: + name: pull-request-build + path: "app/build/outputs/apk/debug/*.apk" diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt index cc70366b..02a36991 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/InAppUpdater.kt @@ -16,6 +16,7 @@ import com.fasterxml.jackson.module.kotlin.KotlinModule import com.fasterxml.jackson.module.kotlin.readValue import com.lagradost.cloudstream3.BuildConfig import com.lagradost.cloudstream3.R +import com.lagradost.cloudstream3.utils.InAppUpdater.Companion.runAutoUpdate import java.io.* import java.net.URL import java.net.URLConnection @@ -38,8 +39,19 @@ class InAppUpdater { @JsonProperty("body") val body: String, // Desc @JsonProperty("assets") val assets: List, @JsonProperty("target_commitish") val target_commitish: String, // branch + @JsonProperty("prerelease") val prerelease: Boolean, ) + data class GithubObject( + @JsonProperty("sha") val sha: String, // sha 256 hash + @JsonProperty("type") val type: String, // object type + @JsonProperty("url") val url: String, + ) + + data class GithubTag( + @JsonProperty("object") val github_object: GithubObject, + ) + data class Update( @JsonProperty("shouldUpdate") val shouldUpdate: Boolean, @JsonProperty("updateURL") val updateURL: String?, @@ -52,51 +64,86 @@ class InAppUpdater { private fun Activity.getAppUpdate(): Update { try { - val url = "https://api.github.com/repos/LagradOst/CloudStream-3/releases" - val headers = mapOf("Accept" to "application/vnd.github.v3+json") - val response = - mapper.readValue>(khttp.get(url, headers = headers).text) - - val versionRegex = Regex("""(.*?((\d)\.(\d)\.(\d)).*\.apk)""") - - /* - val releases = response.map { it.assets }.flatten() - .filter { it.content_type == "application/vnd.android.package-archive" } - val found = - releases.sortedWith(compareBy { - versionRegex.find(it.name)?.groupValues?.get(2) - }).toList().lastOrNull()*/ - val found = - response.sortedWith(compareBy { release -> - release.assets.filter { it.content_type == "application/vnd.android.package-archive" } - .getOrNull(0)?.name?.let { it1 -> - versionRegex.find( - it1 - )?.groupValues?.get(2) - } - }).toList().lastOrNull() - val foundAsset = found?.assets?.getOrNull(0) - val currentVersion = packageName?.let { - packageManager.getPackageInfo(it, - 0) - } - - val foundVersion = foundAsset?.name?.let { versionRegex.find(it) } - val shouldUpdate = if (found != null && foundAsset?.browser_download_url != "" && foundVersion != null) currentVersion?.versionName?.compareTo( - foundVersion.groupValues[2] - )!! < 0 else false - return if (foundVersion != null) { - Update(shouldUpdate, foundAsset.browser_download_url, foundVersion.groupValues[2], found.body) + val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) + return if (settingsManager.getBoolean(getString(R.string.prerelease_update_key), false)) { + getPreReleaseUpdate() } else { - Update(false, null, null, null) + getReleaseUpdate() } - } catch (e: Exception) { println(e) return Update(false, null, null, null) } } + private fun Activity.getReleaseUpdate(): Update { + val url = "https://api.github.com/repos/LagradOst/CloudStream-3/releases" + val headers = mapOf("Accept" to "application/vnd.github.v3+json") + val response = + mapper.readValue>(khttp.get(url, headers = headers).text) + + val versionRegex = Regex("""(.*?((\d)\.(\d)\.(\d)).*\.apk)""") + + /* + val releases = response.map { it.assets }.flatten() + .filter { it.content_type == "application/vnd.android.package-archive" } + val found = + releases.sortedWith(compareBy { + versionRegex.find(it.name)?.groupValues?.get(2) + }).toList().lastOrNull()*/ + val found = + response.filter { rel -> + !rel.prerelease + }.sortedWith(compareBy { release -> + release.assets.filter { it.content_type == "application/vnd.android.package-archive" } + .getOrNull(0)?.name?.let { it1 -> + versionRegex.find( + it1 + )?.groupValues?.get(2) + } + }).toList().lastOrNull() + val foundAsset = found?.assets?.getOrNull(0) + val currentVersion = packageName?.let { + packageManager.getPackageInfo(it, + 0) + } + + val foundVersion = foundAsset?.name?.let { versionRegex.find(it) } + val shouldUpdate = if (found != null && foundAsset?.browser_download_url != "" && foundVersion != null) currentVersion?.versionName?.compareTo( + foundVersion.groupValues[2] + )!! < 0 else false + return if (foundVersion != null) { + Update(shouldUpdate, foundAsset.browser_download_url, foundVersion.groupValues[2], found.body) + } else { + Update(false, null, null, null) + } + } + + private fun Activity.getPreReleaseUpdate(): Update { + val tagUrl = "https://api.github.com/repos/LagradOst/CloudStream-3/git/ref/tags/pre-release" + val releaseUrl = "https://api.github.com/repos/LagradOst/CloudStream-3/releases" + val headers = mapOf("Accept" to "application/vnd.github.v3+json") + val response = + mapper.readValue>(khttp.get(releaseUrl, headers = headers).text) + + val found = + response.lastOrNull { rel -> + rel.prerelease + } + val foundAsset = found?.assets?.getOrNull(0) + + val tagResponse = + mapper.readValue(khttp.get(tagUrl, headers = headers).text) + + val shouldUpdate = (getString(R.string.prerelease_commit_hash) != tagResponse.github_object.sha) + + return if (foundAsset != null) { + Update(shouldUpdate, foundAsset.browser_download_url, tagResponse.github_object.sha, found.body) + } else { + Update(false, null, null, null) + } + } + private fun Activity.downloadUpdate(url: String): Boolean { println("DOWNLOAD UPDATE $url") var fullResume = false // IF FULL RESUME @@ -280,4 +327,4 @@ class InAppUpdater { return false } } -} \ No newline at end of file +} diff --git a/app/src/main/res/drawable/ic_baseline_developer_mode_24.xml b/app/src/main/res/drawable/ic_baseline_developer_mode_24.xml new file mode 100644 index 00000000..55febeee --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_developer_mode_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 781eb895..960400b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -84,5 +84,8 @@ Search using providers Search using types auto_update + prerelease_update manual_check_update + + unknown_prerelease \ No newline at end of file diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index 1dd14dbd..b5643ab9 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -91,6 +91,13 @@ app:defaultValue="true" android:icon="@drawable/ic_baseline_notifications_active_24" /> +