OXYGENHUB

Android: Add 2FA to LoginScreen and add logos to UI 19e1dbc01b93

Author
Andy McCall @andymccall <[email protected]>
When
· 2026-09-30 14:57 UTC
Signature
✔ signed by Andy McCall
Hash
19e1dbc01b93bb1c3c41dc355a963baaccb487c14e6895929aa8e8a48e4bf51f
Depends on
490d18066788 5edf011e4d10 66127df36f3a e845c208d516
Depended on by
57c0824300db
In bookmarks
main
In tags
v0.1.0 v0.1.1 v0.1.2 v0.1.3 v0.1.4 v0.1.5 v0.1.6 v0.1.7 v0.1.8 v0.1.9
Edits
73 atoms, 28 tree operations, 31 files

Browse the tree at this change

added .gradle/configuration-cache/b06b1b2a-0dae-4545-b960-715b943d6c0b/.globals.work.bin +0 −0

No line changes.

added .gradle/configuration-cache/b06b1b2a-0dae-4545-b960-715b943d6c0b/.strings.work.bin +0 −0

No line changes.

added .gradle/configuration-cache/b06b1b2a-0dae-4545-b960-715b943d6c0b/_app.work.bin +0 −0

No line changes.

added .gradle/configuration-cache/b06b1b2a-0dae-4545-b960-715b943d6c0b/buildfingerprint.bin +0 −0

No line changes.

renamed .gradle/configuration-cache/517de0b9-7c5b-4e39-811b-e830fd8bcefe/classloaderscopes.bin → .gradle/configuration-cache/b06b1b2a-0dae-4545-b960-715b943d6c0b/classloaderscopes.bin +0 −0

No line changes.

added .gradle/configuration-cache/b06b1b2a-0dae-4545-b960-715b943d6c0b/entry.bin +0 −0

No line changes.

added .gradle/configuration-cache/b06b1b2a-0dae-4545-b960-715b943d6c0b/projectfingerprint.bin +0 −0

No line changes.

added .gradle/configuration-cache/b06b1b2a-0dae-4545-b960-715b943d6c0b/work.bin +0 −0

No line changes.

added app/build/intermediates/apk/debug/app-debug.apk +0 −0

No line changes.

