├── .gradle
├── 8.0
│ ├── checksums
│ │ ├── checksums.lock
│ │ ├── md5-checksums.bin
│ │ └── sha1-checksums.bin
│ ├── dependencies-accessors
│ │ ├── dependencies-accessors.lock
│ │ └── gc.properties
│ ├── executionHistory
│ │ ├── executionHistory.bin
│ │ └── executionHistory.lock
│ ├── fileChanges
│ │ └── last-build.bin
│ ├── fileHashes
│ │ ├── fileHashes.bin
│ │ ├── fileHashes.lock
│ │ └── resourceHashesCache.bin
│ └── gc.properties
├── buildOutputCleanup
│ ├── buildOutputCleanup.lock
│ ├── cache.properties
│ └── outputFiles.bin
├── file-system.probe
└── vcs-1
│ └── gc.properties
├── .idea
├── assetWizardSettings.xml
├── libraries
│ ├── Gradle__androidx_activity_activity_1_7_0_aar.xml
│ ├── Gradle__androidx_activity_activity_compose_1_7_0_aar.xml
│ ├── Gradle__androidx_activity_activity_ktx_1_7_0_aar.xml
│ ├── Gradle__androidx_annotation_annotation_experimental_1_3_0_aar.xml
│ ├── Gradle__androidx_annotation_annotation_jvm_1_6_0.xml
│ ├── Gradle__androidx_arch_core_core_common_2_2_0.xml
│ ├── Gradle__androidx_collection_collection_1_2_0.xml
│ ├── Gradle__androidx_compose_animation_animation_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_animation_animation_core_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_foundation_foundation_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_foundation_foundation_layout_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_material3_material3_android_1_2_0_alpha07_aar.xml
│ ├── Gradle__androidx_compose_material_material_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_material_material_icons_core_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_material_material_ripple_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_runtime_runtime_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_runtime_runtime_saveable_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_ui_ui_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_ui_ui_geometry_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_ui_ui_graphics_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_ui_ui_test_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_ui_ui_test_junit4_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_ui_ui_test_manifest_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_ui_ui_text_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_ui_ui_tooling_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_ui_ui_tooling_data_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_ui_ui_tooling_preview_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_compose_ui_ui_unit_android_1_6_0_alpha05_aar.xml
│ ├── Gradle__androidx_concurrent_concurrent_futures_1_1_0.xml
│ ├── Gradle__androidx_constraintlayout_constraintlayout_compose_1_1_0_alpha04_aar.xml
│ ├── Gradle__androidx_core_core_1_11_0_beta02_aar.xml
│ ├── Gradle__androidx_core_core_ktx_1_11_0_beta02_aar.xml
│ ├── Gradle__androidx_core_core_splashscreen_1_0_0_aar.xml
│ ├── Gradle__androidx_lifecycle_lifecycle_common_2_6_1.xml
│ ├── Gradle__androidx_lifecycle_lifecycle_common_java8_2_6_1.xml
│ ├── Gradle__androidx_lifecycle_lifecycle_livedata_core_2_6_1_aar.xml
│ ├── Gradle__androidx_lifecycle_lifecycle_runtime_2_6_1_aar.xml
│ ├── Gradle__androidx_lifecycle_lifecycle_runtime_ktx_2_6_1_aar.xml
│ ├── Gradle__androidx_lifecycle_lifecycle_viewmodel_2_6_1_aar.xml
│ ├── Gradle__androidx_lifecycle_lifecycle_viewmodel_compose_2_6_1_aar.xml
│ ├── Gradle__androidx_lifecycle_lifecycle_viewmodel_ktx_2_6_1_aar.xml
│ ├── Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_6_1_aar.xml
│ ├── Gradle__androidx_navigation_navigation_common_2_5_3_aar.xml
│ ├── Gradle__androidx_navigation_navigation_common_ktx_2_5_3_aar.xml
│ ├── Gradle__androidx_navigation_navigation_compose_2_5_3_aar.xml
│ ├── Gradle__androidx_navigation_navigation_runtime_2_5_3_aar.xml
│ ├── Gradle__androidx_navigation_navigation_runtime_ktx_2_5_3_aar.xml
│ ├── Gradle__androidx_savedstate_savedstate_1_2_1_aar.xml
│ ├── Gradle__androidx_savedstate_savedstate_ktx_1_2_1_aar.xml
│ ├── Gradle__androidx_test_annotation_1_0_1_aar.xml
│ ├── Gradle__androidx_test_core_1_5_0_aar.xml
│ ├── Gradle__androidx_test_espresso_espresso_core_3_5_1_aar.xml
│ ├── Gradle__androidx_test_espresso_espresso_idling_resource_3_5_1_aar.xml
│ ├── Gradle__androidx_test_ext_junit_1_1_5_aar.xml
│ ├── Gradle__androidx_test_monitor_1_6_1_aar.xml
│ ├── Gradle__androidx_test_runner_1_5_2_aar.xml
│ ├── Gradle__androidx_test_services_storage_1_4_2_aar.xml
│ ├── Gradle__androidx_tracing_tracing_1_0_0_aar.xml
│ ├── Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml
│ ├── Gradle__com_github_skydoves_cloudy_0_1_2_aar.xml
│ ├── Gradle__com_google_accompanist_accompanist_pager_0_27_1_aar.xml
│ ├── Gradle__com_google_accompanist_accompanist_pager_indicators_0_27_1_aar.xml
│ ├── Gradle__com_google_code_findbugs_jsr305_2_0_2.xml
│ ├── Gradle__com_google_guava_listenablefuture_1_0.xml
│ ├── Gradle__com_squareup_javawriter_2_1_1.xml
│ ├── Gradle__dev_chrisbanes_snapper_snapper_0_2_2_aar.xml
│ ├── Gradle__javax_inject_javax_inject_1.xml
│ ├── Gradle__junit_junit_4_13_2.xml
│ ├── Gradle__org_hamcrest_hamcrest_core_1_3.xml
│ ├── Gradle__org_hamcrest_hamcrest_integration_1_3.xml
│ ├── Gradle__org_hamcrest_hamcrest_library_1_3.xml
│ ├── Gradle__org_jetbrains_annotations_23_0_0.xml
│ ├── Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_8_22.xml
│ ├── Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_8_22.xml
│ ├── Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_8_20.xml
│ ├── Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_8_20.xml
│ ├── Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_7_1.xml
│ ├── Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_7_1.xml
│ └── Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_test_jvm_1_7_1.xml
├── misc.xml
├── modules.xml
├── modules
│ ├── TwitterUI.iml
│ └── app
│ │ ├── TwitterUI.app.androidTest.iml
│ │ ├── TwitterUI.app.iml
│ │ ├── TwitterUI.app.main.iml
│ │ └── TwitterUI.app.unitTest.iml
└── workspace.xml
├── README.md
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── JetpackPractice
│ │ └── twitterui
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── JetpackPractice
│ │ │ └── twitterui
│ │ │ ├── MainActivity.kt
│ │ │ ├── TwitterUiApp.kt
│ │ │ ├── appDrawer
│ │ │ └── AppDrawer.kt
│ │ │ ├── components
│ │ │ └── Post.kt
│ │ │ ├── domain
│ │ │ └── model
│ │ │ │ ├── AccountModel.kt
│ │ │ │ └── PostModel.kt
│ │ │ ├── routing
│ │ │ └── TwitterUiRouter.kt
│ │ │ ├── screens
│ │ │ ├── CollapsableTopDemo.kt
│ │ │ ├── HomeScreen.kt
│ │ │ ├── InboxScreen.kt
│ │ │ ├── NotificationsScreen.kt
│ │ │ ├── ProfileScreen.kt
│ │ │ └── SearchScreen.kt
│ │ │ ├── ui
│ │ │ └── theme
│ │ │ │ ├── Color.kt
│ │ │ │ ├── Theme.kt
│ │ │ │ └── Type.kt
│ │ │ ├── utils
│ │ │ └── NestedScrollConnection.kt
│ │ │ └── viewModel
│ │ │ ├── MainViewModel.kt
│ │ │ └── MainViewModelFactory.kt
│ └── res
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ ├── account_multiple_outline.xml
│ │ ├── account_outline.xml
│ │ ├── add.xml
│ │ ├── arrow_back_24.xml
│ │ ├── baseline_chevron_left_24.xml
│ │ ├── black_image.jpg
│ │ ├── bookmark_outline.xml
│ │ ├── calendar_month_24.xml
│ │ ├── cash_multiple.xml
│ │ ├── cog_outline.xml
│ │ ├── comments_icon.png
│ │ ├── communities_icon.PNG
│ │ ├── communities_icon_selected.PNG
│ │ ├── cover_pic_01.jpg
│ │ ├── cover_pic_blurred_01.jpg
│ │ ├── default_profile_pic.jpg
│ │ ├── dots_vertical_circle_outline.xml
│ │ ├── dummy_cover_pic.jpg
│ │ ├── dummy_cover_pic_blurred.jpg
│ │ ├── home_post_pic_03.jpg
│ │ ├── home_post_pic_04.jpg
│ │ ├── home_post_pic_05.jpg
│ │ ├── home_post_pic_1.jpg
│ │ ├── home_post_pic_2.jpg
│ │ ├── home_post_profile_pic_01.jpg
│ │ ├── home_post_profile_pic_02.jpg
│ │ ├── home_post_profile_pic_03.jpg
│ │ ├── home_post_profile_pic_04.jpg
│ │ ├── home_post_profile_pic_05.png
│ │ ├── ic_home.xml
│ │ ├── ic_home_selected.xml
│ │ ├── ic_launcher_background.xml
│ │ ├── ic_messages.xml
│ │ ├── ic_messages_selected.xml
│ │ ├── ic_notifications.xml
│ │ ├── ic_notifications_selected.xml
│ │ ├── ic_search.xml
│ │ ├── ic_search_selected.xml
│ │ ├── icon.png
│ │ ├── img.png
│ │ ├── img_1.png
│ │ ├── img_2.png
│ │ ├── img_3.png
│ │ ├── img_4.png
│ │ ├── img_5.png
│ │ ├── inner_post_01.jpg
│ │ ├── inner_post_02.jpg
│ │ ├── inner_post_03.jpg
│ │ ├── likes_icon.png
│ │ ├── list_box_outline.xml
│ │ ├── location_on_24.xml
│ │ ├── logo.xml
│ │ ├── logo_white_tint.xml
│ │ ├── microphone_outline.xml
│ │ ├── my_profile_cover.png
│ │ ├── question_mark.png
│ │ ├── retweet_icon.png
│ │ ├── share_icon.png
│ │ ├── sparkle.png
│ │ ├── splash_background.xml
│ │ ├── sun.png
│ │ ├── three_dots.png
│ │ ├── three_dots_white_24.xml
│ │ ├── trends_icon.png
│ │ ├── twitter_x_logo.png
│ │ ├── verified_badge.png
│ │ └── views_icon.png
│ │ ├── font
│ │ ├── chirp_bold_web.ttf
│ │ ├── chirp_medium_web.ttf
│ │ ├── chirp_regular_web.ttf
│ │ ├── worksans_bold.ttf
│ │ ├── worksans_light.ttf
│ │ ├── worksans_medium.ttf
│ │ ├── worksans_regular.ttf
│ │ └── worksans_semibold.ttf
│ │ ├── inner_post_pic_03
│ │ └── F68z2irWQAApcO8.jpg
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── values
│ │ ├── colors.xml
│ │ ├── splash.xml
│ │ ├── strings.xml
│ │ └── themes.xml
│ │ └── xml
│ │ ├── backup_rules.xml
│ │ └── data_extraction_rules.xml
│ └── test
│ └── java
│ └── com
│ └── JetpackPractice
│ └── twitterui
│ └── ExampleUnitTest.kt
└── local.properties
/.gradle/8.0/checksums/checksums.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/8.0/checksums/checksums.lock
--------------------------------------------------------------------------------
/.gradle/8.0/checksums/md5-checksums.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/8.0/checksums/md5-checksums.bin
--------------------------------------------------------------------------------
/.gradle/8.0/checksums/sha1-checksums.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/8.0/checksums/sha1-checksums.bin
--------------------------------------------------------------------------------
/.gradle/8.0/dependencies-accessors/dependencies-accessors.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/8.0/dependencies-accessors/dependencies-accessors.lock
--------------------------------------------------------------------------------
/.gradle/8.0/dependencies-accessors/gc.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/8.0/dependencies-accessors/gc.properties
--------------------------------------------------------------------------------
/.gradle/8.0/executionHistory/executionHistory.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/8.0/executionHistory/executionHistory.bin
--------------------------------------------------------------------------------
/.gradle/8.0/executionHistory/executionHistory.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/8.0/executionHistory/executionHistory.lock
--------------------------------------------------------------------------------
/.gradle/8.0/fileChanges/last-build.bin:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gradle/8.0/fileHashes/fileHashes.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/8.0/fileHashes/fileHashes.bin
--------------------------------------------------------------------------------
/.gradle/8.0/fileHashes/fileHashes.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/8.0/fileHashes/fileHashes.lock
--------------------------------------------------------------------------------
/.gradle/8.0/fileHashes/resourceHashesCache.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/8.0/fileHashes/resourceHashesCache.bin
--------------------------------------------------------------------------------
/.gradle/8.0/gc.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/8.0/gc.properties
--------------------------------------------------------------------------------
/.gradle/buildOutputCleanup/buildOutputCleanup.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/buildOutputCleanup/buildOutputCleanup.lock
--------------------------------------------------------------------------------
/.gradle/buildOutputCleanup/cache.properties:
--------------------------------------------------------------------------------
1 | #Fri Sep 08 10:22:29 WAT 2023
2 | gradle.version=8.0
3 |
--------------------------------------------------------------------------------
/.gradle/buildOutputCleanup/outputFiles.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/buildOutputCleanup/outputFiles.bin
--------------------------------------------------------------------------------
/.gradle/file-system.probe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/file-system.probe
--------------------------------------------------------------------------------
/.gradle/vcs-1/gc.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/.gradle/vcs-1/gc.properties
--------------------------------------------------------------------------------
/.idea/assetWizardSettings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
46 |
47 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_activity_activity_1_7_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_activity_activity_compose_1_7_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_activity_activity_ktx_1_7_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_3_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_annotation_annotation_jvm_1_6_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_arch_core_core_common_2_2_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_collection_collection_1_2_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_animation_animation_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_animation_animation_core_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_foundation_foundation_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_foundation_foundation_layout_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_material3_material3_android_1_2_0_alpha07_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_material_material_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_material_material_icons_core_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_material_material_ripple_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_runtime_runtime_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_runtime_runtime_saveable_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_ui_ui_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_ui_ui_geometry_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_ui_ui_graphics_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_ui_ui_test_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_ui_ui_test_junit4_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_ui_ui_test_manifest_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_ui_ui_text_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_ui_ui_tooling_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_ui_ui_tooling_data_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_ui_ui_tooling_preview_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_compose_ui_ui_unit_android_1_6_0_alpha05_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_concurrent_concurrent_futures_1_1_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_compose_1_1_0_alpha04_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_core_core_1_11_0_beta02_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_core_core_ktx_1_11_0_beta02_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_core_core_splashscreen_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_6_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_java8_2_6_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_6_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_6_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_ktx_2_6_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_6_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_compose_2_6_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_ktx_2_6_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_6_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_navigation_navigation_common_2_5_3_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_navigation_navigation_common_ktx_2_5_3_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_navigation_navigation_compose_2_5_3_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_navigation_navigation_runtime_2_5_3_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_navigation_navigation_runtime_ktx_2_5_3_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_2_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_savedstate_savedstate_ktx_1_2_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_test_annotation_1_0_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_test_core_1_5_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_5_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_5_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_5_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_test_monitor_1_6_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_test_runner_1_5_2_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_test_services_storage_1_4_2_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_tracing_tracing_1_0_0_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__com_github_skydoves_cloudy_0_1_2_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__com_google_accompanist_accompanist_pager_0_27_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__com_google_accompanist_accompanist_pager_indicators_0_27_1_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__com_google_guava_listenablefuture_1_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__dev_chrisbanes_snapper_snapper_0_2_2_aar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__junit_junit_4_13_2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_jetbrains_annotations_23_0_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_8_22.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_8_22.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_8_20.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk8_1_8_20.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_7_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm_1_7_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_test_jvm_1_7_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/modules/TwitterUI.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/modules/app/TwitterUI.app.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 | {
106 | "keyToString": {
107 | "RunOnceActivity.OpenProjectViewOnStart": "true",
108 | "RunOnceActivity.ShowReadmeOnStart": "true",
109 | "RunOnceActivity.cidr.known.project.marker": "true",
110 | "cidr.known.project.marker": "true",
111 | "last_directory_selection": "C:/Users/LENOVO Z50/AndroidStudioProjects/TwitterUI/app/src/main/res/drawable",
112 | "last_opened_file_path": "C:/app dev/retroFit course/andfun-kotlin-mars-real-estate-master",
113 | "project.structure.last.edited": "Modules",
114 | "project.structure.proportion": "0.17",
115 | "project.structure.side.proportion": "0.2"
116 | }
117 | }
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 | 1694164711239
194 |
195 |
196 | 1694164711239
197 |
198 |
199 | 1698660488212
200 |
201 |
202 |
203 | 1698660488212
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Twitter UI Clone with Jetpack Compose
2 |
3 | ## Overview
4 | This project is a Twitter UI clone built entirely with Jetpack Compose, inspired by Twitter's recent adoption of this technology in their Android app. The goal was to recreate Twitter's user interface down to the last detail, and this project was completed without relying on any third-party libraries.
5 |
6 | https://github.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/assets/99191971/cda01b4e-05a7-4a59-b19c-d6908ff95de7
7 |
8 | ### Tech Stack
9 |
10 | - Jetpack Compose for UI Design
11 | - MVVM Architecture for code separation, management, and testing
12 | - Compose Navigation for seamless app navigation
13 | - Animations and offsets for smooth user interactions
14 | - Bottom Navigation Bar for easy navigation
15 | - Material 3 Top App Bar and Search Bar for a modern look
16 | - Jetpack Compose Effects for interactive UI elements
17 | - Nested Scroll Connections for complex views
18 | - Core Splash Screen Dependency for a great user onboarding experience
19 | - ConstraintLayout and Nested Navigation for building a complex UI
20 |
21 | ## Highlights
22 |
23 | - Faithful recreation of Twitter's UI, inspired by their recent use of Jetpack Compose.
24 | - A seamless navigation and user experience.
25 | - Smooth animations and engaging UI elements.
26 | - Utilization of Material Design 3 elements for a modern and visually appealing look.
27 | - A responsive Bottom Navigation Bar for easy app navigation.
28 | - Advanced UI components, including a search bar.
29 | - Nested scrolling for complex views with efficient data handling.
30 | - A core splash screen for a polished user onboarding experience.
31 |
32 | ## Future Improvements
33 |
34 | This project is a living document of my journey with Jetpack Compose, and I'm committed to continuous improvement. Some potential areas for future enhancements include:
35 |
36 | - Performance optimizations.
37 | - Further code refactoring and architectural improvements.
38 | - Enhanced compatibility and responsive design for various Android devices.
39 | - Integration of additional Twitter-like features and functionalities.
40 | - Continued learning and exploration of the latest Jetpack Compose features.
41 |
42 | ## Getting Started
43 |
44 | To get this project up and running on your local machine, follow these steps:
45 |
46 | 1. Clone this repository: `git clone https://github.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-git`
47 | 2. Open the project in Android Studio or your preferred Android IDE.
48 | 3. Build and run the project on an Android emulator or a physical device.
49 |
50 | ## Contributing
51 |
52 | Contributions to this project are welcome. If you have any suggestions, improvements, or bug fixes, feel free to create issues or pull requests. Let's collaborate to make this project even better!
53 |
54 | Thank you for checking out this project! Your feedback and contributions are highly appreciated. If you have any questions or feedback, don't hesitate to reach out.
55 |
56 | LinkedIn: https://www.linkedin.com/in/mahfoudh-aggoun-a6a329224/
57 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.application'
3 | id 'org.jetbrains.kotlin.android'
4 | }
5 |
6 | android {
7 | namespace 'com.JetpackPractice.twitterui'
8 | compileSdk 34
9 |
10 | defaultConfig {
11 | applicationId "com.JetpackPractice.twitterui"
12 | minSdk 24
13 | targetSdk 33
14 | versionCode 1
15 | versionName "1.0"
16 |
17 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
18 | vectorDrawables {
19 | useSupportLibrary true
20 | }
21 | }
22 |
23 | buildTypes {
24 | release {
25 | minifyEnabled false
26 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
27 | }
28 | }
29 | compileOptions {
30 | sourceCompatibility JavaVersion.VERSION_17
31 | targetCompatibility JavaVersion.VERSION_17
32 | }
33 | kotlinOptions {
34 | jvmTarget = '17'
35 | }
36 | buildFeatures {
37 | compose true
38 | }
39 | composeOptions {
40 | kotlinCompilerExtensionVersion '1.3.2'
41 | }
42 | packagingOptions {
43 | resources {
44 | excludes += '/META-INF/{AL2.0,LGPL2.1}'
45 | }
46 | }
47 | }
48 |
49 | dependencies {
50 |
51 | implementation 'androidx.core:core-ktx:1.8.0'
52 | implementation platform('org.jetbrains.kotlin:kotlin-bom:1.8.0')
53 | implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
54 | implementation 'androidx.activity:activity-compose:1.5.1'
55 | implementation platform('androidx.compose:compose-bom:2022.10.00')
56 | implementation 'androidx.compose.ui:ui'
57 | implementation 'androidx.compose.ui:ui-graphics'
58 | implementation 'androidx.compose.ui:ui-tooling-preview'
59 | implementation "androidx.compose.material:material"
60 | implementation 'androidx.compose.material3:material3'
61 | implementation "androidx.compose.material3:material3:1.2.0-alpha07"
62 | testImplementation 'junit:junit:4.13.2'
63 | androidTestImplementation 'androidx.test.ext:junit:1.1.5'
64 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
65 | androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
66 | androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
67 | debugImplementation 'androidx.compose.ui:ui-tooling'
68 | debugImplementation 'androidx.compose.ui:ui-test-manifest'
69 | implementation "androidx.navigation:navigation-compose:2.5.3"
70 | implementation "androidx.constraintlayout:constraintlayout-compose:1.1.0-alpha04"
71 | implementation "com.google.accompanist:accompanist-pager:0.27.1"
72 | implementation "com.google.accompanist:accompanist-pager-indicators:0.27.1"
73 | implementation"com.github.skydoves:cloudy:0.1.2"
74 | implementation "androidx.core:core-splashscreen:1.0.0"
75 |
76 | }
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/JetpackPractice/twitterui/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui
2 |
3 | import androidx.test.platform.app.InstrumentationRegistry
4 | import androidx.test.ext.junit.runners.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22 | assertEquals("com.JetpackPractice.twitterui", appContext.packageName)
23 | }
24 | }
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
15 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui
2 |
3 | import android.os.Bundle
4 | import androidx.activity.ComponentActivity
5 | import androidx.activity.compose.setContent
6 | import androidx.activity.viewModels
7 | import androidx.compose.foundation.layout.fillMaxSize
8 | import androidx.compose.material3.MaterialTheme
9 | import androidx.compose.material3.Surface
10 | import androidx.compose.material3.Text
11 | import androidx.compose.runtime.Composable
12 | import androidx.compose.ui.Modifier
13 | import androidx.compose.ui.tooling.preview.Preview
14 | import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
15 | import com.JetpackPractice.twitterui.ui.theme.TwitterUITheme
16 | import com.JetpackPractice.twitterui.viewModel.MainViewModel
17 | import com.JetpackPractice.twitterui.viewModel.MainViewModelFactory
18 |
19 | class MainActivity : ComponentActivity() {
20 |
21 | private val viewModel: MainViewModel by viewModels(factoryProducer = {
22 | MainViewModelFactory(
23 | this
24 | )
25 | })
26 |
27 | override fun onCreate(savedInstanceState: Bundle?) {
28 | setTheme(R.style.Theme_TwitterUI)
29 |
30 | super.onCreate(savedInstanceState)
31 | setContent {
32 | TwitterUiApp(viewModel)
33 | }
34 | }
35 | }
36 |
37 |
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/components/Post.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.components
2 |
3 | import androidx.annotation.DrawableRes
4 | import androidx.compose.foundation.Image
5 | import androidx.compose.foundation.background
6 | import androidx.compose.foundation.clickable
7 | import androidx.compose.foundation.layout.Arrangement
8 | import androidx.compose.foundation.layout.Box
9 | import androidx.compose.foundation.layout.Column
10 | import androidx.compose.foundation.layout.Row
11 | import androidx.compose.foundation.layout.Spacer
12 | import androidx.compose.foundation.layout.fillMaxSize
13 | import androidx.compose.foundation.layout.fillMaxWidth
14 | import androidx.compose.foundation.layout.height
15 | import androidx.compose.foundation.layout.offset
16 | import androidx.compose.foundation.layout.padding
17 | import androidx.compose.foundation.layout.requiredWidthIn
18 | import androidx.compose.foundation.layout.size
19 | import androidx.compose.foundation.layout.width
20 | import androidx.compose.foundation.layout.widthIn
21 | import androidx.compose.foundation.shape.CircleShape
22 | import androidx.compose.foundation.shape.RoundedCornerShape
23 | import androidx.compose.material.Divider
24 | import androidx.compose.material.MaterialTheme
25 | import androidx.compose.material3.Icon
26 | import androidx.compose.material3.IconButton
27 | import androidx.compose.material3.Text
28 | import androidx.compose.runtime.Composable
29 | import androidx.compose.ui.Alignment
30 | import androidx.compose.ui.Modifier
31 | import androidx.compose.ui.draw.clip
32 | import androidx.compose.ui.graphics.Color
33 | import androidx.compose.ui.graphics.vector.ImageVector
34 | import androidx.compose.ui.layout.ContentScale
35 | import androidx.compose.ui.platform.LocalConfiguration
36 | import androidx.compose.ui.res.colorResource
37 | import androidx.compose.ui.res.painterResource
38 | import androidx.compose.ui.res.stringResource
39 | import androidx.compose.ui.res.vectorResource
40 | import androidx.compose.ui.text.font.Font
41 | import androidx.compose.ui.text.font.FontFamily
42 | import androidx.compose.ui.text.font.FontWeight
43 | import androidx.compose.ui.text.style.TextOverflow
44 | import androidx.compose.ui.tooling.preview.Preview
45 | import androidx.compose.ui.unit.dp
46 | import androidx.compose.ui.unit.sp
47 | import androidx.constraintlayout.compose.ConstraintLayout
48 | import androidx.navigation.NavGraph.Companion.findStartDestination
49 | import androidx.navigation.NavHostController
50 | import com.JetpackPractice.twitterui.R
51 | import com.JetpackPractice.twitterui.domain.model.PostModel
52 | import com.JetpackPractice.twitterui.routing.Screen
53 | import com.JetpackPractice.twitterui.viewModel.MainViewModel
54 |
55 |
56 | private val chirpFamily = FontFamily(
57 | Font(R.font.chirp_regular_web, FontWeight.Normal),
58 | Font(R.font.chirp_medium_web, FontWeight.Medium),
59 | Font(R.font.chirp_bold_web, FontWeight.Bold),
60 | )
61 |
62 |
63 | @Composable
64 | fun Post(
65 | universalNavHostController: NavHostController?,
66 | post: PostModel = PostModel.DEFAULT_POST,
67 | index: Int = 0
68 | ) {
69 | ConstraintLayout(
70 | Modifier
71 | .fillMaxSize()
72 | .padding(bottom = 5.dp, end = 5.dp)
73 | ) {
74 | val (profileImage, header, text, image, postActions, threeDots, divider) = createRefs()
75 | Image(
76 | painter = painterResource(id = post.profilePic),
77 | modifier = Modifier
78 | .padding(top = 4.dp)
79 | .clip(CircleShape)
80 | .background(Color.Gray)
81 | .size(40.dp)
82 | .constrainAs(profileImage) {
83 | start.linkTo(parent.start)
84 | }
85 | .clickable(onClick = {
86 | onProfileClick(universalNavHostController!!, index)}),
87 | contentScale = ContentScale.Fit,
88 | contentDescription = ""
89 | )
90 | PostHeader(modifier = Modifier
91 | .constrainAs(header) {
92 | start.linkTo(profileImage.end)
93 | }
94 | .padding(start = 7.dp),
95 | post = post)
96 |
97 | Text(
98 | modifier = Modifier
99 | .widthIn(max = (LocalConfiguration.current.screenWidthDp - 55).dp)
100 | .padding(start = 7.dp, top = 5.dp)
101 | .constrainAs(text) {
102 | start.linkTo(profileImage.end)
103 | top.linkTo(header.bottom)
104 |
105 | },
106 | text = post.text,
107 | fontFamily = chirpFamily,
108 | fontWeight = FontWeight.Normal,
109 | fontSize = 14.sp,
110 | lineHeight = 18.sp
111 | )
112 |
113 | if (post.hasPic)
114 | Image(
115 | modifier = Modifier
116 | .widthIn(max = (LocalConfiguration.current.screenWidthDp - 57).dp)
117 | .fillMaxWidth()
118 | .padding(top = 10.dp, start = 7.dp)
119 | .clip(RoundedCornerShape(10.dp))
120 | .background(Color.Blue)
121 | .constrainAs(image) {
122 | start.linkTo(profileImage.end)
123 | if (post.hasText)
124 | top.linkTo(text.bottom)
125 | else
126 | top.linkTo(header.bottom)
127 | },
128 | painter = painterResource(id = post.image),
129 | contentDescription = "",
130 | )
131 |
132 | PostActions(postModel = post,
133 | modifier = Modifier
134 | .widthIn(max = (LocalConfiguration.current.screenWidthDp - 57).dp)
135 | .fillMaxWidth()
136 | .constrainAs(postActions) {
137 | start.linkTo(profileImage.end)
138 | if (post.hasPic)
139 | top.linkTo(image.bottom)
140 | else
141 | top.linkTo(text.bottom)
142 | }
143 | .padding(start = 7.dp, top = 6.dp))
144 | Icon(
145 | modifier = Modifier
146 | .constrainAs(threeDots) {
147 | centerVerticallyTo(header)
148 | end.linkTo(parent.end)
149 | }
150 | .padding(end = 5.dp)
151 | .size(18.dp),
152 | painter = painterResource(id = R.drawable.three_dots),
153 | contentDescription = ""
154 | )
155 | Divider(
156 | color = MaterialTheme.colors.onSurface.copy(alpha = .1f),
157 | modifier = Modifier
158 | .constrainAs(divider) {
159 | top.linkTo(postActions.bottom)
160 | }
161 | .padding(top = 5.dp)
162 | )
163 |
164 | }
165 | }
166 |
167 | @Preview(showSystemUi = true)
168 | @Composable
169 | fun PostHeader(
170 | post: PostModel = PostModel.DEFAULT_POST,
171 | modifier: Modifier = Modifier
172 | ) {
173 | Row(
174 | modifier = modifier.height(20.dp),
175 | horizontalArrangement = Arrangement.spacedBy(4.dp),
176 | verticalAlignment = Alignment.CenterVertically
177 | ) {
178 | Text(
179 | text = post.username,
180 | modifier = Modifier.widthIn(0.dp, 150.dp),
181 | overflow = TextOverflow.Ellipsis,
182 | fontFamily = chirpFamily,
183 | fontWeight = FontWeight.Bold,
184 | fontSize = 14.sp
185 | )
186 |
187 | if(post.verified) {
188 | Icon(
189 | painter = painterResource(id = R.drawable.verified_badge),
190 | contentDescription = "verified badge",
191 | modifier = Modifier.size(10.dp).offset(y = 2.dp),
192 | tint = colorResource(id = R.color.twitterBlue)
193 | )
194 | }
195 |
196 | Text(
197 | text = post.accountname,
198 | fontFamily = chirpFamily,
199 | modifier = Modifier.widthIn(0.dp, 60.dp),
200 | overflow = TextOverflow.Ellipsis,
201 | fontWeight = FontWeight.Normal,
202 | color = Color.Gray,
203 | fontSize = 14.sp
204 | )
205 |
206 | Text(
207 | text = "· " + post.date,
208 | fontFamily = chirpFamily,
209 | fontWeight = FontWeight.Normal,
210 | color = Color.Gray,
211 | fontSize = 14.sp
212 | )
213 |
214 | }
215 | }
216 |
217 |
218 | @Composable
219 | fun PostActions(postModel: PostModel, modifier: Modifier) {
220 | Row(
221 | modifier = modifier.height(20.dp),
222 | horizontalArrangement = Arrangement.SpaceBetween,
223 | verticalAlignment = Alignment.CenterVertically
224 | ) {
225 | PostAction(R.drawable.comments_icon, postModel.comments)
226 | PostAction(R.drawable.retweet_icon, postModel.retweets)
227 | PostAction(vectorResourceId = R.drawable.likes_icon, text = postModel.likes)
228 | PostAction(vectorResourceId = R.drawable.views_icon, text = postModel.views)
229 | PostAction(vectorResourceId = R.drawable.share_icon, text = -1)
230 | }
231 | }
232 |
233 |
234 | @Composable
235 | fun PostAction(
236 | @DrawableRes vectorResourceId: Int,
237 | text: Int,
238 | ) {
239 | Box() {
240 | Row(verticalAlignment = Alignment.CenterVertically) {
241 | Icon(
242 | painterResource(id = vectorResourceId),
243 | contentDescription = "",
244 | tint = Color.Gray,
245 | modifier = Modifier.size(20.dp)
246 | )
247 | Spacer(modifier = Modifier.width(4.dp))
248 | if (text != -1)
249 | Text(
250 | text = text.toString(),
251 | fontWeight = FontWeight.Normal,
252 | fontFamily = chirpFamily,
253 | color = Color.Gray,
254 | fontSize = 14.sp
255 | )
256 | }
257 | }
258 | }
259 |
260 | fun onProfileClick(navController: NavHostController, index: Int) {
261 | navController.navigate(Screen.Profile.route+"/$index") {
262 | popUpTo(navController.graph.findStartDestination().id) {
263 | saveState = true
264 | }
265 | launchSingleTop = true
266 | restoreState = true
267 | }
268 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/domain/model/AccountModel.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.domain.model
2 |
3 | import com.JetpackPractice.twitterui.R
4 |
5 | data class AccountModel(
6 | val username: String,
7 | val accountname: String,
8 | val bio : String,
9 | val profilePic: Int,
10 | val coverPic: Int,
11 | val blurredCoverPic: Int,
12 | val dateJoined : String,
13 | val location : String,
14 | val following : String,
15 | val followers : String,
16 | val posts : List?
17 | ){
18 | companion object{
19 | val DEFAULT_ACCOUNT = AccountModel(
20 | "mahfoudh aggoun",
21 | "@Mahfoudh_Aggn",
22 | "",
23 | R.drawable.default_profile_pic,
24 | R.drawable.my_profile_cover,
25 | R.drawable.my_profile_cover,
26 | "December 2014",
27 | "Algeria",
28 | "386",
29 | "5",
30 | null
31 | )
32 | }
33 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/domain/model/PostModel.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.domain.model
2 |
3 | import com.JetpackPractice.twitterui.R
4 |
5 | data class PostModel (
6 | val username: String,
7 | val accountname: String,
8 | val date: String,
9 | val profilePic: Int,
10 | val text: String,
11 | val image: Int = -1,
12 | val likes: Int,
13 | val comments: Int,
14 | val retweets: Int,
15 | val views: Int,
16 | val verified: Boolean,
17 | val hasText: Boolean,
18 | val hasPic: Boolean,
19 | ) {
20 |
21 | companion object {
22 | val DEFAULT_POST = PostModel(
23 | "mahfoudh aggoun",
24 | "@Mahfoudh...",
25 | "2d",
26 | R.drawable.default_profile_pic,
27 | "Filler text is text that shares some characteristics of a real written text, but is random or otherwise generated. It may be used to display a sample of fonts, generate text for testing, or to spoof an e-mail spam filter.",
28 | R.drawable.icon,
29 | 56,
30 | 10,
31 | 2,
32 | 1005,
33 | true,
34 | true,
35 | false
36 | )
37 | }
38 |
39 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/routing/TwitterUiRouter.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.routing
2 |
3 | sealed class Screen(val title: String, val route: String) {
4 | object Home : Screen("Home", "Home")
5 | object Search : Screen("Search", "Search")
6 | object Notifications : Screen("Notifications", "Notifications")
7 | object Inbox : Screen("Inbox", "Inbox")
8 | object Profile : Screen ("Profile", "Profile")
9 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/screens/HomeScreen.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.screens
2 |
3 | import androidx.compose.foundation.ExperimentalFoundationApi
4 | import androidx.compose.foundation.LocalOverscrollConfiguration
5 | import androidx.compose.foundation.background
6 | import androidx.compose.foundation.layout.Box
7 | import androidx.compose.foundation.layout.Column
8 | import androidx.compose.foundation.layout.Row
9 | import androidx.compose.foundation.layout.fillMaxHeight
10 | import androidx.compose.foundation.layout.fillMaxSize
11 | import androidx.compose.foundation.layout.fillMaxWidth
12 | import androidx.compose.foundation.layout.height
13 | import androidx.compose.foundation.layout.padding
14 | import androidx.compose.foundation.layout.width
15 | import androidx.compose.foundation.lazy.LazyColumn
16 | import androidx.compose.foundation.shape.RoundedCornerShape
17 | import androidx.compose.material.Tab
18 | import androidx.compose.material.Text
19 | import androidx.compose.material3.CenterAlignedTopAppBar
20 | import androidx.compose.material3.ExperimentalMaterial3Api
21 | import androidx.compose.material3.TabPosition
22 | import androidx.compose.material3.TabRow
23 | import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset
24 | import androidx.compose.material3.TopAppBarDefaults
25 | import androidx.compose.runtime.Composable
26 | import androidx.compose.runtime.CompositionLocalProvider
27 | import androidx.compose.runtime.rememberCoroutineScope
28 | import androidx.compose.ui.Modifier
29 | import androidx.compose.ui.draw.clip
30 | import androidx.compose.ui.draw.shadow
31 | import androidx.compose.ui.graphics.Color
32 | import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
33 | import androidx.compose.ui.input.nestedscroll.nestedScroll
34 | import androidx.compose.ui.res.colorResource
35 | import androidx.compose.ui.text.font.Font
36 | import androidx.compose.ui.text.font.FontFamily
37 | import androidx.compose.ui.text.font.FontWeight
38 | import androidx.compose.ui.unit.Dp
39 | import androidx.compose.ui.unit.dp
40 | import androidx.compose.ui.unit.sp
41 | import androidx.navigation.NavHostController
42 | import com.JetpackPractice.twitterui.R
43 | import com.JetpackPractice.twitterui.components.Post
44 | import com.JetpackPractice.twitterui.viewModel.MainViewModel
45 | import com.google.accompanist.pager.ExperimentalPagerApi
46 | import com.google.accompanist.pager.HorizontalPager
47 | import com.google.accompanist.pager.rememberPagerState
48 | import kotlinx.coroutines.launch
49 |
50 | private val tabNames = listOf("For you", "Following")
51 | private val chirpFamily = FontFamily(
52 | Font(R.font.chirp_regular_web, FontWeight.Normal),
53 | Font(R.font.chirp_medium_web, FontWeight.SemiBold),
54 | Font(R.font.chirp_bold_web, FontWeight.Bold),
55 | )
56 |
57 | @OptIn(
58 | ExperimentalMaterial3Api::class, ExperimentalPagerApi::class,
59 | ExperimentalFoundationApi::class
60 | )
61 | @Composable
62 | fun HomeScreen(
63 | universalNavHostController: NavHostController,
64 | viewModel: MainViewModel = MainViewModel(),
65 | nestedScrollConnection: NestedScrollConnection,
66 | topBarHeight: Dp
67 | ) {
68 | val pagerState = rememberPagerState()
69 | val coroutineScope = rememberCoroutineScope()
70 | val posts = viewModel.getHomeScreenPosts()
71 |
72 |
73 | Column(Modifier.fillMaxSize()) {
74 | CenterAlignedTopAppBar(
75 | modifier = Modifier
76 | .height(topBarHeight)
77 | .shadow(1.dp),
78 | title = {
79 | TabRow(
80 | modifier = Modifier.fillMaxWidth(),
81 | selectedTabIndex = pagerState.currentPage,
82 | containerColor = Color.White,
83 | divider = {},
84 | indicator = {
85 | TabIndicator(
86 | tabPosition = it,
87 | index = pagerState.currentPage,
88 | 45
89 | )
90 | }
91 | ) {
92 | tabNames.forEachIndexed { index, nameResource ->
93 | Tab(
94 | selected = index == pagerState.currentPage,
95 | onClick = {
96 | coroutineScope.launch {
97 | pagerState.animateScrollToPage(index)
98 | }
99 | },
100 | text = {
101 | Text(
102 | fontSize = if (index == pagerState.currentPage)
103 | 15.sp
104 | else
105 | 14.sp,
106 | text = nameResource,
107 | fontFamily = chirpFamily,
108 | fontWeight = FontWeight.Bold,
109 | color = if (index == pagerState.currentPage)
110 | Color.Black
111 | else
112 | Color.Gray,
113 | letterSpacing = 0.5.sp
114 | )
115 | }
116 | )
117 | }
118 | }
119 | },
120 | colors = TopAppBarDefaults.mediumTopAppBarColors(
121 | containerColor = Color.White
122 | ),
123 | )
124 | Row(Modifier.fillMaxSize()) {
125 | Box(
126 | Modifier
127 | .fillMaxHeight()
128 | .width(10.dp)
129 | ) {}
130 | CompositionLocalProvider(LocalOverscrollConfiguration provides null) {
131 | HorizontalPager(
132 | modifier = Modifier
133 | .fillMaxSize()
134 | .nestedScroll(nestedScrollConnection),
135 | count = tabNames.size,
136 | state = pagerState,
137 | ) {
138 |
139 | LazyColumn(Modifier.fillMaxSize()) {
140 | items(posts.size) { index ->
141 | Post(
142 | universalNavHostController = universalNavHostController,
143 | post = posts[index],
144 | index = index
145 | )
146 | }
147 | }
148 | }
149 | }
150 | }
151 | }
152 | }
153 |
154 | @Composable
155 | fun TabIndicator(tabPosition: List, index: Int, padding: Int) {
156 | Box(
157 | modifier = Modifier
158 | .tabIndicatorOffset(tabPosition[index])
159 | .height(5.5.dp)
160 | .padding(start = padding.dp, end = padding.dp, bottom = 2.dp)
161 | .clip(RoundedCornerShape(5.dp))
162 | .background(color = colorResource(id = R.color.twitterBlue))
163 | )
164 | }
165 |
166 |
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/screens/InboxScreen.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.screens
2 |
3 | import androidx.compose.foundation.layout.Arrangement
4 | import androidx.compose.foundation.layout.Box
5 | import androidx.compose.foundation.layout.Column
6 | import androidx.compose.foundation.layout.fillMaxSize
7 | import androidx.compose.foundation.layout.padding
8 | import androidx.compose.foundation.shape.RoundedCornerShape
9 | import androidx.compose.material.Text
10 | import androidx.compose.material3.Button
11 | import androidx.compose.material3.ButtonDefaults
12 | import androidx.compose.runtime.Composable
13 | import androidx.compose.ui.Modifier
14 | import androidx.compose.ui.draw.alpha
15 | import androidx.compose.ui.graphics.Color
16 | import androidx.compose.ui.text.font.Font
17 | import androidx.compose.ui.text.font.FontFamily
18 | import androidx.compose.ui.text.font.FontWeight
19 | import androidx.compose.ui.tooling.preview.Preview
20 | import androidx.compose.ui.unit.dp
21 | import androidx.compose.ui.unit.sp
22 | import com.JetpackPractice.twitterui.R
23 | import com.JetpackPractice.twitterui.viewModel.MainViewModel
24 |
25 | private val chirpFamily = FontFamily(
26 | Font(R.font.chirp_regular_web, FontWeight.Normal),
27 | Font(R.font.chirp_medium_web, FontWeight.Medium),
28 | Font(R.font.chirp_bold_web, FontWeight.Bold),
29 | )
30 |
31 | @Preview(showSystemUi = true)
32 | @Composable
33 | fun InboxScreen(viewModel: MainViewModel = MainViewModel()){
34 | Column(verticalArrangement = Arrangement.Center,
35 | modifier = Modifier.fillMaxSize().padding(start = 25.dp, end = 40.dp)) {
36 | Text(modifier = Modifier.padding(bottom = 10.dp),
37 | text = "Welcome to your inbox!",
38 | fontFamily = chirpFamily,
39 | fontWeight = FontWeight.Bold,
40 | fontSize = 30.sp
41 | )
42 | Text(
43 | text = "Drop a line, share posts and more with private conversations between you and others on X.",
44 | fontFamily = chirpFamily,
45 | color = Color.Gray,
46 | fontSize = 16.sp,
47 | )
48 | Button(
49 | onClick = { /*TODO*/ },
50 | modifier = Modifier.padding(top = 20.dp),
51 | colors = ButtonDefaults.outlinedButtonColors(Color.Black),
52 | shape = RoundedCornerShape(20.dp),
53 | ) {
54 | androidx.compose.material3.Text(
55 | text = "Write a message",
56 | fontFamily = chirpFamily,
57 | fontSize = 18.sp,
58 | fontWeight = FontWeight.Bold,
59 | color = Color.White
60 | )
61 | }
62 | }
63 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/screens/NotificationsScreen.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.screens
2 |
3 | import androidx.compose.foundation.ExperimentalFoundationApi
4 | import androidx.compose.foundation.Image
5 | import androidx.compose.foundation.LocalOverscrollConfiguration
6 | import androidx.compose.foundation.background
7 | import androidx.compose.foundation.layout.Arrangement
8 | import androidx.compose.foundation.layout.Column
9 | import androidx.compose.foundation.layout.Row
10 | import androidx.compose.foundation.layout.fillMaxSize
11 | import androidx.compose.foundation.layout.fillMaxWidth
12 | import androidx.compose.foundation.layout.padding
13 | import androidx.compose.foundation.layout.size
14 | import androidx.compose.foundation.rememberScrollState
15 | import androidx.compose.foundation.shape.RoundedCornerShape
16 | import androidx.compose.foundation.verticalScroll
17 | import androidx.compose.material.Divider
18 | import androidx.compose.material.MaterialTheme
19 | import androidx.compose.material.Text
20 | import androidx.compose.material.icons.Icons
21 | import androidx.compose.material.icons.filled.AccountCircle
22 | import androidx.compose.material3.Button
23 | import androidx.compose.material3.ButtonDefaults
24 | import androidx.compose.material3.Icon
25 | import androidx.compose.material3.IconButton
26 | import androidx.compose.material3.Tab
27 | import androidx.compose.material3.TabRow
28 | import androidx.compose.runtime.Composable
29 | import androidx.compose.runtime.CompositionLocalProvider
30 | import androidx.compose.runtime.rememberCoroutineScope
31 | import androidx.compose.ui.Alignment
32 | import androidx.compose.ui.Modifier
33 | import androidx.compose.ui.draw.shadow
34 | import androidx.compose.ui.graphics.Color
35 | import androidx.compose.ui.res.painterResource
36 | import androidx.compose.ui.text.font.Font
37 | import androidx.compose.ui.text.font.FontFamily
38 | import androidx.compose.ui.text.font.FontWeight
39 | import androidx.compose.ui.tooling.preview.Preview
40 | import androidx.compose.ui.unit.Dp
41 | import androidx.compose.ui.unit.dp
42 | import androidx.compose.ui.unit.sp
43 | import com.JetpackPractice.twitterui.R
44 | import com.JetpackPractice.twitterui.viewModel.MainViewModel
45 | import com.google.accompanist.pager.ExperimentalPagerApi
46 | import com.google.accompanist.pager.HorizontalPager
47 | import com.google.accompanist.pager.rememberPagerState
48 | import kotlinx.coroutines.launch
49 |
50 | private val tabNames = listOf("All", "Verified", "Mentions")
51 | private val chirpFamily = FontFamily(
52 | Font(R.font.chirp_regular_web, FontWeight.Normal),
53 | Font(R.font.chirp_medium_web, FontWeight.SemiBold),
54 | Font(R.font.chirp_bold_web, FontWeight.Bold),
55 | )
56 |
57 | @OptIn(ExperimentalPagerApi::class, ExperimentalFoundationApi::class)
58 | //@Preview(showSystemUi = true)
59 | @Composable
60 | fun NotificationsScreen(viewModel: MainViewModel = MainViewModel()) {
61 | val pagerState = rememberPagerState()
62 | val coroutineScope = rememberCoroutineScope()
63 |
64 | Column(
65 | Modifier
66 | .fillMaxSize()
67 | .background(Color.White)) {
68 | TabRow(
69 | modifier = Modifier
70 | .fillMaxWidth()
71 | .shadow(1.dp),
72 | selectedTabIndex = pagerState.currentPage,
73 | containerColor = Color.White,
74 | divider = {},
75 | indicator = { TabIndicator(tabPosition = it, index = pagerState.currentPage, 20) }
76 | ) {
77 | tabNames.forEachIndexed { index, nameResource ->
78 | Tab(
79 | selected = index == pagerState.currentPage,
80 | onClick = {
81 | coroutineScope.launch {
82 | pagerState.animateScrollToPage(index)
83 | }
84 | },
85 | text = {
86 | Text(
87 | fontSize = if (index == pagerState.currentPage)
88 | 16.sp
89 | else
90 | 15.sp,
91 | text = nameResource,
92 | fontFamily = chirpFamily,
93 | fontWeight = FontWeight.SemiBold,
94 | color = if (index == pagerState.currentPage)
95 | Color.Black
96 | else
97 | Color.Gray
98 | )
99 | }
100 | )
101 | }
102 | }
103 |
104 | CompositionLocalProvider(LocalOverscrollConfiguration provides null) {
105 | HorizontalPager(
106 | modifier = Modifier
107 | .fillMaxSize(),
108 | count = tabNames.size,
109 | state = pagerState,
110 | ) {page ->
111 | when(page){
112 | 0-> AllScreen()
113 | 1-> VerifiedScreen()
114 | 2-> MentionsScreen()
115 | }
116 | }
117 | }
118 | }
119 | }
120 |
121 | @Preview(showSystemUi = true)
122 | @Composable
123 | fun AllScreen() {
124 | Column(Modifier.fillMaxSize()) {
125 | Row(
126 | Modifier.padding(start = 25.dp), verticalAlignment = Alignment.CenterVertically
127 | ) {
128 | Image(
129 | modifier = Modifier.size(27.dp),
130 | painter = painterResource(id = R.drawable.sparkle),
131 | contentDescription = ""
132 | )
133 | IconButton(onClick = {}) {
134 | Icon(
135 | Icons.Filled.AccountCircle,
136 | modifier = Modifier.size(Dp(37f)),
137 | tint = Color.LightGray,
138 | contentDescription = "account"
139 | )
140 | }
141 | }
142 | Text(
143 | modifier = Modifier.padding(start = 60.dp),
144 | text = "Recent post from jetpack compose",
145 | fontFamily = chirpFamily,
146 | fontSize = 15.sp,
147 | )
148 | Text(
149 | modifier = Modifier.padding(top = 5.dp, start = 60.dp, end = 20.dp),
150 | text = "how you can integrate jetpack compose " +
151 | "in your projects gradually with xml views and how to apply testing",
152 | fontFamily = chirpFamily,
153 | color = Color.Gray,
154 | fontSize = 15.sp,
155 | )
156 | Divider(Modifier.padding(top = 10.dp),
157 | color = MaterialTheme.colors.onSurface.copy(alpha = .1f))
158 | }
159 | }
160 |
161 | //@Preview(showSystemUi = true)
162 | @Composable
163 | fun VerifiedScreen() {
164 | Column(
165 | verticalArrangement = Arrangement.Center,
166 | modifier = Modifier
167 | .fillMaxSize()
168 | .padding(start = 25.dp, end = 40.dp)
169 | ) {
170 | Text(
171 | modifier = Modifier.padding(bottom = 10.dp),
172 | text = "Nothing to see here --- yet",
173 | fontFamily = chirpFamily,
174 | fontWeight = FontWeight.Bold,
175 | fontSize = 30.sp
176 | )
177 | Text(
178 | text = "Likes, mentions, reposts, and a while lot more, when it comes from a " +
179 | "verified account, you'll find it here. \n \n Not verified? " +
180 | "Subscribe now to get a verified account and join other people in quality" +
181 | " conversations.",
182 | fontFamily = chirpFamily,
183 | color = Color.Gray,
184 | fontSize = 16.sp,
185 | )
186 | Button(
187 | onClick = { /*TODO*/ },
188 | modifier = Modifier
189 | .padding(top = 20.dp)
190 | .align(Alignment.CenterHorizontally),
191 | colors = ButtonDefaults.outlinedButtonColors(Color.Black),
192 | shape = RoundedCornerShape(20.dp),
193 | ) {
194 | Text(
195 | modifier = Modifier.padding(horizontal = 30.dp),
196 | text = "Subscribe",
197 | fontFamily = chirpFamily,
198 | fontSize = 18.sp,
199 | fontWeight = FontWeight.Bold,
200 | color = Color.White
201 | )
202 | }
203 |
204 | Text(
205 | modifier = Modifier
206 | .align(Alignment.CenterHorizontally)
207 | .padding(top = 10.dp),
208 | text = "IDR 165,000/month",
209 | fontFamily = chirpFamily,
210 | fontSize = 18.sp,
211 | fontWeight = FontWeight.Bold,
212 | color = Color.Black
213 | )
214 | }
215 | }
216 |
217 | //@Preview(showSystemUi = true)
218 | @Composable
219 | fun MentionsScreen(){
220 | Column(verticalArrangement = Arrangement.Center,
221 | modifier = Modifier
222 | .fillMaxSize()
223 | .padding(start = 25.dp, end = 40.dp)) {
224 | Text(modifier = Modifier.padding(bottom = 10.dp),
225 | text = "Join the conversation",
226 | fontFamily = chirpFamily,
227 | fontWeight = FontWeight.Bold,
228 | fontSize = 30.sp
229 | )
230 | Text(
231 | text = "When someone on X mentions you in a post or reply, you'll find it here.",
232 | fontFamily = chirpFamily,
233 | color = Color.Gray,
234 | fontSize = 16.sp,
235 | )
236 | }
237 | }
238 |
239 |
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/screens/SearchScreen.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.screens
2 |
3 | import androidx.compose.foundation.Image
4 | import androidx.compose.foundation.layout.Arrangement
5 | import androidx.compose.foundation.layout.Column
6 | import androidx.compose.foundation.layout.Row
7 | import androidx.compose.foundation.layout.fillMaxSize
8 | import androidx.compose.foundation.layout.padding
9 | import androidx.compose.foundation.rememberScrollState
10 | import androidx.compose.foundation.verticalScroll
11 | import androidx.compose.material.Divider
12 | import androidx.compose.material.MaterialTheme
13 | import androidx.compose.material.Text
14 | import androidx.compose.runtime.Composable
15 | import androidx.compose.ui.Alignment
16 | import androidx.compose.ui.Modifier
17 | import androidx.compose.ui.graphics.Color
18 | import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
19 | import androidx.compose.ui.input.nestedscroll.nestedScroll
20 | import androidx.compose.ui.res.colorResource
21 | import androidx.compose.ui.res.painterResource
22 | import androidx.compose.ui.text.font.Font
23 | import androidx.compose.ui.text.font.FontFamily
24 | import androidx.compose.ui.text.font.FontWeight
25 | import androidx.compose.ui.tooling.preview.Preview
26 | import androidx.compose.ui.unit.dp
27 | import androidx.compose.ui.unit.sp
28 | import com.JetpackPractice.twitterui.R
29 | import com.JetpackPractice.twitterui.components.Post
30 | import com.JetpackPractice.twitterui.domain.model.PostModel
31 | import com.JetpackPractice.twitterui.viewModel.MainViewModel
32 |
33 | private val chirpFamily = FontFamily(
34 | Font(R.font.chirp_regular_web, FontWeight.Normal),
35 | Font(R.font.chirp_medium_web, FontWeight.Medium),
36 | Font(R.font.chirp_bold_web, FontWeight.Bold),
37 | )
38 |
39 | private val trendsItemList = listOf(
40 | TrendsItemData("Business & finance", "musk", "290K"),
41 | TrendsItemData("Fitness", "Fight IQ", "322K"),
42 | TrendsItemData("Sports", "Jordan", "99K"),
43 | TrendsItemData("Politics", "The AEC", "10.3K"),
44 | TrendsItemData("Technology", "Jetpack Compose", "290K")
45 | )
46 |
47 | @Composable
48 | fun SearchScreen(viewModel: MainViewModel = MainViewModel(),
49 | nestedScrollConnection: NestedScrollConnection,
50 | ){
51 | Column(
52 | Modifier
53 | .fillMaxSize()
54 | .verticalScroll(rememberScrollState())
55 | .nestedScroll(nestedScrollConnection)
56 | ) {
57 | Text(modifier = Modifier.padding(start = 15.dp, top = 10.dp),
58 | text = "Trends for you",
59 | fontFamily = chirpFamily,
60 | fontWeight = FontWeight.Bold,
61 | fontSize = 18.sp
62 | )
63 | for(item in trendsItemList){
64 | trendsItem(trendsItemData = item)
65 | }
66 | Text(modifier = Modifier.padding(start = 15.dp, top = 25.dp, bottom = 18.dp),
67 | text = "Show more",
68 | fontFamily = chirpFamily,
69 | fontWeight = FontWeight.Normal,
70 | fontSize = 18.sp,
71 | color = colorResource(id = R.color.twitterBlue)
72 | )
73 | Divider(
74 | color = MaterialTheme.colors.onSurface.copy(alpha = .1f)
75 | )
76 | for(item in viewModel.getSearchScreenPosts()) {
77 | TrendsPostsItem(type = item.topicName, posts = item.posts)
78 | }
79 | }
80 | }
81 |
82 | @Composable
83 | fun trendsItem(trendsItemData: TrendsItemData){
84 | Column(modifier = Modifier.padding(top = 20.dp, start = 15.dp),
85 | verticalArrangement = Arrangement.spacedBy(5.dp)) {
86 | Text(text = trendsItemData.trendType + " . Trending",
87 | fontFamily = chirpFamily,
88 | fontWeight = FontWeight.Bold,
89 | fontSize = 14.sp,
90 | color = Color.Gray)
91 | Text(text = trendsItemData.trend,
92 | fontFamily = chirpFamily,
93 | fontWeight = FontWeight.Bold,
94 | fontSize = 15.sp
95 | )
96 | Text(text = trendsItemData.numOfPosts + " posts",
97 | fontFamily = chirpFamily,
98 | fontWeight = FontWeight.Normal,
99 | fontSize = 14.sp,
100 | color = Color.Gray)
101 | }
102 | }
103 |
104 | @Composable
105 | fun TrendsPostsItem(type : String = "Technology", posts: List){
106 | Column(Modifier.padding(start = 10.dp, top = 10.dp)) {
107 | Row(verticalAlignment = Alignment.CenterVertically,
108 | modifier = Modifier.padding(bottom = 10.dp)){
109 | Image(painter = painterResource(id = R.drawable.trends_icon)
110 | , contentDescription = "",
111 | )
112 |
113 | Text(modifier = Modifier.padding(start = 15.dp),
114 | text = type,
115 | fontFamily = chirpFamily,
116 | fontWeight = FontWeight.Bold,
117 | fontSize = 18.sp
118 | )
119 | }
120 | for(post in posts)
121 | Post(universalNavHostController = null, post = post);
122 |
123 | Text(modifier = Modifier.padding(start = 15.dp, top = 5.dp, bottom = 10.dp),
124 | text = "Show more",
125 | fontFamily = chirpFamily,
126 | fontWeight = FontWeight.Normal,
127 | fontSize = 16.sp,
128 | color = colorResource(id = R.color.twitterBlue)
129 | )
130 | Divider(
131 | color = MaterialTheme.colors.onSurface.copy(alpha = .1f)
132 | )
133 | }
134 | }
135 |
136 | data class TrendsItemData(
137 | val trendType : String,
138 | val trend : String,
139 | val numOfPosts: String
140 | )
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/ui/theme/Color.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.ui.theme
2 |
3 | import androidx.compose.ui.graphics.Color
4 |
5 | val Purple80 = Color(0xFFFFFFFF)
6 | val PurpleGrey80 = Color(0xFFCCC2DC)
7 | val Pink80 = Color(0xFFEFB8C8)
8 |
9 | val Purple40 = Color(0xFFFFFFFF)
10 | val PurpleGrey40 = Color(0xFF625b71)
11 | val Pink40 = Color(0xFF7D5260)
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/ui/theme/Theme.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.ui.theme
2 |
3 | import android.app.Activity
4 | import android.os.Build
5 | import androidx.compose.foundation.isSystemInDarkTheme
6 | import androidx.compose.material3.MaterialTheme
7 | import androidx.compose.material3.darkColorScheme
8 | import androidx.compose.material3.dynamicDarkColorScheme
9 | import androidx.compose.material3.dynamicLightColorScheme
10 | import androidx.compose.material3.lightColorScheme
11 | import androidx.compose.runtime.Composable
12 | import androidx.compose.runtime.SideEffect
13 | import androidx.compose.ui.graphics.toArgb
14 | import androidx.compose.ui.platform.LocalContext
15 | import androidx.compose.ui.platform.LocalView
16 | import androidx.core.view.WindowCompat
17 |
18 | private val DarkColorScheme = darkColorScheme(
19 | primary = Purple80,
20 | secondary = PurpleGrey80,
21 | tertiary = Pink80
22 | )
23 |
24 | private val LightColorScheme = lightColorScheme(
25 | primary = Purple40,
26 | secondary = PurpleGrey40,
27 | tertiary = Pink40
28 |
29 | /* Other default colors to override
30 | background = Color(0xFFFFFBFE),
31 | surface = Color(0xFFFFFBFE),
32 | onPrimary = Color.White,
33 | onSecondary = Color.White,
34 | onTertiary = Color.White,
35 | onBackground = Color(0xFF1C1B1F),
36 | onSurface = Color(0xFF1C1B1F),
37 | */
38 | )
39 |
40 | @Composable
41 | fun TwitterUITheme(
42 | darkTheme: Boolean = isSystemInDarkTheme(),
43 | // Dynamic color is available on Android 12+
44 | dynamicColor: Boolean = true,
45 | content: @Composable () -> Unit
46 | ) {
47 | val colorScheme = when {
48 | dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
49 | val context = LocalContext.current
50 | if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
51 | }
52 |
53 | darkTheme -> DarkColorScheme
54 | else -> LightColorScheme
55 | }
56 | val view = LocalView.current
57 | if (!view.isInEditMode) {
58 | SideEffect {
59 | val window = (view.context as Activity).window
60 | window.statusBarColor = colorScheme.primary.toArgb()
61 | WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
62 | }
63 | }
64 |
65 | MaterialTheme(
66 | colorScheme = colorScheme,
67 | typography = Typography,
68 | content = content
69 | )
70 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/ui/theme/Type.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.ui.theme
2 |
3 | import androidx.compose.material3.Typography
4 | import androidx.compose.ui.text.TextStyle
5 | import androidx.compose.ui.text.font.FontFamily
6 | import androidx.compose.ui.text.font.FontWeight
7 | import androidx.compose.ui.unit.sp
8 |
9 | // Set of Material typography styles to start with
10 | val Typography = Typography(
11 | bodyLarge = TextStyle(
12 | fontFamily = FontFamily.Default,
13 | fontWeight = FontWeight.Normal,
14 | fontSize = 16.sp,
15 | lineHeight = 24.sp,
16 | letterSpacing = 0.5.sp
17 | )
18 | /* Other default text styles to override
19 | titleLarge = TextStyle(
20 | fontFamily = FontFamily.Default,
21 | fontWeight = FontWeight.Normal,
22 | fontSize = 22.sp,
23 | lineHeight = 28.sp,
24 | letterSpacing = 0.sp
25 | ),
26 | labelSmall = TextStyle(
27 | fontFamily = FontFamily.Default,
28 | fontWeight = FontWeight.Medium,
29 | fontSize = 11.sp,
30 | lineHeight = 16.sp,
31 | letterSpacing = 0.5.sp
32 | )
33 | */
34 | )
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/utils/NestedScrollConnection.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.utils
2 |
3 | import androidx.compose.ui.geometry.Offset
4 | import androidx.compose.ui.input.nestedscroll.NestedScrollSource
5 |
6 | class NestedScrollConnectionEnterAlways (var collapsingTopHeight : Float, var offset: Float){
7 |
8 |
9 | fun calculateOffset(delta: Float): Offset {
10 | val oldOffset = offset
11 | val newOffset = (oldOffset + delta).coerceIn(-collapsingTopHeight, 0f)
12 | offset = newOffset
13 | return Offset(0f, newOffset - oldOffset)
14 | }
15 |
16 | fun onPreScroll(available: Offset, source: NestedScrollSource): Offset =
17 | when {
18 | available.y >= 0 -> calculateOffset(available.y)
19 | offset == -collapsingTopHeight -> Offset.Zero
20 | else -> calculateOffset(available.y)
21 | }
22 | fun onPostScroll(consumed: Offset, available: Offset, source: NestedScrollSource,
23 | ): Offset =
24 | when {
25 | available.y <= 0 -> calculateOffset(available.y)
26 | offset == 0f -> Offset.Zero
27 | else -> calculateOffset(available.y)
28 | }
29 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/viewModel/MainViewModel.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.viewModel
2 |
3 | import androidx.lifecycle.ViewModel
4 | import com.JetpackPractice.twitterui.R
5 | import com.JetpackPractice.twitterui.domain.model.AccountModel
6 | import com.JetpackPractice.twitterui.domain.model.PostModel
7 |
8 | class MainViewModel : ViewModel() {
9 | private val homeScreenPosts: List = listOf(
10 | PostModel(
11 | "Sergeevme",
12 | "@sergeevme",
13 | "15h",
14 | R.drawable.home_post_profile_pic_01,
15 | "That's a good article to read \uD83D\uDCD6\n" +
16 | "\n" +
17 | "Shimmer & Shadow Loading Effect Animation with Jetpack Compose\n",
18 | R.drawable.home_post_pic_1,
19 | 2,
20 | 1,
21 | 4,
22 | 50,
23 | false,
24 | true,
25 | true
26 | ), PostModel(
27 | "Google Play business community",
28 | "@GooglePlayBiz",
29 | "16h",
30 | R.drawable.home_post_profile_pic_02,
31 | "We’ve released a major update to our Play Store Listing Certificate course to boost user acquisition and store conversions!→ https://goo.gle/3EuSS8s\n" +
32 | "\n" +
33 | "\uD83D\uDCDATake the training and watch the new video series\n" +
34 | "\uD83D\uDCDDPass the exam, get certified\n" +
35 | "\uD83E\uDDEAUse custom store listings and experiments",
36 | R.drawable.home_post_pic_2,
37 | 45,
38 | 1,
39 | 10,
40 | 29003,
41 | true,
42 | true,
43 | true
44 | ), PostModel(
45 | "Android Developers",
46 | "@AndroidDev",
47 | "Oct 5",
48 | R.drawable.home_post_profile_pic_04,
49 | "Wear OS 4 brings new user experiences to more devices. Discover key behavior changes and learn how to interact with new features:\n" +
50 | "\n" +
51 | "⌚ Background body sensor permission\n" +
52 | "⌚ More seamless data transfer\n" +
53 | "⌚ New Wear OS 4 emulator",
54 | R.drawable.home_post_pic_04,
55 | 89,
56 | 10,
57 | 16,
58 | 21000,
59 | true,
60 | true,
61 | true
62 | ), PostModel(
63 | "Sergeevme",
64 | "@sergeevme",
65 | "45mn",
66 | R.drawable.home_post_profile_pic_01,
67 | "Don’t Reinvent The Wheel (2023)\uD83D\uDCF1\n" +
68 | "\uD83D\uDC49 Use Glide or Koin for image loading\n" +
69 | "\uD83D\uDC49 Use Retrofit for networking\n" +
70 | "\uD83D\uDC49 Use Gson or Kotlin Serialization for JSON parsing\n" +
71 | "\uD83D\uDC49 Use View Binding and Data Binding",
72 | -1,
73 | 2,
74 | 0,
75 | 0,
76 | 20,
77 | false,
78 | true,
79 | false
80 | ), PostModel(
81 | "Daniel Atitienei",
82 | "@danielatitienei",
83 | "Oct 9",
84 | R.drawable.home_post_profile_pic_03,
85 | "Hey #AndroidDev, did you know how easy is to integrate the floating action button in the material3 bottom bar?\n",
86 | R.drawable.home_post_pic_03,
87 | 15,
88 | 2,
89 | 10,
90 | 29003,
91 | true,
92 | true,
93 | true
94 | ), PostModel(
95 | "Kotlin by JetBrains",
96 | "@kotlin",
97 | "Oct 4",
98 | R.drawable.home_post_profile_pic_05,
99 | "Day 2 at \n" +
100 | "@devoxx\n" +
101 | " Belgium!\n" +
102 | "\n" +
103 | "Stop by our booth to chat about your experience, see Kotlin Notebook in action, learn about Kotlin Multiplatform, and more.",
104 | R.drawable.home_post_pic_05,
105 | 15,
106 | 2,
107 | 3,
108 | 9370,
109 | true,
110 | true,
111 | true
112 | )
113 | )
114 | private val accountsData: List = listOf(
115 | AccountModel.DEFAULT_ACCOUNT,
116 | AccountModel(
117 | "Google Play business community",
118 | "@GooglePlayBiz",
119 | "Best practices, insights and news to grow your app or game. This is an official Google Play channel.",
120 | R.drawable.home_post_profile_pic_02,
121 | R.drawable.cover_pic_01,
122 | R.drawable.cover_pic_blurred_01,
123 | "April 2017",
124 | "The Google Play Store",
125 | "315",
126 | "106.8k",
127 | listOf(
128 | PostModel(
129 | "Google Play business community",
130 | "@GooglePlayBiz",
131 | "16h",
132 | R.drawable.home_post_profile_pic_02,
133 | "We’ve released a major update to our Play Store Listing Certificate course to boost user acquisition and store conversions!→ https://goo.gle/3EuSS8s\n" +
134 | "\n" +
135 | "\uD83D\uDCDATake the training and watch the new video series\n" +
136 | "\uD83D\uDCDDPass the exam, get certified\n" +
137 | "\uD83E\uDDEAUse custom store listings and experiments",
138 | R.drawable.home_post_pic_2,
139 | 45,
140 | 1,
141 | 10,
142 | 29003,
143 | true,
144 | true,
145 | true
146 | ),
147 | PostModel(
148 | "Google Play business community",
149 | "@GooglePlayBiz",
150 | "16h",
151 | R.drawable.home_post_profile_pic_02,
152 | "POV: you’re a #developer who needs help monetizing your app and just heard about the new and improved Play Commerce website → https://goo.gle/playcommerce",
153 | R.drawable.inner_post_01,
154 | 6,
155 | 3,
156 | 2,
157 | 1603,
158 | true,
159 | true,
160 | true
161 | ),
162 | PostModel(
163 | "Google Play business community",
164 | "@GooglePlayBiz",
165 | "16h",
166 | R.drawable.home_post_profile_pic_02,
167 | "POV: you’re a #developer who needs help monetizing your app and just heard about the new and improved Play Commerce website → https://goo.gle/playcommerce",
168 | R.drawable.inner_post_02,
169 | 6,
170 | 3,
171 | 2,
172 | 1603,
173 | true,
174 | true,
175 | true
176 | )
177 | )
178 | ),
179 | AccountModel(
180 | "Android Developers",
181 | "@AndroidDev",
182 | "Get the latest Android news, best practices, live videos, demonstrations, tutorials, and more!",
183 | R.drawable.home_post_profile_pic_04,
184 | R.drawable.dummy_cover_pic,
185 | R.drawable.dummy_cover_pic_blurred,
186 | "November 2009",
187 | "Mountain View, CA",
188 | "386",
189 | "2.2M",
190 | listOf(
191 | PostModel(
192 | "Android Developers",
193 | "@AndroidDev",
194 | "Oct 5",
195 | R.drawable.home_post_profile_pic_04,
196 | "Wear OS 4 brings new user experiences to more devices. Discover key behavior changes and learn how to interact with new features:\n" +
197 | "\n" +
198 | "⌚ Background body sensor permission\n" +
199 | "⌚ More seamless data transfer\n" +
200 | "⌚ New Wear OS 4 emulator",
201 | R.drawable.home_post_pic_04,
202 | 89,
203 | 10,
204 | 16,
205 | 21000,
206 | true,
207 | true,
208 | true
209 | ),
210 | PostModel(
211 | "Android Developers",
212 | "@AndroidDev",
213 | "Oct 5",
214 | R.drawable.home_post_profile_pic_04,
215 | "Wear OS 4 brings new user experiences to more devices. Discover key behavior changes and learn how to interact with new features:\n" +
216 | "\n" +
217 | "⌚ Background body sensor permission\n" +
218 | "⌚ More seamless data transfer\n" +
219 | "⌚ New Wear OS 4 emulator",
220 | R.drawable.inner_post_03,
221 | 134,
222 | 27,
223 | 16,
224 | 31000,
225 | true,
226 | true,
227 | true
228 | )
229 | )
230 | ),
231 | AccountModel.DEFAULT_ACCOUNT,
232 | AccountModel.DEFAULT_ACCOUNT
233 | )
234 | private val searchScreenPosts: List = listOf(
235 | MainTopic("Technology",
236 | listOf(
237 | PostModel(
238 | "Kotlin by JetBrains",
239 | "@kotlin",
240 | "Oct 4",
241 | R.drawable.home_post_profile_pic_05,
242 | "Day 2 at \n" +
243 | "@devoxx\n" +
244 | " Belgium!\n" +
245 | "\n" +
246 | "Stop by our booth to chat about your experience, see Kotlin Notebook in action, learn about Kotlin Multiplatform, and more.",
247 | R.drawable.home_post_pic_05,
248 | 15,
249 | 2,
250 | 3,
251 | 9370,
252 | true,
253 | true,
254 | true
255 | ),
256 | PostModel(
257 | "Daniel Atitienei",
258 | "@danielatitienei",
259 | "Oct 9",
260 | R.drawable.home_post_profile_pic_03,
261 | "Hey #AndroidDev, did you know how easy is to integrate the floating action button in the material3 bottom bar?\n",
262 | R.drawable.home_post_pic_03,
263 | 15,
264 | 2,
265 | 10,
266 | 29003,
267 | true,
268 | true,
269 | true
270 | ),
271 | PostModel(
272 | "Sergeevme",
273 | "@sergeevme",
274 | "45mn",
275 | R.drawable.home_post_profile_pic_01,
276 | "Don’t Reinvent The Wheel (2023)\uD83D\uDCF1\n" +
277 | "\uD83D\uDC49 Use Glide or Koin for image loading\n" +
278 | "\uD83D\uDC49 Use Retrofit for networking\n" +
279 | "\uD83D\uDC49 Use Gson or Kotlin Serialization for JSON parsing\n" +
280 | "\uD83D\uDC49 Use View Binding and Data Binding",
281 | -1,
282 | 2,
283 | 0,
284 | 0,
285 | 20,
286 | false,
287 | true,
288 | false
289 | )
290 | )
291 | )
292 | )
293 | private val myAccountData: AccountModel = AccountModel(
294 | "mahfoudh aggoun",
295 | "@Mahfoudh_Aggn",
296 | "",
297 | R.drawable.default_profile_pic,
298 | R.drawable.my_profile_cover,
299 | R.drawable.my_profile_cover,
300 | "December 2014",
301 | "Algeria",
302 | "386",
303 | "5",
304 | null
305 | )
306 |
307 |
308 |
309 | fun getHomeScreenPosts(): List {
310 | return homeScreenPosts
311 | }
312 |
313 | fun getAccountData(index: Int): AccountModel {
314 | return accountsData[index]
315 | }
316 |
317 | fun getSearchScreenPosts() : List {
318 | return searchScreenPosts
319 | }
320 |
321 | data class MainTopic(
322 | val topicName : String ,
323 | val posts : List
324 | )
325 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/JetpackPractice/twitterui/viewModel/MainViewModelFactory.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui.viewModel
2 |
3 | import android.os.Bundle
4 | import androidx.lifecycle.AbstractSavedStateViewModelFactory
5 | import androidx.lifecycle.SavedStateHandle
6 | import androidx.lifecycle.ViewModel
7 | import androidx.savedstate.SavedStateRegistryOwner
8 |
9 | class MainViewModelFactory (
10 | owner: SavedStateRegistryOwner,
11 | private val defaultArgs: Bundle? = null
12 | ) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
13 | override fun create(
14 | key: String,
15 | modelClass: Class,
16 | handle: SavedStateHandle
17 | ): T {
18 | return MainViewModel() as T
19 | }
20 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
15 |
18 |
21 |
22 |
23 |
24 |
30 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/account_multiple_outline.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/account_outline.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/add.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/arrow_back_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/baseline_chevron_left_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/black_image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/black_image.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/bookmark_outline.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/calendar_month_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/cash_multiple.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/cog_outline.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/comments_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/comments_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/communities_icon.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/communities_icon.PNG
--------------------------------------------------------------------------------
/app/src/main/res/drawable/communities_icon_selected.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/communities_icon_selected.PNG
--------------------------------------------------------------------------------
/app/src/main/res/drawable/cover_pic_01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/cover_pic_01.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/cover_pic_blurred_01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/cover_pic_blurred_01.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/default_profile_pic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/default_profile_pic.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/dots_vertical_circle_outline.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/dummy_cover_pic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/dummy_cover_pic.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/dummy_cover_pic_blurred.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/dummy_cover_pic_blurred.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_post_pic_03.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/home_post_pic_03.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_post_pic_04.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/home_post_pic_04.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_post_pic_05.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/home_post_pic_05.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_post_pic_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/home_post_pic_1.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_post_pic_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/home_post_pic_2.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_post_profile_pic_01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/home_post_profile_pic_01.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_post_profile_pic_02.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/home_post_profile_pic_02.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_post_profile_pic_03.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/home_post_profile_pic_03.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_post_profile_pic_04.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/home_post_profile_pic_04.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_post_profile_pic_05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/home_post_profile_pic_05.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_home.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_home_selected.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_messages.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_messages_selected.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_notifications.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_notifications_selected.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_search.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_search_selected.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/img.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/img_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/img_1.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/img_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/img_2.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/img_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/img_3.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/img_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/img_4.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/img_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/img_5.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/inner_post_01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/inner_post_01.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/inner_post_02.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/inner_post_02.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/inner_post_03.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/inner_post_03.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/likes_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/likes_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/list_box_outline.xml:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/location_on_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/logo.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/logo_white_tint.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/microphone_outline.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/my_profile_cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/my_profile_cover.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/question_mark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/question_mark.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/retweet_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/retweet_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/share_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/share_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/sparkle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/sparkle.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/splash_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/sun.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/sun.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/three_dots.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/three_dots.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/three_dots_white_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/trends_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/trends_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/twitter_x_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/twitter_x_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/verified_badge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/verified_badge.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/views_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/drawable/views_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/font/chirp_bold_web.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/font/chirp_bold_web.ttf
--------------------------------------------------------------------------------
/app/src/main/res/font/chirp_medium_web.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/font/chirp_medium_web.ttf
--------------------------------------------------------------------------------
/app/src/main/res/font/chirp_regular_web.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/font/chirp_regular_web.ttf
--------------------------------------------------------------------------------
/app/src/main/res/font/worksans_bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/font/worksans_bold.ttf
--------------------------------------------------------------------------------
/app/src/main/res/font/worksans_light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/font/worksans_light.ttf
--------------------------------------------------------------------------------
/app/src/main/res/font/worksans_medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/font/worksans_medium.ttf
--------------------------------------------------------------------------------
/app/src/main/res/font/worksans_regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/font/worksans_regular.ttf
--------------------------------------------------------------------------------
/app/src/main/res/font/worksans_semibold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/font/worksans_semibold.ttf
--------------------------------------------------------------------------------
/app/src/main/res/inner_post_pic_03/F68z2irWQAApcO8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/inner_post_pic_03/F68z2irWQAApcO8.jpg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mahfoudh-Aggoun/Twitter-UI-clone-jetpack-compose-/fb77e8799c8e7c358e9515d981be0bdf2b90e85c/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 | #fff2f2f2
11 | #55000000
12 | #FF26a7de
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values/splash.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | TwitterUI
3 |
--------------------------------------------------------------------------------
/app/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/backup_rules.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/data_extraction_rules.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/app/src/test/java/com/JetpackPractice/twitterui/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.JetpackPractice.twitterui
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
--------------------------------------------------------------------------------
/local.properties:
--------------------------------------------------------------------------------
1 | ## This file is automatically generated by Android Studio.
2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
3 | #
4 | # This file should *NOT* be checked into Version Control Systems,
5 | # as it contains information specific to your local configuration.
6 | #
7 | # Location of the SDK. This is only used by Gradle.
8 | # For customization when using a Version Control System, please read the
9 | # header note.
10 | sdk.dir=C\:\\Users\\LENOVO Z50\\AppData\\Local\\Android\\Sdk
--------------------------------------------------------------------------------