Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
174 commits
Select commit Hold shift + click to select a range
f196b81
fix: keep playback retries active after socket errors
Priveetee Oct 17, 2026
b3ae64b
fix: keep playback retries active after socket errors
Priveetee Oct 17, 2026
c3a6967
build: prepare mobile beta 1.10.0-beta.2
Priveetee Oct 17, 2026
f8ed968
Merge pull request #104 from TypeType-Video/release/1.10.0-beta.2
Priveetee Oct 17, 2026
cb45442
feat: keep video quality local with mobile cap
Priveetee Oct 18, 2026
8d87bbb
feat: keep video quality local with mobile cap
Priveetee Oct 18, 2026
6b4d433
build: prepare mobile beta 1.10.0-beta.3
Priveetee Oct 19, 2026
8a62d04
Merge pull request #105 from TypeType-Video/release/1.10.0-beta.3
Priveetee Oct 19, 2026
46e9102
fix: retry failed push registration automatically
Priveetee Oct 21, 2026
7458515
fix: retry undelivered local notifications
Priveetee Oct 21, 2026
2fe3c88
feat: classify incoming push messages
Priveetee Oct 21, 2026
4f31d5e
feat: trace push delivery outcomes
Priveetee Oct 21, 2026
ad58c88
feat: show push traces in diagnostics
Priveetee Oct 21, 2026
651395c
fix: retry failed push registration automatically
Priveetee Oct 21, 2026
581121a
fix: retry undelivered local notifications
Priveetee Oct 21, 2026
5269cf5
feat: classify incoming push messages
Priveetee Oct 21, 2026
404990e
feat: trace push delivery outcomes
Priveetee Oct 21, 2026
c8abf72
feat: show push traces in diagnostics
Priveetee Oct 21, 2026
b278651
fix: acknowledge received push deliveries
Priveetee Oct 21, 2026
a541bef
build: prepare mobile beta 1.10.0-beta.4
Priveetee Oct 21, 2026
7a2236b
Merge pull request #106 from TypeType-Video/release/1.10.0-beta.4
Priveetee Oct 21, 2026
4536170
feat: define local app update channels and policy
Priveetee Oct 21, 2026
f532772
feat: fetch GitHub app update releases
Priveetee Oct 21, 2026
4f5b89a
feat: install verified GitHub app updates
Priveetee Oct 21, 2026
d7b6d1f
feat: show app update controls in settings
Priveetee Oct 21, 2026
56a45e6
feat: connect app update settings to GitHub releases
Priveetee Oct 21, 2026
aea23cd
test: cover GitHub app update flow
Priveetee Oct 21, 2026
c162bf6
build: bump beta version to 1.10.1-beta.1
Priveetee Oct 21, 2026
d4224b8
fix: handle older releases with newer installed builds
Priveetee Oct 21, 2026
5cc452c
docs: add 1.10.1 beta release notes
Priveetee Oct 21, 2026
cfd4c68
Merge pull request #107 from TypeType-Video/release/1.10.1-beta.1
Priveetee Oct 22, 2026
9f9f0c6
fix: hide unknown server counts
Priveetee Oct 22, 2026
9fab084
fix: retry empty related video metadata
Priveetee Oct 22, 2026
5594cda
fix: hide unknown server counts
Priveetee Oct 22, 2026
2c2f9c4
fix: retry empty related video metadata
Priveetee Oct 22, 2026
f80d000
chore: prepare 1.11.0 beta 1
Priveetee Oct 22, 2026
42ecc66
Merge pull request #108 from TypeType-Video/release/1.11.0-beta.1
Priveetee Oct 22, 2026
b6af288
fix: preserve server counts and playback metadata
Priveetee Oct 22, 2026
5e3d1b5
fix: preserve server counts and playback metadata
Priveetee Oct 22, 2026
d829826
chore: prepare 1.11.0 beta 2
Priveetee Oct 22, 2026
176160e
Merge pull request #109 from TypeType-Video/release/1.11.0-beta.2
Priveetee Oct 22, 2026
35b0163
fix: align SABR windows with requested buffer goals
Priveetee Oct 23, 2026
9358ba5
perf: throttle SABR playback window refreshes
Priveetee Oct 23, 2026
eb48e47
fix: bound SABR segment retry duration
Priveetee Oct 23, 2026
a928c5e
test: verify requested SABR playback windows
Priveetee Oct 23, 2026
2f829e5
fix: recover playback after SABR session loss
Priveetee Oct 23, 2026
40121ec
chore: prepare 1.11.0 beta 3
Priveetee Oct 23, 2026
7d0b6da
Merge pull request #110 from TypeType-Video/release/1.11.0-beta.3
Priveetee Oct 23, 2026
0c05a22
build: install benchmarks under their own package
Priveetee Oct 24, 2026
8ce1946
build: remove the TV app, now in its own repository
Priveetee Oct 24, 2026
abd91f6
build: drop the TV module and SDK build from settings and CI
Priveetee Oct 24, 2026
1909401
build: share Android defaults through build-logic convention plugins
Priveetee Oct 24, 2026
aa59b92
refactor: move SABR window polling out of the session preparer
Priveetee Oct 24, 2026
37a20ce
test: share a scripted SABR server between preparer tests
Priveetee Oct 24, 2026
bcb4863
fix: name the media item session in SABR recovery requests
Priveetee Oct 24, 2026
17d7dea
fix: replace a stuck SABR session in place while refreshing
Priveetee Oct 24, 2026
2de14a0
refactor: classify playback failures once for every recovery layer
Priveetee Oct 24, 2026
ae24569
fix: retry failed SABR windows in place for two minutes
Priveetee Oct 24, 2026
19a9ae0
fix: give up on a failing SABR control call within seconds
Priveetee Oct 24, 2026
10336f4
refactor: move shared resources into a core:resources module
Priveetee Oct 24, 2026
98c4462
ci: run unit tests and lint in every module
Priveetee Oct 24, 2026
cb59137
refactor: move the domain layer into a core:model module
Priveetee Oct 24, 2026
bff30b1
refactor: move error and URL helpers into core:model
Priveetee Oct 24, 2026
4d205a3
refactor: inject the app version instead of reading BuildConfig in data
Priveetee Oct 24, 2026
1664757
refactor: move local notifications next to the push notifier
Priveetee Oct 24, 2026
038bd09
refactor: move the data layer into a core:data module
Priveetee Oct 24, 2026
33a8404
build: add a Compose convention plugin
Priveetee Oct 24, 2026
48640b7
refactor: move shared UI into a core:ui module
Priveetee Oct 24, 2026
e832186
refactor: share queue mappings and player host state below features
Priveetee Oct 24, 2026
5954216
refactor: move codec keys, version and menu sheets out of the player …
Priveetee Oct 24, 2026
eaaa77e
build: add a feature convention plugin
Priveetee Oct 24, 2026
e11ef89
refactor: move the video menu into a feature:menu module
Priveetee Oct 24, 2026
9e8ffa9
refactor: move six screen families into feature modules
Priveetee Oct 24, 2026
d481bc9
refactor: move channel, library and subscriptions into feature modules
Priveetee Oct 24, 2026
a69adb7
docs: drop the TV app and SDK from the readme and contributing guide
Priveetee Oct 24, 2026
3d7020a
ci: run on GitHub-hosted runners
Priveetee Oct 24, 2026
21d75c7
refactor: move push and local notifications into a core:notifications…
Priveetee Oct 24, 2026
330e15e
refactor: move settings into a feature:settings module
Priveetee Oct 24, 2026
7552407
refactor: move the playback engine into a core:playback module
Priveetee Oct 24, 2026
c9af97f
refactor: move the player and Shorts into feature modules
Priveetee Oct 24, 2026
763a07b
build: compile Kotlin in its daemon so modules build in parallel
Priveetee Oct 25, 2026
df3a853
feat: track one playback recovery window per item
Priveetee Oct 25, 2026
30dba4e
fix: let the playback service own retries and tell the player UI
Priveetee Oct 25, 2026
3fa9b70
fix: start a linked video the player already holds paused
Priveetee Oct 25, 2026
ca9978d
perf: profile home, Shorts and playback in the baseline profile
Priveetee Oct 25, 2026
c8333aa
fix: keep coroutine cancellation out of failed results
Priveetee Oct 25, 2026
fe4f95c
perf: draw Shorts video in a Compose surface instead of a PlayerView
Priveetee Oct 25, 2026
caa7c83
build: run module instrumented tests with the AndroidX test runner
Priveetee Oct 25, 2026
7edbd2f
fix: keep the app theme in the app and declare Material for shared dr…
Priveetee Oct 25, 2026
e6e4749
fix: remember decoder failures across the app and across launches
Priveetee Oct 25, 2026
245f860
refactor: move the timeline track out of the player time bar
Priveetee Oct 25, 2026
863f95e
refactor: move app shell state helpers out of the nav host
Priveetee Oct 25, 2026
8772a16
test: share playback source fixtures and split long selector tests
Priveetee Oct 25, 2026
0ef6d00
refactor: move subtitle and language rows out of player settings
Priveetee Oct 25, 2026
15411f7
ci: fail when a Kotlin file goes over the length limit
Priveetee Oct 25, 2026
e94d6ec
refactor: take the modifier as the first optional parameter
Priveetee Oct 25, 2026
5d3bc06
refactor: use core-ktx helpers and drop an empty super call
Priveetee Oct 25, 2026
66906cb
refactor: check the API level before reading newer permission names
Priveetee Oct 25, 2026
a220221
build: fail lint on warnings
Priveetee Oct 25, 2026
a879a56
test: run service tests in the app and allow local HTTP in module tests
Priveetee Oct 25, 2026
cb31b39
fix: remember only definitive decoder rejections across launches
Priveetee Oct 25, 2026
775ac3c
test: run the Shorts session test in the app and follow the device lo…
Priveetee Oct 25, 2026
0a53bec
docs: describe the module layout and the current checks
Priveetee Oct 25, 2026
1fc9ba2
perf: keep Shorts pages from recomposing on every player update
Priveetee Oct 25, 2026
c4537d9
chore: merge beta into dev
Priveetee Oct 25, 2026
462c7d6
chore: prepare 1.11.0 beta 4
Priveetee Oct 25, 2026
68f2bde
Merge pull request #111 from TypeType-Video/release/1.11.0-beta.4
Priveetee Oct 25, 2026
a446b24
ci: run trusted Android checks on the Stack runners
Priveetee Oct 25, 2026
3c3af29
style: remove explanatory comments
Priveetee Oct 25, 2026
50cd55c
fix: wait for the beta APK upload before the F-Droid sync
Priveetee Oct 25, 2026
68dbee8
feat: replace the double-tap seek wave with a cumulative seek panel
Priveetee Oct 25, 2026
46879d8
fix: notify only videos published after the channel bell was enabled
Priveetee Oct 25, 2026
d98d43f
feat: manage new video alerts for every subscribed channel
Priveetee Oct 25, 2026
9d7750b
fix: use a plural for the channel alerts summary
Priveetee Oct 25, 2026
af39044
fix: pace channel alert updates under the server rate limit
Priveetee Oct 25, 2026
ce45852
feat: recommend Sunup when no push distributor is installed
Priveetee Oct 25, 2026
6e29367
feat: show the video and its platform in alerts and stop alert floods
Priveetee Oct 25, 2026
28b7fdb
fix: refresh SABR windows at the web player buffer watermark
Priveetee Oct 25, 2026
bbaeceb
chore: merge beta into dev
Priveetee Oct 25, 2026
f06e51a
chore: prepare 1.11.0 beta 5
Priveetee Oct 25, 2026
c9c7eb0
Merge pull request #112 from TypeType-Video/release/1.11.0-beta.5
Priveetee Oct 25, 2026
e78344b
refactor: move image proxy URLs to the core model
Priveetee Oct 25, 2026
baff5a5
feat: show the video thumbnail in alerts
Priveetee Oct 25, 2026
653fa48
chore: merge beta into dev
Priveetee Oct 25, 2026
a9f844b
chore: prepare 1.11.0 beta 6
Priveetee Oct 25, 2026
89dc0c3
Merge pull request #113 from TypeType-Video/release/1.11.0-beta.6
Priveetee Oct 25, 2026
8b4d30a
fix: honour server Retry-After and retry rate limited playback calls
Priveetee Oct 25, 2026
88271da
perf: switch every channel alert in one request when supported
Priveetee Oct 25, 2026
ee52e79
fix: show the recommender version on the About screen
Priveetee Oct 25, 2026
08f18d7
chore: merge beta into dev
Priveetee Oct 25, 2026
2ef7405
chore: prepare 1.11.0 beta 7
Priveetee Oct 25, 2026
9e7f847
Merge pull request #115 from TypeType-Video/release/1.11.0-beta.7
Priveetee Oct 25, 2026
58faeac
feat: load recommendation rows and send recommender feedback
Priveetee Oct 25, 2026
59ab498
feat: add home cards for recommendations and feedback
Priveetee Oct 25, 2026
e331b39
feat: show personalized rows and feedback on the home page
Priveetee Oct 25, 2026
cefbff6
feat: read and save recommender algorithms, settings and data
Priveetee Oct 25, 2026
545ca63
feat: add recommender algorithm cards and parameter controls
Priveetee Oct 25, 2026
d688674
feat: add a recommendations settings screen
Priveetee Oct 25, 2026
fe6845b
feat: open recommendations settings from content settings
Priveetee Oct 25, 2026
8892437
chore: merge beta into dev
Priveetee Oct 25, 2026
401fec4
chore: prepare 1.11.0 beta 8
Priveetee Oct 25, 2026
010dd55
Merge pull request #116 from TypeType-Video/release/1.11.0-beta.8
Priveetee Oct 25, 2026
7ea8854
feat: model the recommender profile, data, trace and opinions
Priveetee Oct 26, 2026
c91bbcc
feat: read the recommender profile, data, trace and opinions
Priveetee Oct 26, 2026
dda128f
test: cover the recommender json readers
Priveetee Oct 26, 2026
d86bbe4
feat: add the recommendation screen strings
Priveetee Oct 26, 2026
9850914
feat: add the recommendation screen plurals
Priveetee Oct 26, 2026
629c4b2
feat: keep recommendation settings state and its edits
Priveetee Oct 26, 2026
cb886a7
feat: load and save recommendation settings section by section
Priveetee Oct 26, 2026
2e87832
feat: share recommendation groups, rows and setting controls
Priveetee Oct 26, 2026
0c74665
feat: chart what the home page and interests are made of
Priveetee Oct 26, 2026
7eb2955
feat: choose the algorithm and see the data it reads
Priveetee Oct 26, 2026
6d25c7b
feat: add the algorithm guide and opinions sections
Priveetee Oct 26, 2026
8a1f51a
feat: review and limit the data the algorithm reads
Priveetee Oct 26, 2026
e12a2dc
feat: review interests, channels and recent videos
Priveetee Oct 26, 2026
dff92f9
feat: correct an interest or a channel from its card
Priveetee Oct 26, 2026
0861422
feat: show every setting and how the last page was built
Priveetee Oct 26, 2026
46c765b
feat: open recommendations from their own settings entry
Priveetee Oct 26, 2026
a472c0d
refactor: move recommendations out of content settings
Priveetee Oct 26, 2026
4e50eb0
chore: merge beta into dev
Priveetee Oct 26, 2026
5e7f166
chore: prepare 1.11.0 beta 9
Priveetee Oct 26, 2026
ac1ff0c
Merge pull request #117 from TypeType-Video/release/1.11.0-beta.9
Priveetee Oct 26, 2026
a939373
fix: recover playback after the server evicts an idle session
Priveetee Oct 27, 2026
0a9a4f7
chore: merge beta into dev
Priveetee Oct 27, 2026
a1271c7
feat: read release notes as sections and bullets
Priveetee Oct 27, 2026
517cd82
refactor: move app update logic out of the About screen
Priveetee Oct 27, 2026
d6afe79
feat: add the app update status card
Priveetee Oct 27, 2026
f87f59a
feat: add the update channel picker and release notes card
Priveetee Oct 27, 2026
edb7b8f
feat: open app updates from their own settings entry
Priveetee Oct 27, 2026
597d50a
chore: prepare 1.11.0 beta 10
Priveetee Oct 27, 2026
e080f27
Merge pull request #118 from TypeType-Video/release/1.11.0-beta.10
Priveetee Oct 27, 2026
110605c
chore: merge beta into dev
Priveetee Oct 27, 2026
101bbce
chore: merge main into release 1.11.0
Priveetee Oct 27, 2026
9c37117
build: prepare TypeType Android 1.11.0
Priveetee Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
114 changes: 79 additions & 35 deletions .github/workflows/android-beta.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ on:
- beta
paths:
- 'app/**'
- 'build-logic/**'
- 'core/**'
- 'feature/**'
- 'player/**'
- 'baseline-profile/**'
- 'gradle/**'
Expand All @@ -17,6 +20,9 @@ on:
- beta
paths:
- 'app/**'
- 'build-logic/**'
- 'core/**'
- 'feature/**'
- 'player/**'
- 'baseline-profile/**'
- 'gradle/**'
Expand All @@ -36,38 +42,38 @@ env:
CI: true
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
JAVA_TOOL_OPTIONS: -Djava.awt.headless=true
GRADLE_OPTS: -Dorg.gradle.workers.max=8 -Dorg.gradle.daemon.idletimeout=900000
ANDROID_HOME: /opt/android-sdk
ANDROID_SDK_ROOT: /opt/android-sdk
JAVA_HOME: /usr/lib/jvm/java-26-openjdk
GRADLE_USER_HOME: /var/tmp/typetype-android-gradle-user-home
GITHUB_REPO: TypeType-Video/TypeType-Android