added app/build/intermediates/apk/debug/output-metadata.json +21 −0
1 +
{
2 +
  "version": 3,
3 +
  "artifactType": {
4 +
    "type": "APK",
5 +
    "kind": "Directory"
6 +
  },
7 +
  "applicationId": "com.example.oxygenhub",
8 +
  "variantName": "debug",
9 +
  "elements": [
10 +
    {
11 +
      "type": "SINGLE",
12 +
      "filters": [],
13 +
      "attributes": [],
14 +
      "versionCode": 1,
15 +
      "versionName": "1.0",
16 +
      "outputFile": "app-debug.apk"
17 +
    }
18 +
  ],
19 +
  "elementType": "File",
20 +
  "minSdkVersionForDexing": 24
21 +
}
added app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt +28 −0
1 +
#Wed Sep 30 15:53:47 BST 2026
2 +
base.0=/home/andymccall/development/oxygenhub-android/app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex
3 +
base.1=/home/andymccall/development/oxygenhub-android/app/build/intermediates/dex/debug/mergeProjectDexDebug/0/classes.dex
4 +
base.2=/home/andymccall/development/oxygenhub-android/app/build/intermediates/dex/debug/mergeProjectDexDebug/14/classes.dex
5 +
base.3=/home/andymccall/development/oxygenhub-android/app/build/intermediates/dex/debug/mergeProjectDexDebug/4/classes.dex
6 +
base.4=/home/andymccall/development/oxygenhub-android/app/build/intermediates/dex/debug/mergeProjectDexDebug/6/classes.dex
7 +
base.5=/home/andymccall/development/oxygenhub-android/app/build/intermediates/dex/debug/mergeProjectDexDebug/9/classes.dex
8 +
base.6=/home/andymccall/development/oxygenhub-android/app/build/intermediates/global_synthetics_dex/debug/generateDebugGlobalSynthetics/classes.dex
9 +
base.7=/home/andymccall/development/oxygenhub-android/app/build/intermediates/dex/debug/mergeExtDexDebug/classes2.dex
10 +
base.8=/home/andymccall/development/oxygenhub-android/app/build/intermediates/dex/debug/mergeExtDexDebug/classes3.dex
11 +
path.0=classes.dex
12 +
path.1=0/classes.dex
13 +
path.2=14/classes.dex
14 +
path.3=4/classes.dex
15 +
path.4=6/classes.dex
16 +
path.5=9/classes.dex
17 +
path.6=classes.dex
18 +
path.7=classes2.dex
19 +
path.8=classes3.dex
20 +
renamed.0=classes.dex
21 +
renamed.1=classes2.dex
22 +
renamed.2=classes3.dex
23 +
renamed.3=classes4.dex
24 +
renamed.4=classes5.dex
25 +
renamed.5=classes6.dex
26 +
renamed.6=classes7.dex
27 +
renamed.7=classes8.dex
28 +
renamed.8=classes9.dex
added app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources +1 −0
1 +
[{"key":"AndroidManifest.xml","name":"AndroidManifest.xml","size":6276,"crc":1226417141},{"key":"res/color/vector_tint_color.xml","name":"res/color/vector_tint_color.xml","size":340,"crc":-65600974},{"key":"res/color/vector_tint_theme_color.xml","name":"res/color/vector_tint_theme_color.xml","size":340,"crc":-1489306767},{"key":"res/drawable/$ic_launcher_foreground__0.xml","name":"res/drawable/$ic_launcher_foreground__0.xml","size":788,"crc":486164930},{"key":"res/drawable/$mark__0.xml","name":"res/drawable/$mark__0.xml","size":788,"crc":1510111382},{"key":"res/drawable/$mark__1.xml","name":"res/drawable/$mark__1.xml","size":788,"crc":1167989656},{"key":"res/drawable/ic_call_answer.xml","name":"res/drawable/ic_call_answer.xml","size":1356,"crc":-417851860},{"key":"res/drawable/ic_call_answer_low.xml","name":"res/drawable/ic_call_answer_low.xml","size":1320,"crc":-2078588160},{"key":"res/drawable/ic_call_answer_video.xml","name":"res/drawable/ic_call_answer_video.xml","size":772,"crc":1837259622},{"key":"res/drawable/ic_call_answer_video_low.xml","name":"res/drawable/ic_call_answer_video_low.xml","size":736,"crc":1149510206},{"key":"res/drawable/ic_call_decline.xml","name":"res/drawable/ic_call_decline.xml","size":1528,"crc":-1902206380},{"key":"res/drawable/ic_call_decline_low.xml","name":"res/drawable/ic_call_decline_low.xml","size":1492,"crc":-593934670},{"key":"res/drawable/ic_launcher_background.xml","name":"res/drawable/ic_launcher_background.xml","size":5696,"crc":-309232214},{"key":"res/drawable/ic_launcher_foreground.xml","name":"res/drawable/ic_launcher_foreground.xml","size":1572,"crc":867899661},{"key":"res/drawable/mark.xml","name":"res/drawable/mark.xml","size":1624,"crc":91466277},{"key":"res/drawable-v21/notification_action_background.xml","name":"res/drawable-v21/notification_action_background.xml","size":1180,"crc":1921271335},{"key":"res/drawable/notification_bg.xml","name":"res/drawable/notification_bg.xml","size":532,"crc":-401674684},{"key":"res/drawable/notification_bg_low.xml","name":"res/drawable/notification_bg_low.xml","size":532,"crc":1392997109},{"key":"res/drawable/notification_icon_background.xml","name":"res/drawable/notification_icon_background.xml","size":372,"crc":2020821786},{"key":"res/drawable/notification_tile_bg.xml","name":"res/drawable/notification_tile_bg.xml","size":304,"crc":1156255250},{"key":"res/drawable-mdpi-v4/notification_bg_low_normal.9.png","name":"res/drawable-mdpi-v4/notification_bg_low_normal.9.png","size":215,"crc":-637905481},{"key":"res/drawable-mdpi-v4/notification_bg_low_pressed.9.png","name":"res/drawable-mdpi-v4/notification_bg_low_pressed.9.png","size":223,"crc":-1206985160},{"key":"res/drawable-mdpi-v4/notification_bg_normal.9.png","name":"res/drawable-mdpi-v4/notification_bg_normal.9.png","size":215,"crc":-1053437548},{"key":"res/drawable-mdpi-v4/notification_bg_normal_pressed.9.png","name":"res/drawable-mdpi-v4/notification_bg_normal_pressed.9.png","size":223,"crc":-316674454},{"key":"res/drawable-mdpi-v4/notify_panel_notification_icon_bg.png","name":"res/drawable-mdpi-v4/notify_panel_notification_icon_bg.png","size":98,"crc":782467851},{"key":"res/drawable-hdpi-v4/notification_bg_low_normal.9.png","name":"res/drawable-hdpi-v4/notification_bg_low_normal.9.png","size":212,"crc":931926398},{"key":"res/drawable-hdpi-v4/notification_bg_low_pressed.9.png","name":"res/drawable-hdpi-v4/notification_bg_low_pressed.9.png","size":225,"crc":1348069157},{"key":"res/drawable-hdpi-v4/notification_bg_normal.9.png","name":"res/drawable-hdpi-v4/notification_bg_normal.9.png","size":212,"crc":-1037255009},{"key":"res/drawable-hdpi-v4/notification_bg_normal_pressed.9.png","name":"res/drawable-hdpi-v4/notification_bg_normal_pressed.9.png","size":225,"crc":-1579774768},{"key":"res/drawable-hdpi-v4/notification_oversize_large_icon_bg.png","name":"res/drawable-hdpi-v4/notification_oversize_large_icon_bg.png","size":909,"crc":-883619049},{"key":"res/drawable-hdpi-v4/notify_panel_notification_icon_bg.png","name":"res/drawable-hdpi-v4/notify_panel_notification_icon_bg.png","size":107,"crc":1859699185},{"key":"res/drawable-xhdpi-v4/notification_bg_low_normal.9.png","name":"res/drawable-xhdpi-v4/notification_bg_low_normal.9.png","size":221,"crc":986722933},{"key":"res/drawable-xhdpi-v4/notification_bg_low_pressed.9.png","name":"res/drawable-xhdpi-v4/notification_bg_low_pressed.9.png","size":252,"crc":-930084210},{"key":"res/drawable-xhdpi-v4/notification_bg_normal.9.png","name":"res/drawable-xhdpi-v4/notification_bg_normal.9.png","size":221,"crc":-1723534566},{"key":"res/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png","name":"res/drawable-xhdpi-v4/notification_bg_normal_pressed.9.png","size":247,"crc":-1030044328},{"key":"res/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png","name":"res/drawable-xhdpi-v4/notify_panel_notification_icon_bg.png","size":138,"crc":72836353},{"key":"res/layout/custom_dialog.xml","name":"res/layout/custom_dialog.xml","size":612,"crc":-227242397},{"key":"res/layout/ime_base_split_test_activity.xml","name":"res/layout/ime_base_split_test_activity.xml","size":364,"crc":1066515116},{"key":"res/layout/ime_secondary_split_test_activity.xml","name":"res/layout/ime_secondary_split_test_activity.xml","size":876,"crc":-190157726},{"key":"res/layout-v21/notification_action.xml","name":"res/layout-v21/notification_action.xml","size":1052,"crc":679561366},{"key":"res/layout-v21/notification_action_tombstone.xml","name":"res/layout-v21/notification_action_tombstone.xml","size":1228,"crc":1471488549},{"key":"res/layout-v21/notification_template_custom_big.xml","name":"res/layout-v21/notification_template_custom_big.xml","size":2456,"crc":-198560107},{"key":"res/layout-v21/notification_template_icon_group.xml","name":"res/layout-v21/notification_template_icon_group.xml","size":988,"crc":1716188901},{"key":"res/layout/notification_template_part_chronometer.xml","name":"res/layout/notification_template_part_chronometer.xml","size":440,"crc":676004396},{"key":"res/layout/notification_template_part_time.xml","name":"res/layout/notification_template_part_time.xml","size":440,"crc":-1560738397},{"key":"res/mipmap-mdpi-v4/ic_launcher.webp","name":"res/mipmap-mdpi-v4/ic_launcher.webp","size":982,"crc":-1391938492},{"key":"res/mipmap-mdpi-v4/ic_launcher_round.webp","name":"res/mipmap-mdpi-v4/ic_launcher_round.webp","size":1772,"crc":1591351618},{"key":"res/mipmap-hdpi-v4/ic_launcher.webp","name":"res/mipmap-hdpi-v4/ic_launcher.webp","size":1404,"crc":1918961115},{"key":"res/mipmap-hdpi-v4/ic_launcher_round.webp","name":"res/mipmap-hdpi-v4/ic_launcher_round.webp","size":2898,"crc":-1968626878},{"key":"res/mipmap-xhdpi-v4/ic_launcher.webp","name":"res/mipmap-xhdpi-v4/ic_launcher.webp","size":1900,"crc":-27209384},{"key":"res/mipmap-xhdpi-v4/ic_launcher_round.webp","name":"res/mipmap-xhdpi-v4/ic_launcher_round.webp","size":3918,"crc":1330214906},{"key":"res/mipmap-xxhdpi-v4/ic_launcher.webp","name":"res/mipmap-xxhdpi-v4/ic_launcher.webp","size":2884,"crc":317095134},{"key":"res/mipmap-xxhdpi-v4/ic_launcher_round.webp","name":"res/mipmap-xxhdpi-v4/ic_launcher_round.webp","size":5914,"crc":-1592374347},{"key":"res/mipmap-xxxhdpi-v4/ic_launcher.webp","name":"res/mipmap-xxxhdpi-v4/ic_launcher.webp","size":3844,"crc":161392164},{"key":"res/mipmap-xxxhdpi-v4/ic_launcher_round.webp","name":"res/mipmap-xxxhdpi-v4/ic_launcher_round.webp","size":7778,"crc":-167941173},{"key":"res/mipmap-anydpi-v26/ic_launcher.xml","name":"res/mipmap-anydpi-v26/ic_launcher.xml","size":548,"crc":-197061272},{"key":"res/mipmap-anydpi-v26/ic_launcher_round.xml","name":"res/mipmap-anydpi-v26/ic_launcher_round.xml","size":548,"crc":-197061272},{"key":"res/xml/backup_rules.xml","name":"res/xml/backup_rules.xml","size":132,"crc":1286822067},{"key":"res/xml/data_extraction_rules.xml","name":"res/xml/data_extraction_rules.xml","size":212,"crc":1324190710},{"key":"resources.arsc","name":"resources.arsc","size":479516,"crc":1440643816}]
added app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/javaResources0 +1 −0
1 +
[{"key":"DebugProbesKt.bin","name":"DebugProbesKt.bin","size":1728,"crc":-924615649},{"key":"META-INF/AL2.0","name":"META-INF/AL2.0","size":10174,"crc":514045872},{"key":"META-INF/LGPL2.1","name":"META-INF/LGPL2.1","size":24389,"crc":-1475526039},{"key":"META-INF/androidx.activity_activity-compose.version","name":"META-INF/androidx.activity_activity-compose.version","size":6,"crc":184345093},{"key":"META-INF/androidx.activity_activity-ktx.version","name":"META-INF/androidx.activity_activity-ktx.version","size":6,"crc":184345093},{"key":"META-INF/androidx.activity_activity.version","name":"META-INF/androidx.activity_activity.version","size":6,"crc":184345093},{"key":"META-INF/androidx.annotation_annotation-experimental.version","name":"META-INF/androidx.annotation_annotation-experimental.version","size":6,"crc":1795624574},{"key":"META-INF/androidx.arch.core_core-runtime.version","name":"META-INF/androidx.arch.core_core-runtime.version","size":67,"crc":1307063212},{"key":"META-INF/androidx.autofill_autofill.version","name":"META-INF/androidx.autofill_autofill.version","size":6,"crc":-42031000},{"key":"META-INF/androidx.compose.animation_animation-core.version","name":"META-INF/androidx.compose.animation_animation-core.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.animation_animation.version","name":"META-INF/androidx.compose.animation_animation.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.foundation_foundation-layout.version","name":"META-INF/androidx.compose.foundation_foundation-layout.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.foundation_foundation.version","name":"META-INF/androidx.compose.foundation_foundation.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.material3_material3.version","name":"META-INF/androidx.compose.material3_material3.version","size":6,"crc":1914453823},{"key":"META-INF/androidx.compose.material_material-icons-core.version","name":"META-INF/androidx.compose.material_material-icons-core.version","size":6,"crc":-1469048103},{"key":"META-INF/androidx.compose.material_material-icons-extended.version","name":"META-INF/androidx.compose.material_material-icons-extended.version","size":6,"crc":-1469048103},{"key":"META-INF/androidx.compose.material_material-ripple.version","name":"META-INF/androidx.compose.material_material-ripple.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.material_material.version","name":"META-INF/androidx.compose.material_material.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.runtime_runtime-annotation.version","name":"META-INF/androidx.compose.runtime_runtime-annotation.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.runtime_runtime-retain.version","name":"META-INF/androidx.compose.runtime_runtime-retain.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.runtime_runtime-saveable.version","name":"META-INF/androidx.compose.runtime_runtime-saveable.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.runtime_runtime.version","name":"META-INF/androidx.compose.runtime_runtime.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.ui_ui-geometry.version","name":"META-INF/androidx.compose.ui_ui-geometry.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.ui_ui-graphics.version","name":"META-INF/androidx.compose.ui_ui-graphics.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.ui_ui-test-manifest.version","name":"META-INF/androidx.compose.ui_ui-test-manifest.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.ui_ui-text.version","name":"META-INF/androidx.compose.ui_ui-text.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.ui_ui-tooling-data.version","name":"META-INF/androidx.compose.ui_ui-tooling-data.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.ui_ui-tooling-preview.version","name":"META-INF/androidx.compose.ui_ui-tooling-preview.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.ui_ui-tooling.version","name":"META-INF/androidx.compose.ui_ui-tooling.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.ui_ui-unit.version","name":"META-INF/androidx.compose.ui_ui-unit.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.ui_ui-util.version","name":"META-INF/androidx.compose.ui_ui-util.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.compose.ui_ui.version","name":"META-INF/androidx.compose.ui_ui.version","size":7,"crc":-1416098486},{"key":"META-INF/androidx.core_core-ktx.version","name":"META-INF/androidx.core_core-ktx.version","size":7,"crc":-358639726},{"key":"META-INF/androidx.core_core-viewtree.version","name":"META-INF/androidx.core_core-viewtree.version","size":6,"crc":-42031000},{"key":"META-INF/androidx.core_core.version","name":"META-INF/androidx.core_core.version","size":7,"crc":-358639726},{"key":"META-INF/androidx.customview_customview-poolingcontainer.version","name":"META-INF/androidx.customview_customview-poolingcontainer.version","size":6,"crc":-42031000},{"key":"META-INF/androidx.documentfile_documentfile.version","name":"META-INF/androidx.documentfile_documentfile.version","size":6,"crc":-42031000},{"key":"META-INF/androidx.dynamicanimation_dynamicanimation.version","name":"META-INF/androidx.dynamicanimation_dynamicanimation.version","size":6,"crc":-42031000},{"key":"META-INF/androidx.emoji2_emoji2.version","name":"META-INF/androidx.emoji2_emoji2.version","size":6,"crc":1914453823},{"key":"META-INF/androidx.graphics_graphics-path.version","name":"META-INF/androidx.graphics_graphics-path.version","size":6,"crc":-463103703},{"key":"META-INF/androidx.interpolator_interpolator.version","name":"META-INF/androidx.interpolator_interpolator.version","size":6,"crc":-42031000},{"key":"META-INF/androidx.legacy_legacy-support-core-utils.version","name":"META-INF/androidx.legacy_legacy-support-core-utils.version","size":6,"crc":-42031000},{"key":"META-INF/androidx.lifecycle_lifecycle-livedata-core-ktx.version","name":"META-INF/androidx.lifecycle_lifecycle-livedata-core-ktx.version","size":6,"crc":1653493832},{"key":"META-INF/androidx.lifecycle_lifecycle-livedata-core.version","name":"META-INF/androidx.lifecycle_lifecycle-livedata-core.version","size":6,"crc":1653493832},{"key":"META-INF/androidx.lifecycle_lifecycle-livedata.version","name":"META-INF/androidx.lifecycle_lifecycle-livedata.version","size":6,"crc":1653493832},{"key":"META-INF/androidx.lifecycle_lifecycle-process.version","name":"META-INF/androidx.lifecycle_lifecycle-process.version","size":6,"crc":1653493832},{"key":"META-INF/androidx.lifecycle_lifecycle-runtime-compose.version","name":"META-INF/androidx.lifecycle_lifecycle-runtime-compose.version","size":6,"crc":1653493832},{"key":"META-INF/androidx.lifecycle_lifecycle-runtime-ktx.version","name":"META-INF/androidx.lifecycle_lifecycle-runtime-ktx.version","size":6,"crc":1653493832},{"key":"META-INF/androidx.lifecycle_lifecycle-runtime.version","name":"META-INF/androidx.lifecycle_lifecycle-runtime.version","size":6,"crc":1653493832},{"key":"META-INF/androidx.lifecycle_lifecycle-viewmodel-ktx.version","name":"META-INF/androidx.lifecycle_lifecycle-viewmodel-ktx.version","size":6,"crc":1653493832},{"key":"META-INF/androidx.lifecycle_lifecycle-viewmodel-savedstate.version","name":"META-INF/androidx.lifecycle_lifecycle-viewmodel-savedstate.version","size":6,"crc":1653493832},{"key":"META-INF/androidx.lifecycle_lifecycle-viewmodel.version","name":"META-INF/androidx.lifecycle_lifecycle-viewmodel.version","size":6,"crc":1653493832},{"key":"META-INF/androidx.loader_loader.version","name":"META-INF/androidx.loader_loader.version","size":6,"crc":-42031000},{"key":"META-INF/androidx.localbroadcastmanager_localbroadcastmanager.version","name":"META-INF/androidx.localbroadcastmanager_localbroadcastmanager.version","size":6,"crc":-42031000},{"key":"META-INF/androidx.print_print.version","name":"META-INF/androidx.print_print.version","size":6,"crc":-42031000},{"key":"META-INF/androidx.profileinstaller_profileinstaller.version","name":"META-INF/androidx.profileinstaller_profileinstaller.version","size":6,"crc":1914453823},{"key":"META-INF/androidx.savedstate_savedstate-compose.version","name":"META-INF/androidx.savedstate_savedstate-compose.version","size":6,"crc":-570596092},{"key":"META-INF/androidx.savedstate_savedstate-ktx.version","name":"META-INF/androidx.savedstate_savedstate-ktx.version","size":6,"crc":-570596092},{"key":"META-INF/androidx.savedstate_savedstate.version","name":"META-INF/androidx.savedstate_savedstate.version","size":6,"crc":-570596092},{"key":"META-INF/androidx.startup_startup-runtime.version","name":"META-INF/androidx.startup_startup-runtime.version","size":6,"crc":1557790284},{"key":"META-INF/androidx.tracing_tracing.version","name":"META-INF/androidx.tracing_tracing.version","size":6,"crc":1467441379},{"key":"META-INF/androidx.transition_transition.version","name":"META-INF/androidx.transition_transition.version","size":6,"crc":-669648972},{"key":"META-INF/androidx.versionedparcelable_versionedparcelable.version","name":"META-INF/androidx.versionedparcelable_versionedparcelable.version","size":6,"crc":1557790284},{"key":"META-INF/androidx.window_window-core.version","name":"META-INF/androidx.window_window-core.version","size":6,"crc":-895461286},{"key":"META-INF/androidx.window_window.version","name":"META-INF/androidx.window_window.version","size":6,"crc":-895461286},{"key":"META-INF/androidx/annotation/annotation/LICENSE.txt","name":"META-INF/androidx/annotation/annotation/LICENSE.txt","size":10175,"crc":-106424664},{"key":"META-INF/androidx/collection/collection-ktx/LICENSE.txt","name":"META-INF/androidx/collection/collection-ktx/LICENSE.txt","size":10175,"crc":-106424664},{"key":"META-INF/androidx/collection/collection/LICENSE.txt","name":"META-INF/androidx/collection/collection/LICENSE.txt","size":10175,"crc":-106424664},{"key":"META-INF/androidx/lifecycle/lifecycle-common-java8/LICENSE.txt","name":"META-INF/androidx/lifecycle/lifecycle-common-java8/LICENSE.txt","size":10175,"crc":-106424664},{"key":"META-INF/androidx/lifecycle/lifecycle-common/LICENSE.txt","name":"META-INF/androidx/lifecycle/lifecycle-common/LICENSE.txt","size":10175,"crc":-106424664},{"key":"META-INF/kotlinx_coroutines_android.version","name":"META-INF/kotlinx_coroutines_android.version","size":5,"crc":485120441},{"key":"META-INF/kotlinx_coroutines_core.version","name":"META-INF/kotlinx_coroutines_core.version","size":5,"crc":485120441},{"key":"META-INF/services/kotlinx.coroutines.CoroutineExceptionHandler","name":"META-INF/services/kotlinx.coroutines.CoroutineExceptionHandler","size":54,"crc":-1889973424},{"key":"META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory","name":"META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory","size":52,"crc":1268078975},{"key":"kotlin/annotation/annotation.kotlin_builtins","name":"kotlin/annotation/annotation.kotlin_builtins","size":1006,"crc":96078319},{"key":"kotlin/collections/collections.kotlin_builtins","name":"kotlin/collections/collections.kotlin_builtins","size":8308,"crc":327658458},{"key":"kotlin/concurrent/atomics/atomics.kotlin_builtins","name":"kotlin/concurrent/atomics/atomics.kotlin_builtins","size":2674,"crc":1252866643},{"key":"kotlin/coroutines/coroutines.kotlin_builtins","name":"kotlin/coroutines/coroutines.kotlin_builtins","size":137,"crc":1360136731},{"key":"kotlin/internal/internal.kotlin_builtins","name":"kotlin/internal/internal.kotlin_builtins","size":590,"crc":-739093672},{"key":"kotlin/kotlin.kotlin_builtins","name":"kotlin/kotlin.kotlin_builtins","size":29399,"crc":-2111613243},{"key":"kotlin/ranges/ranges.kotlin_builtins","name":"kotlin/ranges/ranges.kotlin_builtins","size":4184,"crc":1405855901},{"key":"kotlin/reflect/reflect.kotlin_builtins","name":"kotlin/reflect/reflect.kotlin_builtins","size":4827,"crc":-575400209}]
removed .gradle/configuration-cache/517de0b9-7c5b-4e39-811b-e830fd8bcefe +0 −0

No line changes.

removed .gradle/configuration-cache/517de0b9-7c5b-4e39-811b-e830fd8bcefe/.globals.work.bin +0 −0

No line changes.

removed .gradle/configuration-cache/517de0b9-7c5b-4e39-811b-e830fd8bcefe/.strings.work.bin +0 −0

No line changes.

removed .gradle/configuration-cache/517de0b9-7c5b-4e39-811b-e830fd8bcefe/_app.work.bin +0 −0

No line changes.

removed .gradle/configuration-cache/517de0b9-7c5b-4e39-811b-e830fd8bcefe/buildfingerprint.bin +0 −0

No line changes.

removed .gradle/configuration-cache/517de0b9-7c5b-4e39-811b-e830fd8bcefe/entry.bin +0 −0

No line changes.

removed .gradle/configuration-cache/517de0b9-7c5b-4e39-811b-e830fd8bcefe/projectfingerprint.bin +0 −0

No line changes.

removed .gradle/configuration-cache/517de0b9-7c5b-4e39-811b-e830fd8bcefe/work.bin +0 −0

No line changes.

replaced .gradle/9.6.0/executionHistory/executionHistory.bin +0 −0

No line changes.

replaced .gradle/9.6.0/executionHistory/executionHistory.lock +0 −0

No line changes.