jobs:
release:
runs-on: [self-hosted, Linux, X64, ci-stack, android]
timeout-minutes: 35
permissions:
contents: write
runs-on: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && fromJSON('["self-hosted","stack-android"]') || 'ubuntu-latest' }}
timeout-minutes: 50
outputs:
version: ${{ steps.version.outputs.version }}
tag: ${{ steps.version.outputs.tag }}
steps:
- name: Checkout
uses: actions/checkout@v7.0.1
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Set up Java
uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6.0.1
with:
distribution: temurin
java-version: 21

- name: Set up Gradle
uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
with:
cache-disabled: ${{ runner.environment == 'self-hosted' }}

- name: Install Android SDK platform
if: ${{ runner.environment == 'github-hosted' }}
run: |
platform="$ANDROID_HOME/platforms/android-37.0"
(
flock 9
if [ ! -f "$platform/android.jar" ]; then
rm -rf "$platform"
"$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" \
--sdk_root="$ANDROID_HOME" \
"platforms;android-37.0"
fi
test -f "$platform/android.jar"
) 9>"$ANDROID_HOME/.platform-install.lock"
"$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --install \
"platforms;android-37.0" "build-tools;36.0.0" > /dev/null

- name: Validate beta release version
id: version
env:
GH_TOKEN: ${{ github.token }}
run: |
Expand Down Expand Up @@ -102,8 +108,13 @@ jobs:
echo "RELEASE_CODE=${version_code}"
echo "RELEASE_TAG=${release_tag}"
} >> "$GITHUB_ENV"
{
echo "version=${version_name}"
echo "tag=${release_tag}"
} >> "$GITHUB_OUTPUT"