replaced .gradle/9.6.0/fileHashes/fileHashes.bin +0 −0

No line changes.

replaced .gradle/9.6.0/fileHashes/fileHashes.lock +0 −0

No line changes.

replaced .gradle/buildOutputCleanup/buildOutputCleanup.lock +0 −0

No line changes.

modified .gradle/configuration-cache/x746t3ik5ccr08zuw0if7al3/candidates.bin +1 −1
1 -
517de0b9-7c5b-4e39-811b-e830fd8bcef�
1 +
b06b1b2a-0dae-4545-b960-715b943d6c0�
modified app/build/intermediates/manifest_merge_blame_file/debug/processDebugMainManifest/manifest-merger-blame-debug-report.txt +21 −21
…
22 unchanged lines
23 23
15-->[androidx.core:core:1.16.0] /home/andymccall/.gradle/caches/9.6.0/transforms/2197676f31b9d2c5f64a9da7242aa6eb/transformed/core-1.16.0/AndroidManifest.xml:26:22-94
24 24
16
25 25
17    <application
26 -
17-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:5:5-27:19
26 +
17-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:5:5-26:19
27 27
18        android:allowBackup="true"
28 -
18-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:7:9-35
28 +
18-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:6:9-35
29 29
19        android:appComponentFactory="androidx.core.app.CoreComponentFactory"
30 30
19-->[androidx.core:core:1.16.0] /home/andymccall/.gradle/caches/9.6.0/transforms/2197676f31b9d2c5f64a9da7242aa6eb/transformed/core-1.16.0/AndroidManifest.xml:28:18-86
31 31
20        android:dataExtractionRules="@xml/data_extraction_rules"
32 -
20-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:8:9-65
32 +
20-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:7:9-65
33 33
21        android:debuggable="true"
34 34
22        android:extractNativeLibs="true"
35 -
22-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:6:9-41
35 +
22-->INJECTED
36 36
23        android:fullBackupContent="@xml/backup_rules"
37 -
23-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:9:9-54
37 +
23-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:8:9-54
38 38
24        android:icon="@mipmap/ic_launcher"
39 -
24-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:10:9-43
39 +
24-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:9:9-43
40 40
25        android:label="@string/app_name"
41 -
25-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:11:9-41
41 +
25-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:10:9-41
42 42
26        android:roundIcon="@mipmap/ic_launcher_round"
43 -
26-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:12:9-54
43 +
26-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:11:9-54
44 44
27        android:supportsRtl="true"
45 -
27-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:13:9-35
45 +
27-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:12:9-35
46 46
28        android:testOnly="true"
47 47
29        android:theme="@style/Theme.OxygenHub" >
48 -
29-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:14:9-47
48 +
29-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:13:9-47
49 49
30        <activity
50 -
30-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:15:9-26:20
50 +
30-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:14:9-25:20
51 51
31            android:name="com.example.oxygenhub.MainActivity"
52 -
31-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:16:13-41
52 +
31-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:15:13-41
53 53
32            android:exported="true"
54 -
32-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:17:13-36
54 +
32-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:16:13-36
55 55
33            android:label="@string/app_name"
56 -
33-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:18:13-45
56 +
33-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:17:13-45
57 57
34            android:theme="@style/Theme.OxygenHub"
58 -
34-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:19:13-51
58 +
34-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:18:13-51
59 59
35            android:windowSoftInputMode="adjustResize" >
60 -
35-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:20:13-55
60 +
35-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:19:13-55
61 61
36            <intent-filter>
62 -
36-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:21:13-25:29
62 +
36-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:20:13-24:29
63 63
37                <action android:name="android.intent.action.MAIN" />
64 -
37-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:22:17-69
65 -
37-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:22:25-66
64 +
37-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:21:17-69
65 +
37-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:21:25-66
66 66
38
67 67
39                <category android:name="android.intent.category.LAUNCHER" />
68 -
39-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:24:17-77
69 -
39-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:24:27-74
68 +
39-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:23:17-77
69 +
39-->/home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:23:27-74
70 70
40            </intent-filter>
71 71
41        </activity>
72 72
42        <activity
…
95 unchanged lines
modified app/build/outputs/logs/manifest-merger-debug-report.txt +26 −25
1 1
-- Merging decision tree log ---
2 2
manifest
3 -
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:2:1-29:12
4 -
INJECTED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:2:1-29:12
5 -
INJECTED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:2:1-29:12
6 -
INJECTED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:2:1-29:12
3 +
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:2:1-28:12
4 +
INJECTED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:2:1-28:12
5 +
INJECTED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:2:1-28:12
6 +
INJECTED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:2:1-28:12
7 7
MERGED from [androidx.compose.material3:material3-android:1.4.0] /home/andymccall/.gradle/caches/9.6.0/transforms/0af32a84e519aed562d3741488d9d893/transformed/material3/AndroidManifest.xml:17:1-22:12
8 8
MERGED from [androidx.compose.material:material-android:1.10.4] /home/andymccall/.gradle/caches/9.6.0/transforms/b64e5ccac257d942624d443fc46017e6/transformed/material/AndroidManifest.xml:2:1-7:12
9 9
MERGED from [androidx.compose.material:material-ripple-android:1.10.4] /home/andymccall/.gradle/caches/9.6.0/transforms/0d63c7cbd7b9a7719cb7078c8d48f8d9/transformed/material-ripple/AndroidManifest.xml:2:1-7:12
…
69 unchanged lines
79 79
	xmlns:android
80 80
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:2:11-69
81 81
application
82 -
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:5:5-27:19
82 +
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:5:5-26:19
83 +
INJECTED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:5:5-26:19
83 84
MERGED from [androidx.compose.ui:ui-tooling-android:1.10.4] /home/andymccall/.gradle/caches/9.6.0/transforms/7629ca5cf6992d4d9bd57362deb23084/transformed/ui-tooling/AndroidManifest.xml:22:5-26:19
84 85
MERGED from [androidx.compose.ui:ui-tooling-android:1.10.4] /home/andymccall/.gradle/caches/9.6.0/transforms/7629ca5cf6992d4d9bd57362deb23084/transformed/ui-tooling/AndroidManifest.xml:22:5-26:19
85 86
MERGED from [androidx.compose.ui:ui-test-manifest:1.10.4] /home/andymccall/.gradle/caches/9.6.0/transforms/6b022e559ac8a79cdd1719be30cc9be3/transformed/ui-test-manifest-1.10.4/AndroidManifest.xml:22:5-27:19
…
13 unchanged lines
99 100
MERGED from [androidx.startup:startup-runtime:1.1.1] /home/andymccall/.gradle/caches/9.6.0/transforms/26d209cd83d3d79dc88e7af45e26e59e/transformed/startup-runtime-1.1.1/AndroidManifest.xml:25:5-31:19
100 101
MERGED from [androidx.startup:startup-runtime:1.1.1] /home/andymccall/.gradle/caches/9.6.0/transforms/26d209cd83d3d79dc88e7af45e26e59e/transformed/startup-runtime-1.1.1/AndroidManifest.xml:25:5-31:19
101 102
	android:extractNativeLibs