- name: Prepare signing
if: ${{ github.event_name != 'pull_request' }}
env:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
Expand All @@ -123,25 +134,22 @@ jobs:
} > keystore.properties

- name: Verify and build beta release
timeout-minutes: 25
timeout-minutes: 40
run: |
./gradlew --build-cache --stacktrace \
./gradlew --stacktrace \
:baseline-profile:assemble \
:player:testDebugUnitTest \
:app:testDebugUnitTest \
:player:lintDebug \
:app:lintDebug \
testDebugUnitTest \
lintDebug \
:app:assembleDebug \
:app:assembleRelease

- name: Upload lint report
if: ${{ always() }}
uses: actions/upload-artifact@v7.0.1
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: typetype-beta-lint-report
path: |
app/build/reports/lint-results-debug.html
player/build/reports/lint-results-debug.html
**/build/reports/lint-results-debug.html
if-no-files-found: ignore
retention-days: 14

Expand All @@ -155,7 +163,9 @@ jobs:
test -n "$build_tools"

"$build_tools/zipalign" -c -P 16 -v 4 "$apk"
"$build_tools/apksigner" verify --verbose --print-certs "$apk"
if [ "$GITHUB_EVENT_NAME" != pull_request ]; then
"$build_tools/apksigner" verify --verbose --print-certs "$apk"
fi