102 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:6:9-41
103 +
		INJECTED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml
103 104
	android:appComponentFactory
104 105
		ADDED from [androidx.core:core:1.16.0] /home/andymccall/.gradle/caches/9.6.0/transforms/2197676f31b9d2c5f64a9da7242aa6eb/transformed/core-1.16.0/AndroidManifest.xml:28:18-86
105 106
	android:supportsRtl
106 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:13:9-35
107 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:12:9-35
107 108
	android:label
108 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:11:9-41
109 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:10:9-41
109 110
	android:fullBackupContent
110 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:9:9-54
111 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:8:9-54
111 112
	android:roundIcon
112 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:12:9-54
113 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:11:9-54
113 114
	android:icon
114 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:10:9-43
115 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:9:9-43
115 116
	android:allowBackup
116 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:7:9-35
117 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:6:9-35
117 118
	android:theme
118 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:14:9-47
119 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:13:9-47
119 120
	android:dataExtractionRules
120 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:8:9-65
121 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:7:9-65
121 122
activity#com.example.oxygenhub.MainActivity
122 -
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:15:9-26:20
123 +
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:14:9-25:20
123 124
	android:label
124 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:18:13-45
125 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:17:13-45
125 126
	android:windowSoftInputMode
126 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:20:13-55
127 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:19:13-55
127 128
	android:exported
128 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:17:13-36
129 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:16:13-36
129 130
	android:theme
130 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:19:13-51
131 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:18:13-51
131 132
	android:name
132 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:16:13-41
133 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:15:13-41
133 134
intent-filter#action:name:android.intent.action.MAIN+category:name:android.intent.category.LAUNCHER
134 -
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:21:13-25:29
135 +
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:20:13-24:29
135 136
action#android.intent.action.MAIN
136 -
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:22:17-69
137 +
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:21:17-69
137 138
	android:name
138 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:22:25-66
139 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:21:25-66
139 140
category#android.intent.category.LAUNCHER
140 -
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:24:17-77
141 +
ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:23:17-77
141 142
	android:name
142 -
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:24:27-74
143 +
		ADDED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml:23:27-74
143 144
uses-sdk
144 145
INJECTED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml reason: use-sdk injection requested
145 146
INJECTED from /home/andymccall/development/oxygenhub-android/app/src/main/AndroidManifest.xml
…
250 unchanged lines
modified app/src/main/java/com/example/oxygenhub/ui/LoginScreen.kt +37 −7
…
14 unchanged lines
15 15
import androidx.compose.ui.unit.dp
16 16
import androidx.compose.ui.unit.sp
17 17
18 +
import androidx.compose.foundation.Image
19 +
import androidx.compose.ui.res.painterResource
20 +
import com.example.oxygenhub.R
21 +
18 22
@Composable
19 23
fun LoginScreen(onLoginSuccess: () -> Unit) {
20 24
    var username by remember { mutableStateOf("") }
21 25
    var password by remember { mutableStateOf("") }
22 26
    var serverUrl by remember { mutableStateOf("https://oxygenhub.io") }
27 +
    var twoFactorCode by remember { mutableStateOf("") }
28 +
    var is2FaRequired by remember { mutableStateOf(false) }
23 29
    var isLoading by remember { mutableStateOf(false) }
24 30
25 31
    Column(
…
3 unchanged lines
29 35
        horizontalAlignment = Alignment.CenterHorizontally,
30 36
        verticalArrangement = Arrangement.Center
31 37
    ) {
38 +
        Image(
39 +
            painter = painterResource(id = R.drawable.mark),
40 +
            contentDescription = "OxygenHub Logo",
41 +
            modifier = Modifier.size(64.dp)
42 +
        )
43 +
        Spacer(modifier = Modifier.height(16.dp))
32 44
        Text(
33 45
            text = "OxygenHub",
34 46
            fontSize = 36.sp,
…
41 unchanged lines
76 88
            singleLine = true
77 89
        )
78 90
79 -
        Spacer(modifier = Modifier.height(32.dp))
91 +
        Spacer(modifier = Modifier.height(16.dp))
92 +
93 +
        if (is2FaRequired) {
94 +
            OutlinedTextField(
95 +
                value = twoFactorCode,
96 +
                onValueChange = { twoFactorCode = it },
97 +
                label = { Text("2FA Authenticator Code") },
98 +
                keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
99 +
                modifier = Modifier.fillMaxWidth(),
100 +
                singleLine = true
101 +
            )
102 +
            Spacer(modifier = Modifier.height(32.dp))
103 +
        } else {
104 +
            Spacer(modifier = Modifier.height(16.dp))
105 +
        }
80 106
81 107
        Button(
82 108
            onClick = {
83 -
                isLoading = true
84 -
                // TODO: Wire this up to rust-core to authenticate with the API
85 -
                // For now, we simulate a successful login immediately
86 -
                onLoginSuccess()
109 +
                if (!is2FaRequired) {
110 +
                    // Step 1: Simulate checking credentials and discovering 2FA is needed
111 +
                    is2FaRequired = true
112 +
                } else {
113 +
                    // Step 2: Simulate verifying the 2FA code and logging in
114 +
                    isLoading = true
115 +
                    onLoginSuccess()
116 +
                }
87 117
            },
88 118
            modifier = Modifier
89 119
                .fillMaxWidth()
90 120
                .height(50.dp),
91 -
            enabled = username.isNotBlank() && password.isNotBlank()
121 +
            enabled = username.isNotBlank() && password.isNotBlank() && (!is2FaRequired || twoFactorCode.isNotBlank())
92 122
        ) {
93 123
            if (isLoading) {
94 124
                CircularProgressIndicator(
…
1 unchanged lines
96 126
                    color = MaterialTheme.colorScheme.onPrimary
97 127
                )
98 128
            } else {
99 -
                Text("Log In", fontSize = 16.sp)
129 +
                Text(if (is2FaRequired) "Verify & Log In" else "Log In", fontSize = 16.sp)
100 130
            }
101 131
        }
102 132
    }
…
1 unchanged lines
modified app/src/main/java/com/example/oxygenhub/ui/MainScreen.kt +16 −1
…
12 unchanged lines
13 13
import androidx.compose.ui.unit.dp
14 14
import uniffi.rust_core.oxygenGreeting
15 15
16 +
import androidx.compose.foundation.Image
17 +
import androidx.compose.ui.res.painterResource
18 +
import androidx.compose.ui.Alignment
19 +
import com.example.oxygenhub.R
20 +
16 21
@OptIn(ExperimentalMaterial3Api::class)
17 22
@Composable
18 23
fun MainScreen() {
…
4 unchanged lines
23 28
    Scaffold(
24 29
        topBar = {
25 30
            TopAppBar(
26 -
                title = { Text("OxygenHub", fontWeight = FontWeight.Bold) },
31 +
                title = { 
32 +
                    Row(verticalAlignment = Alignment.CenterVertically) {
33 +
                        Image(
34 +
                            painter = painterResource(id = R.drawable.mark),
35 +
                            contentDescription = "OxygenHub Logo",
36 +
                            modifier = Modifier.size(24.dp)
37 +
                        )
38 +
                        Spacer(modifier = Modifier.width(8.dp))
39 +
                        Text("OxygenHub", fontWeight = FontWeight.Bold) 
40 +
                    }
41 +
                },
27 42
                colors = TopAppBarDefaults.topAppBarColors(
28 43
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
29 44
                    titleContentColor = MaterialTheme.colorScheme.onPrimaryContainer
…
77 unchanged lines