apk_application_id="$("$ANDROID_HOME/cmdline-tools/latest/bin/apkanalyzer" manifest application-id "$apk")"
apk_version="$("$ANDROID_HOME/cmdline-tools/latest/bin/apkanalyzer" manifest version-name "$apk")"
Expand All @@ -172,19 +182,53 @@ jobs:
sha256sum -c "dev.typetype.android_${RELEASE_CODE}.apk.sha256"
)

- name: Prepare beta update manifest
run: |
apk_name="dev.typetype.android_"$RELEASE_CODE".apk"
apk_sha256="$(cut -d ' ' -f1 "artifacts/$apk_name.sha256")"
jq -n \
--arg channel beta \
--arg packageName dev.typetype.android \
--arg versionName "$RELEASE_VERSION" \
--argjson versionCode "$RELEASE_CODE" \
--arg apkAsset "$apk_name" \
--arg sha256 "$apk_sha256" \
'{schemaVersion:1,channel:$channel,packageName:$packageName,versionName:$versionName,versionCode:$versionCode,apkAsset:$apkAsset,sha256:$sha256}' \
> artifacts/typetype-update.json

- name: Upload beta APK
uses: actions/upload-artifact@v7.0.1
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: typetype-beta-apk
path: |
artifacts/*.apk
artifacts/*.sha256
artifacts/typetype-update.json
if-no-files-found: error
compression-level: 0
retention-days: 30

publish:
needs: release
if: ${{ github.event_name != 'pull_request' }}
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: write
env:
RELEASE_VERSION: ${{ needs.release.outputs.version }}
RELEASE_TAG: ${{ needs.release.outputs.tag }}
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Download beta APK
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: typetype-beta-apk
path: artifacts

- name: Prepare beta release notes
if: ${{ github.event_name != 'pull_request' }}
env:
HEAD_MESSAGE: ${{ github.event.head_commit.message }}
run: |
Expand All @@ -195,8 +239,7 @@ jobs:
fi

- name: Publish GitHub prerelease
if: ${{ github.event_name != 'pull_request' }}
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2.6.2
with:
tag_name: ${{ env.RELEASE_TAG }}
name: TypeType Android ${{ env.RELEASE_VERSION }}
Expand All @@ -208,4 +251,5 @@ jobs:
files: |
artifacts/*.apk
artifacts/*.sha256
artifacts/typetype-update.json
fail_on_unmatched_files: true
Loading