├── .gitignore ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── co │ │ └── eventbox │ │ └── event │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── graphql │ │ └── com │ │ │ └── apollographql │ │ │ └── apollo │ │ │ └── co │ │ │ └── eventbox │ │ │ └── event │ │ │ ├── AboutOrganizer.graphql │ │ │ ├── DashboardCache.graphql │ │ │ ├── GetAlbumPhotos.graphql │ │ │ ├── Sponsors.graphql │ │ │ ├── TalkDetails.graphql │ │ │ └── schema.json │ ├── java │ │ └── co │ │ │ └── eventbox │ │ │ └── event │ │ │ ├── App.kt │ │ │ ├── Config.kt │ │ │ ├── di │ │ │ └── ViewModelModoule.kt │ │ │ ├── listener │ │ │ ├── ListOnClickListener.kt │ │ │ ├── NewsOnClickListener.kt │ │ │ └── PhotoOnClickListener.kt │ │ │ ├── model │ │ │ ├── LinkType.kt │ │ │ ├── Talks.kt │ │ │ └── User.kt │ │ │ ├── network │ │ │ ├── APIs.kt │ │ │ ├── ApolloClientProvider.kt │ │ │ ├── Either.kt │ │ │ ├── OAuthInterceptor.kt │ │ │ ├── OkHttpClientProvider.kt │ │ │ └── XException.kt │ │ │ ├── respository │ │ │ ├── AboutRepository.kt │ │ │ ├── CacheDataRepository.kt │ │ │ ├── GalleryRepository.kt │ │ │ ├── HomeRepository.kt │ │ │ ├── PhotosGalleryRepository.kt │ │ │ ├── Repository.kt │ │ │ ├── SpeakersDetailsRepository.kt │ │ │ ├── SpeakersRepository.kt │ │ │ ├── SponsorsRepository.kt │ │ │ └── TimeScheduleRepository.kt │ │ │ ├── utilities │ │ │ ├── Constants.kt │ │ │ ├── CustomTabView.kt │ │ │ ├── DateConverter.kt │ │ │ ├── FileExtension.kt │ │ │ ├── ImageExtension.kt │ │ │ ├── ModelExtension.kt │ │ │ ├── NavigationExtensions.kt │ │ │ ├── NumberExtension.kt │ │ │ ├── StringExtension.kt │ │ │ └── ViewExtension.kt │ │ │ ├── view │ │ │ ├── AdapterRecyclerView.kt │ │ │ ├── about │ │ │ │ ├── AboutAdapter.kt │ │ │ │ └── AboutUsActivity.kt │ │ │ ├── activities │ │ │ │ ├── BaseActivity.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ └── SplashActivity.kt │ │ │ ├── gallery │ │ │ │ ├── AlbumsAdapter.kt │ │ │ │ ├── AlbumsFragment.kt │ │ │ │ ├── GalleryAdapter.kt │ │ │ │ ├── GalleryFragment.kt │ │ │ │ └── PhotoLargeFragment.kt │ │ │ ├── home │ │ │ │ ├── ContainerHomeFragment.kt │ │ │ │ ├── HomeFragment.kt │ │ │ │ ├── HomeViewPagerAdapter.kt │ │ │ │ ├── speakers │ │ │ │ │ ├── MainEventSpeakersFragment.kt │ │ │ │ │ ├── MainSpeakerAdapter.kt │ │ │ │ │ └── MainSpeakersDetailsFragment.kt │ │ │ │ ├── sponsors │ │ │ │ │ ├── SponsorAdapter.kt │ │ │ │ │ ├── SponsorParentAdapter.kt │ │ │ │ │ └── SponsorsFragment.kt │ │ │ │ └── timeSchedule │ │ │ │ │ ├── TimeScheduleDayAdapter.kt │ │ │ │ │ ├── TimeScheduleFragment.kt │ │ │ │ │ ├── TimeScheduleSectionAdapter.kt │ │ │ │ │ └── TimeScheduleSessionAdapter.kt │ │ │ ├── news │ │ │ │ ├── NewsAdapter.kt │ │ │ │ └── NewsFragment.kt │ │ │ ├── newtworking │ │ │ │ ├── NetworkingFragment.kt │ │ │ │ ├── auth │ │ │ │ │ ├── RegisterFragment.kt │ │ │ │ │ └── VerifyFragment.kt │ │ │ │ ├── chat │ │ │ │ │ └── ChatListFragment.kt │ │ │ │ └── profile │ │ │ │ │ ├── EditProfileFragment.kt │ │ │ │ │ └── ProfileFragment.kt │ │ │ └── speakers │ │ │ │ ├── SpeakerAdapter.kt │ │ │ │ ├── SpeakerParentAdapter.kt │ │ │ │ ├── SpeakerRelatedAdapter.kt │ │ │ │ ├── SpeakersDetailsFragment.kt │ │ │ │ └── SpeakersFragment.kt │ │ │ └── viewModel │ │ │ ├── AboutViewModel.kt │ │ │ ├── BaseViewModel.kt │ │ │ ├── GalleryViewModel.kt │ │ │ ├── HomeViewModel.kt │ │ │ ├── NewsViewModel.kt │ │ │ ├── PhotosViewModel.kt │ │ │ ├── ProfileViewModel.kt │ │ │ ├── SpeakersViewModel.kt │ │ │ ├── SplashViewModel.kt │ │ │ ├── SponsorsViewModel.kt │ │ │ └── TimeScheduleViewModel.kt │ └── res │ │ ├── drawable-hdpi │ │ ├── ic_gallery.png │ │ ├── ic_home.png │ │ ├── ic_networking.png │ │ ├── ic_news.png │ │ ├── ic_profile.png │ │ └── ic_speakers.png │ │ ├── drawable-ldpi │ │ ├── ic_gallery.png │ │ ├── ic_home.png │ │ ├── ic_networking.png │ │ ├── ic_news.png │ │ ├── ic_profile.png │ │ └── ic_speakers.png │ │ ├── drawable-mdpi │ │ ├── ic_gallery.png │ │ ├── ic_home.png │ │ ├── ic_networking.png │ │ ├── ic_news.png │ │ ├── ic_profile.png │ │ └── ic_speakers.png │ │ ├── drawable-v24 │ │ ├── ic_launcher_foreground.xml │ │ └── ic_tedxtehran.png │ │ ├── drawable-xhdpi │ │ ├── ic_gallery.png │ │ ├── ic_home.png │ │ ├── ic_networking.png │ │ ├── ic_news.png │ │ ├── ic_profile.png │ │ └── ic_speakers.png │ │ ├── drawable-xxhdpi │ │ ├── ic_gallery.png │ │ ├── ic_home.png │ │ ├── ic_networking.png │ │ ├── ic_news.png │ │ ├── ic_profile.png │ │ └── ic_speakers.png │ │ ├── drawable-xxxhdpi │ │ ├── ic_gallery.png │ │ ├── ic_home.png │ │ ├── ic_networking.png │ │ ├── ic_news.png │ │ ├── ic_profile.png │ │ └── ic_speakers.png │ │ ├── drawable │ │ ├── bottom_sheet_bg.xml │ │ ├── circle_activity.xml │ │ ├── circle_generic.xml │ │ ├── circle_intertaiment.xml │ │ ├── circle_performance.xml │ │ ├── circle_talk.xml │ │ ├── dark_shadow_cover.xml │ │ ├── favorites_chip.xml │ │ ├── ic_account_circle_black.xml │ │ ├── ic_baseline_access_time_24.xml │ │ ├── ic_baseline_directions_24.xml │ │ ├── ic_baseline_home.xml │ │ ├── ic_baseline_info.xml │ │ ├── ic_baseline_insert_link.xml │ │ ├── ic_baseline_keyboard_arrow_left_24.xml │ │ ├── ic_baseline_library_books.xml │ │ ├── ic_baseline_live_tv.xml │ │ ├── ic_baseline_location_on_24.xml │ │ ├── ic_baseline_photo_library.xml │ │ ├── ic_baseline_play_circle_outline.xml │ │ ├── ic_baseline_video_library.xml │ │ ├── ic_calling.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_message.xml │ │ ├── ic_phone.xml │ │ ├── ic_qr.xml │ │ ├── ic_ticket.xml │ │ ├── indicator_bottom_sheet.xml │ │ ├── placeholder.png │ │ ├── placeholdertransparent.png │ │ ├── red_rectangle.xml │ │ ├── shape_radius_20dp.xml │ │ └── tab_layout_indicator.xml │ │ ├── font │ │ ├── shabnam.ttf │ │ └── shabnam_bold.ttf │ │ ├── layout │ │ ├── activity_about_us.xml │ │ ├── activity_main.xml │ │ ├── activity_splash.xml │ │ ├── bottom_sheet_profile.xml │ │ ├── bottomsheet_item_list.xml │ │ ├── fragment_albums.xml │ │ ├── fragment_chatlist.xml │ │ ├── fragment_container_home.xml │ │ ├── fragment_edit_profile.xml │ │ ├── fragment_gallery.xml │ │ ├── fragment_home.xml │ │ ├── fragment_main_speaker_details.xml │ │ ├── fragment_main_speakers.xml │ │ ├── fragment_networking.xml │ │ ├── fragment_news.xml │ │ ├── fragment_photo_large.xml │ │ ├── fragment_profile.xml │ │ ├── fragment_register.xml │ │ ├── fragment_speaker_details.xml │ │ ├── fragment_speakers.xml │ │ ├── fragment_sponsors.xml │ │ ├── fragment_time_schedule.xml │ │ ├── fragment_verify.xml │ │ ├── header_row_speakers_list.xml │ │ ├── include_empty_state.xml │ │ ├── include_empty_state_album.xml │ │ ├── row_about.xml │ │ ├── row_album.xml │ │ ├── row_error.xml │ │ ├── row_favorites.xml │ │ ├── row_gallery.xml │ │ ├── row_loading.xml │ │ ├── row_main_speaker.xml │ │ ├── row_news.xml │ │ ├── row_progress_view.xml │ │ ├── row_speaker.xml │ │ ├── row_speaker_parent.xml │ │ ├── row_sponsor.xml │ │ ├── row_sponsor_parent.xml │ │ ├── row_time_schedule_day.xml │ │ ├── row_time_schedule_section.xml │ │ └── row_time_schedule_session.xml │ │ ├── menu │ │ ├── bottom_navigation_item.xml │ │ └── bottom_sheet_profile_list.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── navigation │ │ ├── event.xml │ │ ├── gallery.xml │ │ ├── nav_graph.xml │ │ ├── networking_navigation.xml │ │ ├── news.xml │ │ └── speakers.xml │ │ ├── raw │ │ ├── empty_state.json │ │ └── empty_state_album.json │ │ ├── values-fa │ │ └── strings.xml │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-v23 │ │ └── styles.xml │ │ ├── values-v24 │ │ └── styles.xml │ │ ├── values-v27 │ │ └── styles.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimen.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── co │ └── eventbox │ └── event │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .DS_Store 5 | /build 6 | /.idea/ 7 | /Keys.gradle 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Event App Android 2 | 3 | Hello, we shared our projects in open source in **[TEDxTehran](http://tedxtehran.com/en)** so that anyone who would like to participate in it and the rest of the TEDx Community in the world can use it as an open source project. 4 | 5 | ## Other Open Source Projects : 6 | - [Backend Core](https://github.com/TEDxTehran-Team/event_app_core) 7 | - [iOS](https://github.com/TEDxTehran-Team/event_app_ios) 8 | 9 | ## Requirements 10 | 11 | - Android Studio 4.0 or laster. 12 | 13 | - Kotlin 1.4.21 or later. 14 | 15 | - Min SDK Version 16. 16 | 17 | 18 | # Technologies 19 | 20 | - [GraphQL Apollo Client](https://github.com/apollographql/apollo-android) 21 | - [Architecture](https://developer.android.com/jetpack/guide) 22 | - [Coroutine](https://github.com/Kotlin/kotlinx.coroutines) 23 | - [Navigation component](https://developer.android.com/guide/navigation) 24 | 25 | 26 | ## How To Use 27 | 28 | - Clone project : 29 | `git clone : https://github.com/TEDxTehran-Team/event_app_andoid.git` 30 | - Import the project on Android Studio 31 | 32 | ## Setups : 33 | 34 | - Change [applicationId](https://github.com/TEDxTehran-Team/event_app_andoid/blob/master/app/build.gradle) 35 | - Add Crash Reporter [Sentry.io](https://docs.sentry.io/platforms/android/) or [Firebase](https://firebase.google.com/docs/android/setup) ... 36 | - Add Push Notification [Firebase](https://firebase.google.com/docs/cloud-messaging/android/client) or ... 37 | 38 | ## Goals : 39 | 40 | - [x] Fragment Save State in Tabs 41 | - [ ] Convert To Splash Screen Activty to Fragment 42 | - [x] English Resource String 43 | - [x] Dynamic Layout Direction LTR, RTL 44 | - [ ] Dark Mode 45 | - [x] Dependency Injection 46 | - [ ] Improvement Speakers Tab View(use recyclerview multi view type) 47 | - [x] Cache Data 48 | 49 | 50 | ## Install App in [GooglePlay](https://play.google.com/store/apps/details?id=co.eventbox.tedxtehran&hl=en_US&gl=US) 51 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /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 22 | 23 | -keep public class * implements com.bumptech.glide.module.GlideModule 24 | -keep class * extends com.bumptech.glide.module.AppGlideModule { 25 | (...); 26 | } 27 | -keep public enum com.bumptech.glide.load.ImageHeaderParser$** { 28 | **[] $VALUES; 29 | public *; 30 | } 31 | -keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { 32 | *** rewind(); 33 | } 34 | 35 | # for DexGuard only 36 | #-keepresourcexmlelements manifest/application/meta-data@value=GlideModule 37 | -------------------------------------------------------------------------------- /app/src/androidTest/java/co/eventbox/event/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event 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("co.eventbox.tedxtehran", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 15 | 16 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 30 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/graphql/com/apollographql/apollo/co/eventbox/event/AboutOrganizer.graphql: -------------------------------------------------------------------------------- 1 | query GetAbouts { 2 | organizer { 3 | abouts { 4 | title 5 | description 6 | image 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /app/src/main/graphql/com/apollographql/apollo/co/eventbox/event/DashboardCache.graphql: -------------------------------------------------------------------------------- 1 | query DashboardCache { 2 | talksWithEvent { 3 | talks { 4 | id 5 | title 6 | speakers { 7 | title 8 | } 9 | section { 10 | image 11 | } 12 | } 13 | event { 14 | title 15 | } 16 | } 17 | news { 18 | title 19 | description 20 | iconUrl 21 | extraLink 22 | } 23 | albums { 24 | title 25 | cover 26 | id 27 | } 28 | featuredTalk { 29 | id 30 | title 31 | speakers { 32 | title 33 | } 34 | section { 35 | image 36 | } 37 | } 38 | organizer { 39 | mainEvent { 40 | id 41 | title 42 | bannerUrl 43 | startDate 44 | endDate 45 | links { 46 | role 47 | url 48 | title 49 | } 50 | days { 51 | title 52 | sessions { 53 | title 54 | startTime 55 | sections { 56 | title 57 | type 58 | startTime 59 | endTime 60 | } 61 | } 62 | } 63 | speakers { 64 | id 65 | title 66 | description 67 | imageUrl 68 | } 69 | venue { 70 | title 71 | address 72 | mapLink 73 | mapImageUrl 74 | } 75 | sponsors { 76 | title 77 | imageUrl 78 | link 79 | } 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/graphql/com/apollographql/apollo/co/eventbox/event/GetAlbumPhotos.graphql: -------------------------------------------------------------------------------- 1 | query GetAlbumPhotos($id: Int!) { 2 | album(id: $id) { 3 | photo { 4 | image 5 | thumbnail 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /app/src/main/graphql/com/apollographql/apollo/co/eventbox/event/Sponsors.graphql: -------------------------------------------------------------------------------- 1 | query GetEventSponsors($eventID:Int!) { 2 | sponsorsWithType(event: $eventID) { 3 | sponsors { 4 | title 5 | logo 6 | link 7 | } 8 | type { 9 | title 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/graphql/com/apollographql/apollo/co/eventbox/event/TalkDetails.graphql: -------------------------------------------------------------------------------- 1 | query GetTalkDetail($id: Int!) { 2 | talk(id: $id) { 3 | id 4 | title 5 | description 6 | videoLink 7 | extraLink 8 | speakers { 9 | title 10 | } 11 | section { 12 | image 13 | } 14 | } 15 | suggestedTalks(talk: $id) { 16 | id 17 | title 18 | speakers { 19 | title 20 | } 21 | section { 22 | image 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/App.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event 2 | 3 | import android.content.Context 4 | import androidx.multidex.MultiDex 5 | import androidx.multidex.MultiDexApplication 6 | import co.eventbox.event.di.viewModelModule 7 | import org.koin.android.ext.koin.androidContext 8 | import org.koin.core.context.startKoin 9 | 10 | /** 11 | * Created by Farshid Roohi. 12 | * TEDxTehran | Copyrights 4/17/20. 13 | */ 14 | class App : MultiDexApplication() { 15 | 16 | companion object { 17 | lateinit var context:Context 18 | } 19 | 20 | override fun onCreate() { 21 | super.onCreate() 22 | context = applicationContext 23 | 24 | startKoin { 25 | androidContext(this@App) 26 | 27 | modules( 28 | viewModelModule 29 | ) 30 | } 31 | 32 | } 33 | 34 | override fun attachBaseContext(base: Context?) { 35 | super.attachBaseContext(base) 36 | MultiDex.install(base) 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/Config.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event 2 | 3 | import android.view.View 4 | import co.eventbox.event.utilities.Constants 5 | 6 | 7 | object Config { 8 | 9 | const val direction = View.LAYOUT_DIRECTION_LTR 10 | var language = Constants.ENGLISH 11 | var token = Constants.ENGLISH_TOKEN 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/di/ViewModelModoule.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.di 2 | 3 | import co.eventbox.event.viewModel.* 4 | import org.koin.androidx.viewmodel.dsl.viewModel 5 | import org.koin.dsl.module 6 | 7 | /** 8 | * Created by Farshid Roohi. 9 | * TEDxTehran | Copyrights 11/16/21. 10 | */ 11 | 12 | val viewModelModule = module { 13 | 14 | viewModel { 15 | AboutViewModel() 16 | } 17 | 18 | viewModel { 19 | GalleryViewModel() 20 | } 21 | 22 | viewModel { 23 | HomeViewModel() 24 | } 25 | 26 | viewModel { 27 | NewsViewModel() 28 | } 29 | 30 | viewModel { 31 | ProfileViewModel() 32 | } 33 | 34 | viewModel { 35 | SpeakersViewModel() 36 | } 37 | 38 | viewModel { 39 | SplashViewModel() 40 | } 41 | 42 | viewModel { 43 | SponsorsViewModel() 44 | } 45 | 46 | viewModel { 47 | TimeScheduleViewModel() 48 | } 49 | 50 | viewModel { 51 | PhotosViewModel() 52 | } 53 | 54 | 55 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/listener/ListOnClickListener.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.listener 2 | 3 | /** 4 | * Created by Farshid Roohi. 5 | * TEDxTehran | Copyrights 9/14/20. 6 | */ 7 | interface ListOnClickListener { 8 | fun onSelected(position:Int,id:Int) 9 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/listener/NewsOnClickListener.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.listener 2 | 3 | /** 4 | * Created by Mahdi Darvishi. 5 | * TEDxTehran | Copyrights 11/20/20. 6 | */ 7 | interface NewsOnClickListener { 8 | fun onSelected(position: Int, url: String) 9 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/listener/PhotoOnClickListener.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.listener 2 | 3 | /** 4 | * Created by Farshid Roohi. 5 | * TEDxTehran | Copyrights 9/14/20. 6 | */ 7 | interface PhotoOnClickListener { 8 | fun onSelected(position:Int,url:String) 9 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/model/LinkType.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.model 2 | 3 | /** 4 | * Created by Farshid Roohi. 5 | * TEDxTehran | Copyrights 10/2/20. 6 | */ 7 | 8 | enum class LinkType { 9 | LIVE, 10 | REGISTRATION, 11 | TICKET 12 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/model/Talks.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.model 2 | 3 | /** 4 | * Created by Farshid Roohi. 5 | * TEDxTehran | Copyrights 2019-10-30. 6 | */ 7 | data class Talks(val name: String) -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/model/User.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.model 2 | 3 | data class User( 4 | var name: String?, 5 | var phone: String?, 6 | var interested: String?, 7 | var story: String?, 8 | var email: String?, 9 | var university: String?, 10 | var job: String? 11 | ) { 12 | companion object{ 13 | fun toUser() = User ("", "", "", "", "","", "") 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/network/APIs.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.network 2 | 3 | /** 4 | * Created by Farshid Roohi. 5 | * TEDxTehran | Copyrights 4/17/20. 6 | */ 7 | object APIs { 8 | const val END_POINT: String = "https://tedxtehran.idearun.co" 9 | 10 | const val END_POINT_GRAPH_QL = "${END_POINT}/graphql/" 11 | 12 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/network/ApolloClientProvider.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.network 2 | 3 | import co.eventbox.event.App 4 | import com.apollographql.apollo.ApolloClient 5 | import com.apollographql.apollo.api.Operation 6 | import com.apollographql.apollo.api.ResponseField 7 | import com.apollographql.apollo.cache.normalized.CacheKey 8 | import com.apollographql.apollo.cache.normalized.CacheKeyResolver 9 | import com.apollographql.apollo.cache.normalized.sql.ApolloSqlHelper 10 | import com.apollographql.apollo.cache.normalized.sql.SqlNormalizedCacheFactory 11 | import okhttp3.OkHttpClient 12 | 13 | /** 14 | * Created by Farshid Roohi. 15 | * TEDxTehran | Copyrights 4/17/20. 16 | */ 17 | object ApolloClientProvider { 18 | 19 | fun provide(okHttpClient: OkHttpClient): ApolloClient { 20 | 21 | // TODO : Context Just for test 22 | val cacheFactory = SqlNormalizedCacheFactory(ApolloSqlHelper(App.context, "tedx_tehran_cache")) 23 | 24 | val resolver: CacheKeyResolver = object : CacheKeyResolver(){ 25 | override fun fromFieldArguments( 26 | field: ResponseField, 27 | variables: Operation.Variables 28 | ): CacheKey { 29 | return formatCacheKey(field.resolveArgument("id", variables) as String?) 30 | } 31 | 32 | override fun fromFieldRecordSet( 33 | field: ResponseField, 34 | recordSet: Map 35 | ): CacheKey { 36 | return formatCacheKey(recordSet["id"] as String?) 37 | } 38 | } 39 | 40 | return ApolloClient.builder().apply { 41 | serverUrl(APIs.END_POINT_GRAPH_QL) 42 | normalizedCache(cacheFactory, resolver) 43 | okHttpClient(okHttpClient) 44 | }.build() 45 | } 46 | 47 | private fun formatCacheKey(id: String?) = when { 48 | id.isNullOrEmpty() -> CacheKey.NO_KEY 49 | else -> CacheKey.from(id) 50 | } 51 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/network/Either.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.network 2 | 3 | /** 4 | * Created by Farshid Roohi. 5 | * TEDxTehran | Copyrights 2019-10-29. 6 | */ 7 | 8 | 9 | @Deprecated("Arrow pattern is Deprecated on Kotlin because kotlin has provided Resualt<*>") 10 | sealed class Either { 11 | 12 | data class Left(val left: L) : Either() 13 | data class Right(val right: R) : Either() 14 | 15 | fun fold(leftFold: (L) -> Unit, rightFold: (R) -> Unit): Unit = when (this) { 16 | is Left -> leftFold(left) 17 | is Right -> rightFold(right) 18 | } 19 | 20 | 21 | } 22 | 23 | 24 | fun Either.toResult(): Result { 25 | return when (this) { 26 | is Either.Right -> { 27 | Result.success(right) 28 | } 29 | is Either.Left -> { 30 | Result.failure(left as Throwable) 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/network/OAuthInterceptor.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.network 2 | 3 | import okhttp3.Interceptor 4 | import okhttp3.Response 5 | 6 | /** 7 | * Created by Farshid Roohi. 8 | * TEDxTehran | Copyrights 4/17/20. 9 | */ 10 | 11 | class OAuthInterceptor(private val token: String) : Interceptor { 12 | 13 | override fun intercept(chain: Interceptor.Chain): Response { 14 | var request = chain.request() 15 | request = request.newBuilder() 16 | .addHeader("Accept", "application/json") 17 | .addHeader("Content-Type", "application/json") 18 | .addHeader("Application-Token", token) 19 | .build() 20 | 21 | val response = chain.proceed(request) 22 | if (response.code() != 200) { 23 | OkHttpClientProvider.errorString = response.body()?.string() 24 | } 25 | return response 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/network/OkHttpClientProvider.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.network 2 | 3 | import okhttp3.OkHttpClient 4 | 5 | /** 6 | * Created by Farshid Roohi. 7 | * TEDxTehran | Copyrights 4/17/20. 8 | */ 9 | class OkHttpClientProvider private constructor() { 10 | 11 | companion object { 12 | 13 | var errorString: String? = null 14 | private var okHttpClient: OkHttpClient? = null 15 | 16 | fun provide(token: String): OkHttpClient { 17 | if (okHttpClient == null) { 18 | okHttpClient = OkHttpClient.Builder() 19 | .addInterceptor(OAuthInterceptor(token)) 20 | .build() 21 | } 22 | 23 | return okHttpClient!! 24 | } 25 | 26 | fun reCreate(token: String) { 27 | okHttpClient = null 28 | provide(token) 29 | } 30 | 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/network/XException.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.network 2 | 3 | /** 4 | * Created by Farshid Roohi. 5 | * TEDxTehran | Copyrights 4/17/20. 6 | */ 7 | class XException( 8 | var httpCode: Int, 9 | var errorMessage: String? 10 | ) : Throwable() { 11 | override val message: String? 12 | get() = errorMessage 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/respository/AboutRepository.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.respository 2 | 3 | import co.eventbox.event.network.Either 4 | import co.eventbox.event.network.XException 5 | import com.apollographql.apollo.api.Operation 6 | import com.apollographql.apollo.co.eventbox.event.GetAboutsQuery 7 | 8 | 9 | /** 10 | * Created by Farshid Roohi. 11 | * TEDxTehran | Copyrights 4/17/20. 12 | */ 13 | class AboutRepository : 14 | Repository() { 15 | 16 | suspend fun request() = GetAboutsQuery.builder().build().run { return@run fetch(this) } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/respository/CacheDataRepository.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.respository 2 | 3 | import co.eventbox.event.network.Either 4 | import co.eventbox.event.network.XException 5 | import com.apollographql.apollo.api.Operation 6 | import com.apollographql.apollo.api.cache.http.HttpCachePolicy 7 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 8 | 9 | 10 | /** 11 | * Created by Farshid Roohi. 12 | * TEDxTehran | Copyrights 4/17/20. 13 | */ 14 | class CacheDataRepository : 15 | Repository() { 16 | suspend fun request() = 17 | DashboardCacheQuery.builder().build().run { fetch(this, HttpCachePolicy.NETWORK_ONLY) } 18 | 19 | } 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/respository/GalleryRepository.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.respository 2 | 3 | import co.eventbox.event.network.Either 4 | import co.eventbox.event.network.XException 5 | import com.apollographql.apollo.api.Operation 6 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 7 | 8 | 9 | /** 10 | * Created by Farshid Roohi. 11 | * TEDxTehran | Copyrights 4/17/20. 12 | */ 13 | class GalleryRepository : 14 | Repository() { 15 | suspend fun request() = DashboardCacheQuery.builder().build().run { fetch(this) } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/respository/HomeRepository.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.respository 2 | 3 | import co.eventbox.event.network.Either 4 | import co.eventbox.event.network.XException 5 | import com.apollographql.apollo.api.Operation 6 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 7 | 8 | /** 9 | * Created by Farshid Roohi. 10 | * TEDxTehran | Copyrights 7/24/20. 11 | */ 12 | class HomeRepository : 13 | Repository() { 14 | 15 | suspend fun fetch() = DashboardCacheQuery.builder().build().run { fetch(this) } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/respository/PhotosGalleryRepository.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.respository 2 | 3 | import co.eventbox.event.network.Either 4 | import co.eventbox.event.network.XException 5 | import com.apollographql.apollo.co.eventbox.event.GetAlbumPhotosQuery 6 | 7 | /** 8 | * Created by Farshid Roohi. 9 | * TEDxTehran | Copyrights 4/17/20. 10 | */ 11 | class PhotosGalleryRepository : 12 | Repository() { 13 | suspend fun request(id: Int) = GetAlbumPhotosQuery.builder().id(id).build().run { 14 | fetch(this) 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/respository/SpeakersDetailsRepository.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.respository 2 | 3 | import co.eventbox.event.network.Either 4 | import co.eventbox.event.network.XException 5 | import com.apollographql.apollo.co.eventbox.event.GetTalkDetailQuery 6 | 7 | /** 8 | * Created by Farshid Roohi. 9 | * TEDxTehran | Copyrights 9/14/20. 10 | */ 11 | 12 | 13 | class SpeakersDetailsRepository : 14 | Repository() { 15 | 16 | 17 | suspend fun request(id: Int) = GetTalkDetailQuery.builder().id(id).build().run { fetch(this) } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/respository/SpeakersRepository.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.respository 2 | 3 | import co.eventbox.event.network.Either 4 | import co.eventbox.event.network.XException 5 | import com.apollographql.apollo.api.Operation 6 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 7 | 8 | /** 9 | * Created by Farshid Roohi. 10 | * TEDxTehran | Copyrights 7/24/20. 11 | */ 12 | class SpeakersRepository : 13 | Repository() { 14 | 15 | 16 | suspend fun fetch() = DashboardCacheQuery.builder().build().run { fetch(this) } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/respository/SponsorsRepository.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.respository 2 | 3 | import co.eventbox.event.network.Either 4 | import co.eventbox.event.network.XException 5 | import com.apollographql.apollo.co.eventbox.event.GetEventSponsorsQuery 6 | 7 | 8 | /** 9 | * Created by Farshid Roohi. 10 | * TEDxTehran | Copyrights 4/17/20. 11 | */ 12 | class SponsorsRepository : 13 | Repository() { 14 | 15 | suspend fun request(eventID: Int) = 16 | GetEventSponsorsQuery.builder().eventID(eventID).build().run { fetch(this) } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/respository/TimeScheduleRepository.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.respository 2 | 3 | import co.eventbox.event.network.Either 4 | import co.eventbox.event.network.XException 5 | import com.apollographql.apollo.api.Operation 6 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 7 | 8 | /** 9 | * Created by Farshid Roohi. 10 | * TEDxTehran | Copyrights 9/14/20. 11 | */ 12 | 13 | class TimeScheduleRepository : 14 | Repository() { 15 | 16 | 17 | suspend fun request() = DashboardCacheQuery.builder().build().run { fetch(this) } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/utilities/Constants.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.utilities 2 | 3 | object Constants { 4 | 5 | const val PERSIAN_TOKEN = "7b9c5f16-0882-4334-a828-e67ce8ccf201" 6 | const val ENGLISH_TOKEN = "56fe1591-c5c1-4113-aba3-73fca1f5aacd" 7 | const val ENGLISH = "en" 8 | const val PERSIAN = "fa" 9 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/utilities/CustomTabView.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.utilities 2 | 3 | import androidx.annotation.DrawableRes 4 | import androidx.annotation.IdRes 5 | import androidx.fragment.app.Fragment 6 | import androidx.fragment.app.FragmentActivity 7 | import androidx.fragment.app.FragmentManager 8 | import androidx.fragment.app.FragmentPagerAdapter 9 | import androidx.viewpager.widget.ViewPager 10 | import com.google.android.material.tabs.TabLayout 11 | 12 | 13 | /* custom and simple tablayout class 14 | * write by mahdidrv.ir 15 | * */ 16 | 17 | 18 | class CustomTabView( 19 | activity: FragmentActivity, 20 | fragmentManager: FragmentManager, 21 | @IdRes tabLayoutId: Int, 22 | @IdRes viewPagerId: Int 23 | ) { 24 | 25 | 26 | private val tabLayout: TabLayout 27 | private val viewPager: ViewPager 28 | private val adapter: Adapter 29 | 30 | init { 31 | val rootView = activity.window.decorView 32 | tabLayout = rootView.findViewById(tabLayoutId) 33 | viewPager = rootView.findViewById(viewPagerId) 34 | 35 | adapter = Adapter(fragmentManager) 36 | viewPager.adapter = adapter 37 | tabLayout.setupWithViewPager(viewPager) 38 | 39 | } 40 | 41 | fun add(fragmentClass: Class, title: String?, @DrawableRes iconId: Int) { 42 | val item = Item(fragmentClass, title!!, iconId) 43 | adapter.set(item) 44 | adapter.notifyDataSetChanged() 45 | 46 | refreshIcons() 47 | 48 | } 49 | 50 | fun add(fragmentClass: Class, title: String) { 51 | add(fragmentClass, title, 0) 52 | } 53 | 54 | fun add(fragmentClass: Class, iconId: Int) { 55 | add(fragmentClass, "", iconId) 56 | } 57 | 58 | private fun refreshIcons() { 59 | for (i in 0 until adapter.count) { 60 | val itemIcon = adapter.getRawItem(i).icon 61 | if (itemIcon != 0) { 62 | tabLayout.getTabAt(i)?.setIcon(adapter.getRawItem(i).icon) 63 | } 64 | } 65 | } 66 | 67 | 68 | class Adapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager) { 69 | 70 | private val items = ArrayList() 71 | 72 | fun set(item: Item) { 73 | items.add(item) 74 | } 75 | 76 | fun getRawItem(position: Int): Item { 77 | return items[position] 78 | } 79 | 80 | override fun getItem(position: Int): Fragment { 81 | return items[position].fragment 82 | } 83 | 84 | override fun getCount(): Int { 85 | return items.size 86 | } 87 | 88 | override fun getPageTitle(position: Int): CharSequence? { 89 | return items[position].title 90 | } 91 | 92 | 93 | } 94 | 95 | class Item(fragmentClass: Class, var title: String, iconId: Int) { 96 | var fragment: Fragment = fragmentClass.newInstance() 97 | var icon: Int = iconId 98 | 99 | } 100 | 101 | 102 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/utilities/FileExtension.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.utilities 2 | 3 | import android.os.Environment 4 | 5 | /** 6 | * Created by Farshid Roohi. 7 | * TEDxTehran | Copyrights 4/17/20. 8 | */ 9 | 10 | 11 | fun cacheDir():String { 12 | return Environment.getExternalStorageState().toString() + "/Android/data/co.eventbox.tedxtehran/Cache" 13 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/utilities/ImageExtension.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.utilities 2 | 3 | import android.widget.ImageView 4 | import androidx.annotation.DrawableRes 5 | import coil.load 6 | import coil.request.CachePolicy 7 | import coil.transform.RoundedCornersTransformation 8 | 9 | /** 10 | * Created by Farshid Roohi. 11 | * TEDxTehran | Copyrights 7/10/20. 12 | */ 13 | 14 | 15 | fun ImageView.load(url: String?, @DrawableRes placeHolder: Int = 0) { 16 | this.load(url) { 17 | placeholder(placeHolder) 18 | error(placeHolder) 19 | diskCachePolicy(CachePolicy.ENABLED) 20 | } 21 | } 22 | 23 | fun ImageView.loadRadius(url: String?) { 24 | 25 | this.load(url) { 26 | diskCachePolicy(CachePolicy.ENABLED) 27 | transformations(RoundedCornersTransformation(10f)) 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/utilities/ModelExtension.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.utilities 2 | 3 | import co.eventbox.event.model.LinkType 4 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 5 | 6 | /** 7 | * Created by Farshid Roohi. 8 | * TEDxTehran | Copyrights 9/17/20. 9 | */ 10 | 11 | fun DashboardCacheQuery.MainEvent.toPersianDate(): String { 12 | return "${this.startDate()?.toString().toPersianDate()} تا ${ 13 | this.endDate()?.toString().toPersianDate() 14 | }" 15 | } 16 | 17 | fun DashboardCacheQuery.MainEvent.toEnglishDate(): String { 18 | return "${this.startDate()?.toString()?.substringBefore("T")} to ${ 19 | this.endDate()?.toString()?.substringBefore("T") 20 | }" 21 | } 22 | 23 | fun DashboardCacheQuery.Section2.toTime(): String { 24 | 25 | val start = this.startTime().toString().split(":") 26 | val end = this.endTime().toString().split(":") 27 | 28 | return "${start[0]}:${start[1]} الی ${end[0]}:${end[1]}" 29 | } 30 | 31 | fun DashboardCacheQuery.Session.toTime(): String { 32 | 33 | val start = this.startTime().toString().split(":") 34 | return "${start[0]}:${start[1]}" 35 | } 36 | 37 | fun List?.toPair(type: LinkType): Pair? { 38 | val item = this?.firstOrNull { item -> 39 | item.role() == type.name 40 | } 41 | ?: return null 42 | return Pair(item.title(), item.url()) 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/utilities/NumberExtension.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.utilities 2 | 3 | 4 | fun Int.toBool() = if (this==0) false else true -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/utilities/StringExtension.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.utilities 2 | 3 | import co.eventbox.event.network.APIs 4 | import java.text.SimpleDateFormat 5 | import java.util.* 6 | 7 | 8 | /** 9 | * Created by Farshid Roohi. 10 | * TEDxTehran | Copyrights 7/10/20. 11 | */ 12 | 13 | 14 | fun String?.toImageURL(): String { 15 | if (this == null) { 16 | return "" 17 | } 18 | if (this.contains("media")) { 19 | return "${APIs.END_POINT}/$this" 20 | } 21 | return "${APIs.END_POINT}/media/$this" 22 | 23 | } 24 | 25 | fun String?.toPersianDate(): String { 26 | 27 | val date = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(this!!) 28 | 29 | val calendar = Calendar.getInstance() 30 | calendar.time = date 31 | 32 | return DateConverter().setGregorianDate(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)).getIranianDate() 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/utilities/ViewExtension.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.utilities 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.net.Uri 6 | import android.view.View 7 | 8 | /** 9 | * Created by Farshid Roohi. 10 | * TEDxTehran | Copyrights 7/10/20. 11 | */ 12 | fun View.gone() { 13 | this.visibility = View.GONE 14 | } 15 | 16 | fun View.visible() { 17 | this.visibility = View.VISIBLE 18 | } 19 | 20 | fun Context.openBrowser(url:String?){ 21 | val intent = Intent(Intent.ACTION_VIEW) 22 | intent.data = Uri.parse(url) 23 | startActivity(intent) 24 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/about/AboutAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.about 2 | 3 | import android.content.Context 4 | import co.eventbox.event.R 5 | import co.eventbox.event.utilities.loadRadius 6 | import co.eventbox.event.utilities.toImageURL 7 | import co.eventbox.event.view.AdapterRecyclerView 8 | import com.apollographql.apollo.co.eventbox.event.GetAboutsQuery 9 | import kotlinx.android.synthetic.main.row_about.view.* 10 | import kotlinx.android.synthetic.main.row_gallery.view.txtTitle 11 | 12 | /** 13 | * Created by Farshid Roohi. 14 | * TEDxTehran | Copyrights 7/10/20. 15 | */ 16 | class AboutAdapter : AdapterRecyclerView( 17 | R.layout.row_about, 18 | R.layout.row_loading, 19 | R.layout.row_error, 20 | R.id.btnErrorLoadList 21 | ) { 22 | 23 | override fun onBindView( 24 | viewHolder: ItemViewHolder, 25 | position: Int, 26 | context: Context, 27 | element: GetAboutsQuery.About? 28 | ) { 29 | val itemView = viewHolder.itemView 30 | 31 | itemView.txtTitle.text = element?.title() 32 | itemView.txtDescription.text = element?.description() 33 | itemView.imgAbout.loadRadius(element?.image()?.toImageURL()) 34 | 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/about/AboutUsActivity.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.about 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import androidx.lifecycle.Observer 6 | import androidx.lifecycle.ViewModelProvider 7 | import co.eventbox.event.R 8 | import co.eventbox.event.utilities.gone 9 | import co.eventbox.event.viewModel.AboutViewModel 10 | import kotlinx.android.synthetic.main.activity_about_us.* 11 | 12 | /** 13 | * Created by Farshid Roohi. 14 | * TEDxTehran | Copyrights 2019-09-06. 15 | */ 16 | 17 | class AboutUsActivity : AppCompatActivity() { 18 | 19 | override fun onCreate(savedInstanceState: Bundle?) { 20 | super.onCreate(savedInstanceState) 21 | setContentView(R.layout.activity_about_us) 22 | 23 | val viewModel = ViewModelProvider(this).get(AboutViewModel::class.java) 24 | val adapter = AboutAdapter() 25 | this.recyclerAbout.adapter = adapter 26 | 27 | viewModel.abouts().observe(this, Observer { 28 | adapter.loadedState(it) 29 | this.progressBar.gone() 30 | }) 31 | 32 | 33 | imgBack.setOnClickListener { finish() } 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/activities/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.activities 2 | 3 | import android.content.res.Configuration 4 | import android.content.res.Resources 5 | import android.os.Build 6 | import android.os.Bundle 7 | import android.os.PersistableBundle 8 | import android.util.Log 9 | import androidx.appcompat.app.AppCompatActivity 10 | import co.eventbox.event.Config 11 | import co.eventbox.event.utilities.Constants 12 | import java.util.* 13 | 14 | 15 | open class BaseActivity : AppCompatActivity() { 16 | 17 | fun locate(locate: String) { 18 | val locale = Locale(locate) 19 | Locale.setDefault(locale) 20 | val resources: Resources = resources 21 | val configuration: Configuration = resources.getConfiguration() 22 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 23 | configuration.setLayoutDirection(locale) 24 | } 25 | configuration.locale = locale 26 | if (locate.equals(Constants.ENGLISH)) { 27 | Config.token = Constants.ENGLISH_TOKEN 28 | } else if (locate.equals(Constants.PERSIAN)) { 29 | Config.token = Constants.PERSIAN_TOKEN 30 | } 31 | resources.updateConfiguration(configuration, resources.getDisplayMetrics()) 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/activities/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.activities 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import androidx.navigation.NavController 6 | import androidx.navigation.fragment.NavHostFragment 7 | import androidx.navigation.ui.NavigationUI 8 | import androidx.navigation.ui.setupWithNavController 9 | import co.eventbox.event.R 10 | import co.eventbox.event.view.about.AboutUsActivity 11 | import com.google.android.material.bottomnavigation.BottomNavigationView 12 | import kotlinx.android.synthetic.main.activity_main.* 13 | 14 | 15 | /** 16 | * Created by Farshid Roohi. 17 | * TEDxTehran | Copyrights 2019-09-06. 18 | */ 19 | 20 | class MainActivity : BaseActivity() { 21 | 22 | // private val tabManager: TabManager by lazy { TabManager(this) } 23 | private lateinit var navController: NavController 24 | 25 | override fun onCreate(savedInstanceState: Bundle?) { 26 | super.onCreate(savedInstanceState) 27 | setContentView(R.layout.activity_main) 28 | 29 | val navHostFragment = supportFragmentManager.findFragmentById( 30 | R.id.nav_host_container 31 | ) as NavHostFragment 32 | navController = navHostFragment.navController 33 | 34 | // Setup the bottom navigation view with navController 35 | val bottomNavigationView = findViewById(R.id.bottomNavigation) 36 | bottomNavigationView.setupWithNavController(navController) 37 | 38 | imgInfo.setOnClickListener { 39 | startActivity(Intent(this, AboutUsActivity::class.java)) 40 | } 41 | 42 | 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/activities/SplashActivity.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.activities 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import android.util.Log 6 | import android.view.View 7 | import androidx.appcompat.app.AppCompatActivity 8 | import androidx.lifecycle.Observer 9 | import androidx.lifecycle.ViewModelProvider 10 | import co.eventbox.event.Config 11 | import co.eventbox.event.R 12 | import co.eventbox.event.utilities.gone 13 | import co.eventbox.event.utilities.visible 14 | import co.eventbox.event.viewModel.SplashViewModel 15 | import kotlinx.android.synthetic.main.activity_splash.* 16 | import java.util.* 17 | 18 | 19 | class SplashActivity : BaseActivity(), Observer { 20 | 21 | override fun onCreate(savedInstanceState: Bundle?) { 22 | super.onCreate(savedInstanceState) 23 | Config.language = Locale.getDefault().getLanguage() 24 | locate(Config.language) 25 | setContentView(R.layout.activity_splash) 26 | val splashViewModel = ViewModelProvider(this).get(SplashViewModel::class.java) 27 | 28 | splashViewModel.cacheData().observe(this, this) 29 | 30 | btnTryAgain.setOnClickListener { 31 | btnTryAgain.visibility = View.INVISIBLE 32 | progressBar.visible() 33 | splashViewModel.cacheData().observe(this, this) 34 | } 35 | } 36 | 37 | override fun onChanged(t: Boolean?) { 38 | if (t != null && t) { 39 | finish() 40 | startActivity(Intent(this@SplashActivity, MainActivity::class.java)) 41 | } else { 42 | btnTryAgain.visible() 43 | progressBar.gone() 44 | } 45 | } 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/gallery/AlbumsAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.gallery 2 | 3 | import android.content.Context 4 | import co.eventbox.event.R 5 | import co.eventbox.event.listener.PhotoOnClickListener 6 | import co.eventbox.event.utilities.loadRadius 7 | import co.eventbox.event.utilities.toImageURL 8 | import com.apollographql.apollo.co.eventbox.event.GetAlbumPhotosQuery 9 | import kotlinx.android.synthetic.main.row_album.view.* 10 | import co.eventbox.event.view.AdapterRecyclerView 11 | 12 | 13 | /** 14 | * Created by Farshid Roohi. 15 | * TEDxTehran | Copyrights 7/10/20. 16 | */ 17 | class AlbumsAdapter(var listener: PhotoOnClickListener) : 18 | AdapterRecyclerView( 19 | R.layout.row_album, 20 | R.layout.row_loading, 21 | R.layout.row_error, 22 | R.id.btnErrorLoadList 23 | ) { 24 | 25 | override fun onBindView( 26 | viewHolder: ItemViewHolder, 27 | position: Int, 28 | context: Context, 29 | element: GetAlbumPhotosQuery.Photo? 30 | ) { 31 | val itemView = viewHolder.itemView 32 | 33 | itemView.imgCover.loadRadius(element?.thumbnail()?.toImageURL()) 34 | itemView.layoutRoot.setOnClickListener { 35 | this.listener.onSelected(position, element?.thumbnail()!!) 36 | } 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/gallery/AlbumsFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.gallery 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import android.widget.Toast 8 | import androidx.core.os.bundleOf 9 | import androidx.fragment.app.Fragment 10 | import androidx.lifecycle.observe 11 | import androidx.navigation.fragment.findNavController 12 | import androidx.recyclerview.widget.GridLayoutManager 13 | import co.eventbox.event.R 14 | import co.eventbox.event.listener.PhotoOnClickListener 15 | import co.eventbox.event.utilities.gone 16 | import co.eventbox.event.viewModel.PhotosViewModel 17 | import kotlinx.android.synthetic.main.fragment_albums.* 18 | import org.koin.androidx.viewmodel.ext.android.viewModel 19 | 20 | /** 21 | * Created by Farshid Roohi. 22 | * TEDxTehran | Copyrights 2019-09-26. 23 | */ 24 | class AlbumsFragment : Fragment(), PhotoOnClickListener { 25 | 26 | private val photosViewModel: PhotosViewModel by viewModel() 27 | 28 | override fun onCreateView( 29 | inflater: LayoutInflater, 30 | container: ViewGroup?, 31 | savedInstanceState: Bundle? 32 | ): View? { 33 | return inflater.inflate(R.layout.fragment_albums, container, false) 34 | } 35 | 36 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 37 | super.onViewCreated(view, savedInstanceState) 38 | 39 | val id = arguments?.get("albums_id") as Int 40 | 41 | val adapter = AlbumsAdapter(this) 42 | this.recyclerViewPhotos.layoutManager = GridLayoutManager(this.context, 3) 43 | this.recyclerViewPhotos.adapter = adapter 44 | 45 | photosViewModel.photos(id) 46 | photosViewModel.photosLiveData.observe(viewLifecycleOwner, { 47 | 48 | if (adapter.itemCount != 0){ 49 | return@observe 50 | } 51 | 52 | this.progressBar.gone() 53 | adapter.loadedState(it) 54 | 55 | if (it?.isNullOrEmpty() == true) { 56 | empty_state.visibility = View.VISIBLE 57 | } 58 | 59 | }) 60 | 61 | 62 | } 63 | 64 | override fun onSelected(position: Int, url: String) { 65 | findNavController().navigate( 66 | R.id.action_galleryListFragment_to_photoLargeFragment, 67 | bundleOf("photo_url" to url) 68 | ) 69 | } 70 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/gallery/GalleryAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.gallery 2 | 3 | import android.content.Context 4 | import co.eventbox.event.listener.ListOnClickListener 5 | import co.eventbox.event.R 6 | import co.eventbox.event.utilities.loadRadius 7 | import co.eventbox.event.utilities.toImageURL 8 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 9 | import kotlinx.android.synthetic.main.row_gallery.view.* 10 | import co.eventbox.event.view.AdapterRecyclerView 11 | 12 | 13 | /** 14 | * Created by Farshid Roohi. 15 | * TEDxTehran | Copyrights 7/10/20. 16 | */ 17 | class GalleryAdapter(var listener: ListOnClickListener) : 18 | AdapterRecyclerView( 19 | R.layout.row_gallery, 20 | R.layout.row_loading, 21 | R.layout.row_error, 22 | R.id.btnErrorLoadList 23 | ) { 24 | 25 | override fun onBindView( 26 | viewHolder: ItemViewHolder, 27 | position: Int, 28 | context: Context, 29 | element: DashboardCacheQuery.Album? 30 | ) { 31 | val itemView = viewHolder.itemView 32 | 33 | itemView.imgCover.loadRadius(element?.cover()?.toImageURL()) 34 | itemView.txtTitle.text = element?.title() 35 | 36 | itemView.layoutRoot.setOnClickListener { 37 | this.listener.onSelected(position, element?.id()!!.toInt()) 38 | } 39 | 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/gallery/GalleryFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.gallery 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.core.os.bundleOf 8 | import androidx.fragment.app.Fragment 9 | import androidx.navigation.fragment.findNavController 10 | import co.eventbox.event.R 11 | import co.eventbox.event.listener.ListOnClickListener 12 | import co.eventbox.event.utilities.gone 13 | import co.eventbox.event.viewModel.GalleryViewModel 14 | import kotlinx.android.synthetic.main.fragment_gallery.* 15 | import org.koin.androidx.viewmodel.ext.android.viewModel 16 | 17 | /** 18 | * Created by Farshid Roohi. 19 | * TEDxTehran | Copyrights 2019-09-26. 20 | */ 21 | class GalleryFragment : Fragment(), ListOnClickListener { 22 | 23 | private val galleryViewModel: GalleryViewModel by viewModel() 24 | 25 | override fun onCreateView( 26 | inflater: LayoutInflater, 27 | container: ViewGroup?, 28 | savedInstanceState: Bundle? 29 | ): View? { 30 | return inflater.inflate(R.layout.fragment_gallery, container, false) 31 | } 32 | 33 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 34 | super.onViewCreated(view, savedInstanceState) 35 | 36 | val adapter = GalleryAdapter(this) 37 | 38 | this.recyclerViewGallery.adapter = adapter 39 | 40 | galleryViewModel.albumsLiveData.observe(viewLifecycleOwner, { 41 | 42 | this.progressBar.gone() 43 | adapter.loadedState(it) 44 | 45 | }) 46 | 47 | 48 | } 49 | 50 | override fun onSelected(position: Int, id: Int) { 51 | findNavController().navigate( 52 | R.id.action_galleryFragment_to_galleryListFragment, 53 | bundleOf("albums_id" to id) 54 | ) 55 | } 56 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/gallery/PhotoLargeFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.gallery 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import co.eventbox.event.R 9 | import co.eventbox.event.utilities.load 10 | import co.eventbox.event.utilities.toImageURL 11 | import kotlinx.android.synthetic.main.fragment_photo_large.* 12 | 13 | /** 14 | * Created by Farshid Roohi. 15 | * TEDxTehran | Copyrights 2019-09-26. 16 | */ 17 | class PhotoLargeFragment : Fragment() { 18 | 19 | override fun onCreateView( 20 | inflater: LayoutInflater, 21 | container: ViewGroup?, 22 | savedInstanceState: Bundle? 23 | ): View? { 24 | return inflater.inflate(R.layout.fragment_photo_large, container, false) 25 | } 26 | 27 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 28 | super.onViewCreated(view, savedInstanceState) 29 | 30 | val url = arguments?.get("photo_url") as String 31 | this.imgPhoto.load(url.toImageURL(),placeHolder = R.drawable.ic_gallery) 32 | 33 | 34 | 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/ContainerHomeFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.core.view.size 8 | import androidx.fragment.app.Fragment 9 | import co.eventbox.event.R 10 | import com.google.android.material.tabs.TabLayout 11 | import kotlinx.android.synthetic.main.fragment_container_home.* 12 | import kotlinx.android.synthetic.main.fragment_container_home.view.* 13 | 14 | /** 15 | * Created by Farshid Roohi. 16 | * TEDxTehran | Copyrights 2019-09-26. 17 | */ 18 | class ContainerHomeFragment : Fragment() { 19 | 20 | override fun onCreateView( 21 | inflater: LayoutInflater, 22 | container: ViewGroup?, 23 | savedInstanceState: Bundle? 24 | ): View? { 25 | return inflater.inflate(R.layout.fragment_container_home, container, false) 26 | } 27 | 28 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 29 | super.onViewCreated(view, savedInstanceState) 30 | 31 | 32 | this.viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout)) 33 | this.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { 34 | 35 | override fun onTabReselected(p0: TabLayout.Tab?) {} 36 | 37 | override fun onTabUnselected(p0: TabLayout.Tab?) {} 38 | 39 | override fun onTabSelected(tab: TabLayout.Tab?) { 40 | viewPager.currentItem = tab?.position ?: 0 41 | } 42 | }) 43 | 44 | val adapter = HomeViewPagerAdapter(this.childFragmentManager) 45 | viewPager.apply { 46 | this.adapter = adapter 47 | currentItem = 2 48 | offscreenPageLimit = viewPager.size 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/HomeViewPagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.fragment.app.FragmentManager 5 | import androidx.fragment.app.FragmentPagerAdapter 6 | import co.eventbox.event.view.home.speakers.MainEventSpeakersFragment 7 | import co.eventbox.event.view.home.timeSchedule.TimeScheduleFragment 8 | 9 | /** 10 | * Created by Farshid Roohi. 11 | * TEDxTehran | Copyrights 9/18/20. 12 | */ 13 | class HomeViewPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) { 14 | 15 | private val fragments = mutableListOf( 16 | MainEventSpeakersFragment(), 17 | TimeScheduleFragment(), 18 | HomeFragment() 19 | ) 20 | 21 | override fun getItem(position: Int): Fragment = fragments[position] 22 | 23 | override fun getCount(): Int = fragments.size 24 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/speakers/MainEventSpeakersFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home.speakers 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import androidx.lifecycle.observe 9 | import androidx.navigation.fragment.findNavController 10 | import co.eventbox.event.R 11 | import co.eventbox.event.listener.ListOnClickListener 12 | import co.eventbox.event.utilities.gone 13 | import co.eventbox.event.viewModel.HomeViewModel 14 | import kotlinx.android.synthetic.main.fragment_main_speakers.* 15 | import org.koin.androidx.viewmodel.ext.android.viewModel 16 | 17 | 18 | /** 19 | * Created by Farshid Roohi. 20 | * TEDxTehran | Copyrights 2019-09-26. 21 | */ 22 | class MainEventSpeakersFragment : Fragment(), ListOnClickListener { 23 | 24 | lateinit var adapter: MainSpeakerAdapter 25 | 26 | private val homeViewModel: HomeViewModel by viewModel() 27 | 28 | override fun onCreateView( 29 | inflater: LayoutInflater, 30 | container: ViewGroup?, 31 | savedInstanceState: Bundle? 32 | ): View? { 33 | return inflater.inflate(R.layout.fragment_main_speakers, container, false) 34 | } 35 | 36 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 37 | super.onViewCreated(view, savedInstanceState) 38 | 39 | adapter = MainSpeakerAdapter(this) 40 | this.recyclerViewSpeakers.adapter = adapter 41 | 42 | homeViewModel.mainEventLiveData.observe(viewLifecycleOwner, { mainEvent -> 43 | this.progressBar.gone() 44 | 45 | if (mainEvent?.speakers()?.isEmpty() == false) { 46 | adapter.loadedState(mainEvent.speakers()) 47 | } else { 48 | empty_state.visibility = View.VISIBLE 49 | } 50 | }) 51 | 52 | 53 | } 54 | 55 | 56 | override fun onSelected(position: Int, id: Int) { 57 | 58 | val bundle = Bundle() 59 | val item = adapter.getItem(position) 60 | bundle.putString("title", item?.title()) 61 | bundle.putString("description", item?.description()) 62 | bundle.putString("imageUrl", item?.imageUrl()) 63 | 64 | findNavController().navigate( 65 | R.id.action_ContainerHomeFragment_to_mainSpeakersDetailsFragment, 66 | bundle 67 | 68 | ) 69 | } 70 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/speakers/MainSpeakerAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home.speakers 2 | 3 | import android.content.Context 4 | import co.eventbox.event.R 5 | import co.eventbox.event.listener.ListOnClickListener 6 | import co.eventbox.event.utilities.loadRadius 7 | import co.eventbox.event.utilities.toImageURL 8 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 9 | import kotlinx.android.synthetic.main.row_main_speaker.view.* 10 | import kotlinx.android.synthetic.main.row_main_speaker.view.img_speaker 11 | import kotlinx.android.synthetic.main.row_main_speaker.view.layoutRoot 12 | import kotlinx.android.synthetic.main.row_main_speaker.view.txtTitle 13 | import co.eventbox.event.view.AdapterRecyclerView 14 | 15 | 16 | /** 17 | * Created by Farshid Roohi. 18 | * TEDxTehran | Copyrights 10/2/20. 19 | */ 20 | class MainSpeakerAdapter(var listener: ListOnClickListener) : 21 | AdapterRecyclerView( 22 | R.layout.row_main_speaker, 23 | R.layout.row_loading, 24 | R.layout.row_error, 25 | R.id.btnErrorLoadList 26 | ) { 27 | 28 | override fun onBindView( 29 | viewHolder: ItemViewHolder, 30 | position: Int, 31 | context: Context, 32 | element: DashboardCacheQuery.Speaker2? 33 | ) { 34 | val itemView = viewHolder.itemView 35 | 36 | itemView.txtTitle.text = element?.title() 37 | itemView.txtDescription.text = element?.description() 38 | itemView.img_speaker.loadRadius(element?.imageUrl()?.toImageURL()) 39 | 40 | itemView.layoutRoot.setOnClickListener { 41 | this.listener.onSelected(position, element!!.id().toInt()) 42 | } 43 | 44 | } 45 | 46 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/speakers/MainSpeakersDetailsFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home.speakers 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import co.eventbox.event.R 9 | import co.eventbox.event.utilities.load 10 | import co.eventbox.event.utilities.toImageURL 11 | import kotlinx.android.synthetic.main.fragment_main_speaker_details.* 12 | 13 | /** 14 | * Created by Mahdi Darvishi. 15 | * TEDxTehran | Copyrights 11/13/20. 16 | */ 17 | class MainSpeakersDetailsFragment : Fragment() { 18 | 19 | 20 | override fun onCreateView( 21 | inflater: LayoutInflater, 22 | container: ViewGroup?, 23 | savedInstanceState: Bundle? 24 | ): View? { 25 | return inflater.inflate(R.layout.fragment_main_speaker_details, container, false) 26 | } 27 | 28 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 29 | super.onViewCreated(view, savedInstanceState) 30 | 31 | 32 | txtSpeakerName.text = getFromBundle("title") 33 | txtSpeakerDesc.text = getFromBundle("description") 34 | imgSpeakerAvatar.load(getFromBundle("imageUrl").toImageURL(), R.drawable.placeholdertransparent) 35 | 36 | 37 | } 38 | 39 | // simple method to get string from bunlde 40 | fun getFromBundle(key: String): String?{ 41 | return arguments?.getString(key) 42 | } 43 | 44 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/sponsors/SponsorAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home.sponsors 2 | 3 | import android.content.Context 4 | import co.eventbox.event.R 5 | import co.eventbox.event.utilities.load 6 | import co.eventbox.event.utilities.openBrowser 7 | import co.eventbox.event.utilities.toImageURL 8 | import com.apollographql.apollo.co.eventbox.event.GetEventSponsorsQuery 9 | import kotlinx.android.synthetic.main.row_sponsor.view.* 10 | import co.eventbox.event.view.AdapterRecyclerView 11 | 12 | 13 | /** 14 | * Created by Farshid Roohi. 15 | * TEDxTehran | Copyrights 7/10/20. 16 | */ 17 | class SponsorAdapter : AdapterRecyclerView( 18 | R.layout.row_sponsor, 19 | R.layout.row_loading, 20 | R.layout.row_error, 21 | R.id.btnErrorLoadList 22 | ) { 23 | override fun onBindView( 24 | viewHolder: ItemViewHolder, 25 | position: Int, 26 | context: Context, 27 | element: GetEventSponsorsQuery.Sponsor? 28 | ) { 29 | val itemView = viewHolder.itemView 30 | itemView.imgSponsor.load(element?.logo()?.toImageURL()) 31 | itemView.txtTitle.text = element?.title() 32 | itemView.layoutRoot.setOnClickListener { 33 | if (!element?.link().isNullOrEmpty()) 34 | itemView.context.openBrowser(element?.link()) 35 | } 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/sponsors/SponsorParentAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home.sponsors 2 | 3 | import android.content.Context 4 | import androidx.recyclerview.widget.LinearLayoutManager 5 | import co.eventbox.event.R 6 | import com.apollographql.apollo.co.eventbox.event.GetEventSponsorsQuery 7 | import co.eventbox.event.view.AdapterRecyclerView 8 | import kotlinx.android.synthetic.main.row_sponsor_parent.view.* 9 | 10 | /** 11 | * Created by Farshid Roohi. 12 | * TEDxTehran | Copyrights 7/10/20. 13 | */ 14 | class SponsorParentAdapter : AdapterRecyclerView( 15 | R.layout.row_sponsor_parent, 16 | R.layout.row_loading, 17 | R.layout.row_error, 18 | R.id.btnErrorLoadList 19 | ) { 20 | 21 | 22 | override fun onBindView( 23 | viewHolder: ItemViewHolder, 24 | position: Int, 25 | context: Context, 26 | element: GetEventSponsorsQuery.SponsorsWithType? 27 | ) { 28 | val itemView = viewHolder.itemView 29 | 30 | itemView.txtTitle.text = element?.type()?.title() 31 | 32 | val adapter = SponsorAdapter() 33 | adapter.loadedState(element?.sponsors()) 34 | itemView.recyclerSponsors.adapter = adapter 35 | itemView.recyclerSponsors.layoutManager = 36 | LinearLayoutManager(itemView.context, LinearLayoutManager.HORIZONTAL, false) 37 | 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/sponsors/SponsorsFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home.sponsors 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import androidx.lifecycle.ViewModelProvider 9 | import androidx.lifecycle.observe 10 | import co.eventbox.event.R 11 | import co.eventbox.event.utilities.gone 12 | import co.eventbox.event.viewModel.SponsorsViewModel 13 | import kotlinx.android.synthetic.main.fragment_sponsors.* 14 | import org.koin.androidx.viewmodel.ext.android.viewModel 15 | 16 | /** 17 | * Created by Farshid Roohi. 18 | * TEDxTehran | Copyrights 2019-09-26. 19 | */ 20 | class SponsorsFragment : Fragment() { 21 | 22 | private val viewModel: SponsorsViewModel by viewModel() 23 | 24 | override fun onCreateView( 25 | inflater: LayoutInflater, 26 | container: ViewGroup?, 27 | savedInstanceState: Bundle? 28 | ): View? { 29 | return inflater.inflate(R.layout.fragment_sponsors, container, false) 30 | } 31 | 32 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 33 | super.onViewCreated(view, savedInstanceState) 34 | 35 | val adapter = SponsorParentAdapter() 36 | this.recyclerViewSponsors.adapter = adapter 37 | 38 | val eventID = arguments?.get("event_id") as Int 39 | 40 | viewModel.sponsors(eventID).observe(viewLifecycleOwner, { 41 | this.progressBar.gone() 42 | adapter.loadedState(it) 43 | }) 44 | 45 | } 46 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/timeSchedule/TimeScheduleDayAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home.timeSchedule 2 | 3 | import android.content.Context 4 | import co.eventbox.event.R 5 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 6 | import kotlinx.android.synthetic.main.row_time_schedule_day.view.* 7 | import kotlinx.android.synthetic.main.row_time_schedule_section.view.txtTitle 8 | import co.eventbox.event.view.AdapterRecyclerView 9 | 10 | 11 | /** 12 | * Created by Farshid Roohi. 13 | * TEDxTehran | Copyrights 9/18/20. 14 | */ 15 | class TimeScheduleDayAdapter : AdapterRecyclerView( 16 | R.layout.row_time_schedule_day, 17 | R.layout.row_loading, 18 | R.layout.row_error, 19 | R.id.btnErrorLoadList 20 | ) { 21 | 22 | override fun onBindView( 23 | viewHolder: ItemViewHolder, 24 | position: Int, 25 | context: Context, 26 | element: DashboardCacheQuery.Day? 27 | ) { 28 | val itemView = viewHolder.itemView 29 | 30 | if (element?.sessions()!!.size > 0) 31 | itemView.txtTitle.text = element.title() 32 | 33 | val adapter = TimeScheduleSessionAdapter() 34 | adapter.loadedState(element.sessions()) 35 | itemView.recyclerSessions.adapter = adapter 36 | 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/timeSchedule/TimeScheduleFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home.timeSchedule 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import co.eventbox.event.R 9 | import co.eventbox.event.utilities.* 10 | import co.eventbox.event.viewModel.TimeScheduleViewModel 11 | import kotlinx.android.synthetic.main.fragment_time_schedule.* 12 | import kotlinx.android.synthetic.main.fragment_time_schedule.empty_state 13 | import kotlinx.android.synthetic.main.fragment_time_schedule.progressBar 14 | import org.koin.androidx.viewmodel.ext.android.viewModel 15 | 16 | /** 17 | * Created by Farshid Roohi. 18 | * TEDxTehran | Copyrights 2019-09-26. 19 | */ 20 | class TimeScheduleFragment : Fragment() { 21 | 22 | private val viewModel: TimeScheduleViewModel by viewModel() 23 | 24 | override fun onCreateView( 25 | inflater: LayoutInflater, 26 | container: ViewGroup?, 27 | savedInstanceState: Bundle? 28 | ): View? { 29 | return inflater.inflate(R.layout.fragment_time_schedule, container, false) 30 | } 31 | 32 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 33 | super.onViewCreated(view, savedInstanceState) 34 | 35 | val adapter = TimeScheduleDayAdapter() 36 | this.recyclerDays.adapter = adapter 37 | 38 | viewModel.daysLiveData.observe(viewLifecycleOwner, { 39 | this.progressBar.gone() 40 | if (!it.isNullOrEmpty()) { 41 | adapter.loadedState(it) 42 | } else { 43 | empty_state.visibility = View.VISIBLE 44 | } 45 | }) 46 | 47 | 48 | } 49 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/timeSchedule/TimeScheduleSectionAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home.timeSchedule 2 | 3 | import android.content.Context 4 | import androidx.annotation.DrawableRes 5 | import androidx.core.content.ContextCompat 6 | import co.eventbox.event.R 7 | import co.eventbox.event.utilities.toTime 8 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 9 | import com.apollographql.apollo.co.eventbox.event.type.SectionType 10 | import kotlinx.android.synthetic.main.row_time_schedule_section.view.* 11 | import co.eventbox.event.view.AdapterRecyclerView 12 | 13 | /** 14 | * Created by Farshid Roohi. 15 | * TEDxTehran | Copyrights 9/18/20. 16 | */ 17 | class TimeScheduleSectionAdapter : AdapterRecyclerView( 18 | R.layout.row_time_schedule_section, 19 | R.layout.row_loading, 20 | R.layout.row_error, 21 | R.id.btnErrorLoadList 22 | ) { 23 | 24 | override fun onBindView( 25 | viewHolder: ItemViewHolder, 26 | position: Int, 27 | context: Context, 28 | element: DashboardCacheQuery.Section2? 29 | ) { 30 | val itemView = viewHolder.itemView 31 | itemView.txtTitle.text = element?.title() 32 | itemView.txtTime.text = element?.toTime() 33 | 34 | itemView.imgColor.setImageDrawable( 35 | ContextCompat.getDrawable( 36 | context, 37 | element?.type()!!.toShape() 38 | ) 39 | ) 40 | } 41 | 42 | } 43 | 44 | @DrawableRes 45 | fun SectionType.toShape(): Int { 46 | 47 | return when (this) { 48 | SectionType.ACTIVITY -> { 49 | R.drawable.circle_activity 50 | } 51 | SectionType.ENTERTAINMENT -> { 52 | R.drawable.circle_intertaiment 53 | } 54 | SectionType.GENERIC -> { 55 | R.drawable.circle_generic 56 | } 57 | SectionType.PERFORMANCE -> { 58 | R.drawable.circle_performance 59 | } 60 | else -> R.drawable.circle_intertaiment 61 | } 62 | 63 | 64 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/home/timeSchedule/TimeScheduleSessionAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.home.timeSchedule 2 | 3 | import android.content.Context 4 | import co.eventbox.event.R 5 | import co.eventbox.event.utilities.toTime 6 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 7 | import kotlinx.android.synthetic.main.row_time_schedule_session.view.* 8 | import co.eventbox.event.view.AdapterRecyclerView 9 | 10 | /** 11 | * Created by Farshid Roohi. 12 | * TEDxTehran | Copyrights 9/18/20. 13 | */ 14 | class TimeScheduleSessionAdapter : AdapterRecyclerView( 15 | R.layout.row_time_schedule_session, 16 | R.layout.row_loading, 17 | R.layout.row_error, 18 | R.id.btnErrorLoadList 19 | ) { 20 | 21 | override fun onBindView( 22 | viewHolder: ItemViewHolder, 23 | position: Int, 24 | context: Context, 25 | element: DashboardCacheQuery.Session? 26 | ) { 27 | val itemView = viewHolder.itemView 28 | 29 | itemView.txtSessionTitle.text = element?.title() 30 | itemView.txtSessionTime.text = element?.toTime() 31 | 32 | val adapter = TimeScheduleSectionAdapter() 33 | adapter.loadedState(element?.sections()) 34 | itemView.recyclerSection.adapter = adapter 35 | 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/news/NewsAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.news 2 | 3 | import android.content.Context 4 | import co.eventbox.event.R 5 | import co.eventbox.event.listener.NewsOnClickListener 6 | import co.eventbox.event.utilities.load 7 | import co.eventbox.event.utilities.toImageURL 8 | import co.eventbox.event.view.AdapterRecyclerView 9 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 10 | import kotlinx.android.synthetic.main.row_news.view.* 11 | import kotlinx.android.synthetic.main.row_news.view.txtTitle 12 | 13 | /** 14 | * Created by Farshid Roohi. 15 | * TEDxTehran | Copyrights 7/10/20. 16 | */ 17 | class NewsAdapter(var listener: NewsOnClickListener) : AdapterRecyclerView( 18 | R.layout.row_news, 19 | R.layout.row_loading, 20 | R.layout.row_error, 21 | R.id.btnErrorLoadList 22 | ) { 23 | 24 | 25 | override fun onBindView( 26 | viewHolder: ItemViewHolder, 27 | position: Int, 28 | context: Context, 29 | element: DashboardCacheQuery.New? 30 | ) { 31 | val itemView = viewHolder.itemView 32 | 33 | 34 | itemView.txtTitle.text = element?.title() 35 | itemView.txtDesc.text = element?.description() 36 | itemView.imgLogo.load(element?.iconUrl().toImageURL(), R.drawable.placeholdertransparent) 37 | 38 | itemView.cardView.setOnClickListener { 39 | this.listener.onSelected(position, element?.extraLink().toString()) 40 | } 41 | } 42 | 43 | 44 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/news/NewsFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.news 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import co.eventbox.event.R 9 | import co.eventbox.event.listener.NewsOnClickListener 10 | import co.eventbox.event.utilities.gone 11 | import co.eventbox.event.utilities.openBrowser 12 | import co.eventbox.event.viewModel.NewsViewModel 13 | import kotlinx.android.synthetic.main.fragment_news.* 14 | import org.koin.androidx.viewmodel.ext.android.viewModel 15 | 16 | /** 17 | * Created by Farshid Roohi. 18 | * TEDxTehran | Copyrights 2019-09-26. 19 | */ 20 | class NewsFragment : Fragment(), NewsOnClickListener { 21 | 22 | private val newsViewModel: NewsViewModel by viewModel() 23 | 24 | override fun onCreateView( 25 | inflater: LayoutInflater, 26 | container: ViewGroup?, 27 | savedInstanceState: Bundle? 28 | ): View? { 29 | return inflater.inflate(R.layout.fragment_news, container, false) 30 | } 31 | 32 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 33 | super.onViewCreated(view, savedInstanceState) 34 | 35 | val adapter = NewsAdapter(this) 36 | this.recyclerViewNews.adapter = adapter 37 | newsViewModel.newsLiveData.observe(viewLifecycleOwner, { 38 | this.progressBar.gone() 39 | adapter.loadedState(it) 40 | }) 41 | 42 | } 43 | 44 | override fun onSelected(position: Int, url: String) { 45 | context?.openBrowser(url) 46 | } 47 | 48 | 49 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/newtworking/NetworkingFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.newtworking 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import co.eventbox.event.R 9 | import co.eventbox.event.utilities.CustomTabView 10 | import co.eventbox.event.view.newtworking.chat.ChatListFragment 11 | import co.eventbox.event.view.newtworking.profile.ProfileFragment 12 | 13 | 14 | /** 15 | * Created by Mahdi Darvishi. 16 | * TEDxTehran | Copyrights 2021/08. 17 | */ 18 | 19 | class NetworkingFragment : Fragment() { 20 | 21 | lateinit var tabView: CustomTabView 22 | 23 | override fun onCreateView( 24 | inflater: LayoutInflater, 25 | container: ViewGroup?, 26 | savedInstanceState: Bundle? 27 | ): View? { 28 | return inflater.inflate(R.layout.fragment_networking, container, false) 29 | } 30 | 31 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 32 | super.onViewCreated(view, savedInstanceState) 33 | 34 | // (requireActivity() as AppCompatActivity).supportActionBar?.hide() 35 | // (activity as AppCompatActivity?)?.supportActionBar?.hide() 36 | 37 | tabView = CustomTabView( 38 | requireActivity(), 39 | childFragmentManager, 40 | R.id.tabNetworking, 41 | R.id.viewPagerNetworking 42 | ) 43 | tabView.add(ProfileFragment().javaClass, getString(R.string.profile_tab)) 44 | tabView.add(ChatListFragment().javaClass, getString(R.string.chats_tab)) 45 | 46 | 47 | } 48 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/newtworking/auth/RegisterFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.newtworking.auth 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import co.eventbox.event.R 9 | 10 | /** 11 | * Created by Mahdi Darvishi. 12 | * TEDxTehran | Copyrights 2021/08. 13 | */ 14 | 15 | class RegisterFragment : Fragment() { 16 | 17 | override fun onCreateView( 18 | inflater: LayoutInflater, 19 | container: ViewGroup?, 20 | savedInstanceState: Bundle? 21 | ): View? { 22 | return inflater.inflate(R.layout.fragment_register, container, false) 23 | } 24 | 25 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 26 | super.onViewCreated(view, savedInstanceState) 27 | 28 | 29 | 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/newtworking/auth/VerifyFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.newtworking.auth 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import co.eventbox.event.R 9 | 10 | /** 11 | * Created by Mahdi Darvishi. 12 | * TEDxTehran | Copyrights 2021/08. 13 | */ 14 | 15 | class VerifyFragment : Fragment() { 16 | 17 | override fun onCreateView( 18 | inflater: LayoutInflater, 19 | container: ViewGroup?, 20 | savedInstanceState: Bundle? 21 | ): View? { 22 | return inflater.inflate(R.layout.fragment_verify, container, false) 23 | } 24 | 25 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 26 | super.onViewCreated(view, savedInstanceState) 27 | 28 | 29 | 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/newtworking/chat/ChatListFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.newtworking.chat 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import co.eventbox.event.R 9 | 10 | /** 11 | * Created by Mahdi Darvishi. 12 | * TEDxTehran | Copyrights 2021/08. 13 | */ 14 | 15 | class ChatListFragment : Fragment() { 16 | 17 | override fun onCreateView( 18 | inflater: LayoutInflater, 19 | container: ViewGroup?, 20 | savedInstanceState: Bundle? 21 | ): View? { 22 | return inflater.inflate(R.layout.fragment_chatlist, container, false) 23 | } 24 | 25 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 26 | super.onViewCreated(view, savedInstanceState) 27 | 28 | 29 | 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/newtworking/profile/EditProfileFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.newtworking.profile 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import androidx.lifecycle.ViewModelProvider 9 | import androidx.navigation.fragment.findNavController 10 | import co.eventbox.event.R 11 | import co.eventbox.event.model.User 12 | import co.eventbox.event.viewModel.ProfileViewModel 13 | import kotlinx.android.synthetic.main.fragment_edit_profile.* 14 | 15 | /** 16 | * Created by Mahdi Darvishi. 17 | * TEDxTehran | Copyrights 2021/08. 18 | */ 19 | 20 | class EditProfileFragment : Fragment() { 21 | 22 | //lateinit var viewModel: ProfileViewModel 23 | override fun onCreateView( 24 | inflater: LayoutInflater, 25 | container: ViewGroup?, 26 | savedInstanceState: Bundle? 27 | ): View? { 28 | return inflater.inflate(R.layout.fragment_edit_profile, container, false) 29 | } 30 | 31 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 32 | super.onViewCreated(view, savedInstanceState) 33 | 34 | val viewModel = ViewModelProvider(this)[ProfileViewModel::class.java] 35 | 36 | btnEditProfileSave.setOnClickListener { 37 | val story = txtEditProfileStory.text.toString() 38 | val phone = txtEditProfilePhone.text.toString() 39 | val email = txtEditProfileEmail.text.toString() 40 | val name = txtEditProfileFullName.text.toString() 41 | val interested = txtEditProfileInterested.text.toString() 42 | val university = txtEditProfileUniversity.text.toString() 43 | val job = txtEditProfileJob.text.toString() 44 | 45 | val user = User.toUser() 46 | user.story = story 47 | user.phone = phone 48 | user.interested = interested 49 | user.email = email 50 | user.name = name 51 | user.university = university 52 | user.job = job 53 | 54 | viewModel._user.value = user 55 | 56 | findNavController().navigate(R.id.action_editProfileFragment_to_networkingFragment) 57 | 58 | } 59 | 60 | 61 | } 62 | 63 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/newtworking/profile/ProfileFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.newtworking.profile 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import androidx.lifecycle.ViewModelProvider 9 | import androidx.navigation.fragment.findNavController 10 | import co.eventbox.event.R 11 | import co.eventbox.event.viewModel.ProfileViewModel 12 | import kotlinx.android.synthetic.main.fragment_profile.* 13 | 14 | /** 15 | * Created by Mahdi Darvishi. 16 | * TEDxTehran | Copyrights 2021/08. 17 | */ 18 | 19 | class ProfileFragment : Fragment() { 20 | 21 | //lateinit var viewModel: ProfileViewModel 22 | override fun onCreateView( 23 | inflater: LayoutInflater, 24 | container: ViewGroup?, 25 | savedInstanceState: Bundle? 26 | ): View? { 27 | return inflater.inflate(R.layout.fragment_profile, container, false) 28 | } 29 | 30 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 31 | super.onViewCreated(view, savedInstanceState) 32 | 33 | 34 | val viewModel = ViewModelProvider(this)[ProfileViewModel::class.java] 35 | 36 | viewModel._user.observe(viewLifecycleOwner, { 37 | 38 | if (it != null) { 39 | 40 | with(it) { 41 | txtProfileName.text = name 42 | txtProfileStory.text = story 43 | txtProfilePhone.text = phone 44 | txtProfileInterested.text = interested 45 | txtProfileEmail.text = email 46 | txtProfileJob.text = job 47 | txtProfileUnivesity.text = university 48 | } 49 | } 50 | }) 51 | 52 | btnRegisterCode.setOnClickListener { 53 | findNavController().navigate(R.id.action_networkingFragment_to_editProfileFragment) 54 | } 55 | 56 | } 57 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/speakers/SpeakerAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.speakers 2 | 3 | import android.content.Context 4 | import co.eventbox.event.listener.ListOnClickListener 5 | import co.eventbox.event.R 6 | import co.eventbox.event.utilities.loadRadius 7 | import co.eventbox.event.utilities.toImageURL 8 | import co.eventbox.event.view.AdapterRecyclerView 9 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 10 | import kotlinx.android.synthetic.main.row_speaker.view.* 11 | 12 | /** 13 | * Created by Farshid Roohi. 14 | * TEDxTehran | Copyrights 7/10/20. 15 | */ 16 | class SpeakerAdapter(var listener: ListOnClickListener) : AdapterRecyclerView( 17 | R.layout.row_speaker, 18 | R.layout.row_loading, 19 | R.layout.row_error, 20 | R.id.btnErrorLoadList 21 | ) { 22 | 23 | override fun onBindView( 24 | viewHolder: ItemViewHolder, 25 | position: Int, 26 | context: Context, 27 | element: DashboardCacheQuery.Talk? 28 | ) { 29 | val itemView = viewHolder.itemView 30 | 31 | itemView.img_speaker.loadRadius(element?.section()?.image()?.toImageURL()) 32 | itemView.txtTitle.text = element?.title() 33 | 34 | val speakers = arrayListOf() 35 | element?.speakers()?.forEach { 36 | speakers.add(it.title()) 37 | } 38 | itemView.txtSpeakersName.text = speakers.joinToString(", ") 39 | 40 | itemView.layoutRoot.setOnClickListener { 41 | this.listener.onSelected(position,element!!.id().toInt()) 42 | } 43 | } 44 | 45 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/speakers/SpeakerParentAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.speakers 2 | 3 | import android.view.LayoutInflater 4 | import android.view.MotionEvent 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.recyclerview.widget.LinearLayoutManager 8 | import androidx.recyclerview.widget.RecyclerView 9 | import co.eventbox.event.listener.ListOnClickListener 10 | import co.eventbox.event.R 11 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 12 | import kotlinx.android.synthetic.main.fragment_speakers.* 13 | import kotlinx.android.synthetic.main.row_speaker_parent.view.* 14 | 15 | /** 16 | * Created by Farshid Roohi. 17 | * TEDxTehran | Copyrights 6/18/20. 18 | */ 19 | 20 | class SpeakerParentAdapter(var listener: ListOnClickListener) : 21 | RecyclerView.Adapter() { 22 | 23 | private val ITEM_VIEW_TYPE_HEADER = 0 24 | private val ITEM_VIEW_TYPE_ROW = 1 25 | 26 | var items: List = ArrayList() 27 | 28 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 29 | 30 | val inflater = LayoutInflater.from(parent.context) 31 | if (viewType == ITEM_VIEW_TYPE_HEADER) { 32 | val view = inflater.inflate(R.layout.header_row_speakers_list, parent, false) 33 | return HeaderViewHolder(view) 34 | } 35 | 36 | val view = inflater.inflate(R.layout.row_speaker_parent, parent, false) 37 | return RowViewHolder(view) 38 | 39 | } 40 | 41 | override fun getItemCount(): Int { 42 | return items.size 43 | } 44 | 45 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 46 | val itemView = holder.itemView 47 | 48 | when (holder) { 49 | is RowViewHolder -> { 50 | val item = items[position] 51 | itemView.txtTitle.text = item.event()?.title() 52 | val adapterSpeakers = SpeakerAdapter(this.listener) 53 | itemView.recyclerViewChild.adapter = adapterSpeakers 54 | itemView.recyclerViewChild.layoutManager = LinearLayoutManager( 55 | holder.itemView.context, 56 | LinearLayoutManager.HORIZONTAL, 57 | false 58 | ) 59 | 60 | adapterSpeakers.loadedState(item.talks()) 61 | 62 | } 63 | is HeaderViewHolder -> { 64 | val item = items[position] 65 | 66 | // itemView.imgBanner.loadRadius(item.event()?.bannerUrl()?.toImageURL()) 67 | } 68 | } 69 | } 70 | 71 | 72 | override fun getItemViewType(position: Int): Int { 73 | // if (position == 0) { 74 | // return ITEM_VIEW_TYPE_HEADER 75 | // } 76 | return ITEM_VIEW_TYPE_ROW 77 | } 78 | 79 | 80 | class RowViewHolder(view: View) : RecyclerView.ViewHolder(view) 81 | class HeaderViewHolder(view: View) : RecyclerView.ViewHolder(view) 82 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/speakers/SpeakerRelatedAdapter.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.speakers 2 | 3 | import android.content.Context 4 | import co.eventbox.event.listener.ListOnClickListener 5 | import co.eventbox.event.R 6 | import co.eventbox.event.utilities.loadRadius 7 | import co.eventbox.event.utilities.toImageURL 8 | import co.eventbox.event.view.AdapterRecyclerView 9 | import com.apollographql.apollo.co.eventbox.event.GetTalkDetailQuery 10 | import kotlinx.android.synthetic.main.row_speaker.view.* 11 | 12 | /** 13 | * Created by Farshid Roohi. 14 | * TEDxTehran | Copyrights 6/18/20. 15 | */ 16 | class SpeakerRelatedAdapter(var listener: ListOnClickListener) : AdapterRecyclerView( 17 | R.layout.row_speaker, 18 | R.layout.row_progress_view, 19 | R.layout.row_error, 20 | R.id.btnErrorLoadList) { 21 | 22 | override fun onBindView( 23 | viewHolder: ItemViewHolder, 24 | position: Int, 25 | context: Context, 26 | element: GetTalkDetailQuery.SuggestedTalk? 27 | ) { 28 | val itemView = viewHolder.itemView 29 | 30 | itemView.img_speaker.loadRadius(element?.section()?.image()?.toImageURL()) 31 | itemView.txtTitle.text = element?.title() 32 | 33 | val speakers = arrayListOf() 34 | element?.speakers()?.forEach { 35 | speakers.add(it.title()) 36 | } 37 | itemView.txtSpeakersName.text = speakers.joinToString(", ") 38 | 39 | itemView.layoutRoot.setOnClickListener { 40 | this.listener.onSelected(position,element!!.id().toInt()) 41 | } 42 | 43 | } 44 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/speakers/SpeakersDetailsFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.speakers 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.core.os.bundleOf 8 | import androidx.fragment.app.Fragment 9 | import androidx.fragment.app.viewModels 10 | import androidx.navigation.fragment.findNavController 11 | import androidx.recyclerview.widget.LinearLayoutManager 12 | import co.eventbox.event.R 13 | import co.eventbox.event.listener.ListOnClickListener 14 | import co.eventbox.event.utilities.* 15 | import co.eventbox.event.viewModel.SpeakersViewModel 16 | import kotlinx.android.synthetic.main.fragment_speaker_details.* 17 | 18 | /** 19 | * Created by Farshid Roohi. 20 | * TEDxTehran | Copyrights 6/18/20. 21 | */ 22 | class SpeakersDetailsFragment : Fragment(), ListOnClickListener { 23 | 24 | 25 | private val speakersViewModel: SpeakersViewModel by viewModels() 26 | 27 | override fun onCreateView( 28 | inflater: LayoutInflater, 29 | container: ViewGroup?, 30 | savedInstanceState: Bundle? 31 | ): View? { 32 | return inflater.inflate(R.layout.fragment_speaker_details, container, false) 33 | } 34 | 35 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 36 | super.onViewCreated(view, savedInstanceState) 37 | 38 | val id = arguments?.get("speaker_id") as Int 39 | 40 | this.recyclerViewRelated.layoutManager = 41 | LinearLayoutManager(this.context, LinearLayoutManager.HORIZONTAL, true) 42 | val adapter = SpeakerRelatedAdapter(this) 43 | this.recyclerViewRelated.adapter = adapter 44 | this.speakersViewModel.talkDetails(id).observe(viewLifecycleOwner, { either -> 45 | 46 | this.progressBar.gone() 47 | this.layoutRoot.visible() 48 | this.imgPlay.visible() 49 | 50 | 51 | either.fold({ 52 | val talk = it?.talk() 53 | val speakers = arrayListOf() 54 | talk?.speakers()?.forEach { name -> 55 | speakers.add(name.title()) 56 | } 57 | 58 | this.txtTitle.text = talk?.title() 59 | this.txtSpeakersName.text = speakers.joinToString(", ") 60 | this.imgBanner.load(talk?.section()?.image()?.toImageURL()) 61 | this.txtDescription.text = talk?.description() 62 | 63 | adapter.loadedState(it?.suggestedTalks()!!) 64 | 65 | this.layoutPlay.setOnClickListener { 66 | if (!talk?.videoLink().isNullOrEmpty()) { 67 | context?.openBrowser(talk?.videoLink()) 68 | } 69 | } 70 | }, { 71 | 72 | }) 73 | }) 74 | 75 | } 76 | 77 | override fun onSelected(position: Int, id: Int) { 78 | findNavController().navigate( 79 | R.id.action_speakersDetailsFragment_self, 80 | bundleOf("speaker_id" to id) 81 | ) 82 | } 83 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/view/speakers/SpeakersFragment.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.view.speakers 2 | 3 | import android.annotation.SuppressLint 4 | import android.os.Bundle 5 | import android.util.Log 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | import androidx.core.os.bundleOf 10 | import androidx.fragment.app.Fragment 11 | import androidx.lifecycle.ViewModelProvider 12 | import androidx.navigation.fragment.findNavController 13 | import co.eventbox.event.R 14 | import co.eventbox.event.listener.ListOnClickListener 15 | import co.eventbox.event.utilities.gone 16 | import co.eventbox.event.utilities.loadRadius 17 | import co.eventbox.event.utilities.toImageURL 18 | import co.eventbox.event.viewModel.SpeakersViewModel 19 | import kotlinx.android.synthetic.main.fragment_speakers.* 20 | import org.koin.androidx.viewmodel.ext.android.viewModel 21 | 22 | 23 | /** 24 | * Created by Farshid Roohi. 25 | * TEDxTehran | Copyrights 2019-09-26. 26 | */ 27 | class SpeakersFragment : Fragment(), ListOnClickListener { 28 | 29 | private val speakersViewModel: SpeakersViewModel by viewModel() 30 | 31 | override fun onCreateView( 32 | inflater: LayoutInflater, 33 | container: ViewGroup?, 34 | savedInstanceState: Bundle? 35 | ): View? { 36 | return inflater.inflate(R.layout.fragment_speakers, container, false) 37 | } 38 | 39 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 40 | super.onViewCreated(view, savedInstanceState) 41 | 42 | val adapter = SpeakerParentAdapter(this) 43 | 44 | recyclerViewSpeakers.isNestedScrollingEnabled = false 45 | 46 | recyclerViewSpeakers.adapter = adapter 47 | this.speakersViewModel.speakers.observe(viewLifecycleOwner, { either -> 48 | 49 | progressBar.gone() 50 | either.fold({ data -> 51 | 52 | if (data?.talksWithEvent() != null) { 53 | adapter.items = data.talksWithEvent()!! 54 | adapter.notifyDataSetChanged() 55 | } 56 | 57 | this.imgFeatureTalk.loadRadius( 58 | data?.featuredTalk()?.section()?.image()?.toImageURL() 59 | ) 60 | this.imgFeatureTalk.setOnClickListener { 61 | onSelected(0, data?.featuredTalk()?.id()!!.toInt()) 62 | } 63 | }, { 64 | Log.d("TAG", "Exception : ${it.message}") 65 | }) 66 | }) 67 | 68 | 69 | } 70 | 71 | override fun onSelected(position: Int, id: Int) { 72 | findNavController().navigate( 73 | R.id.action_speakersFragment_to_speakersDetailsFragment, 74 | bundleOf("speaker_id" to id) 75 | ) 76 | } 77 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/viewModel/AboutViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.viewModel 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import co.eventbox.event.respository.AboutRepository 6 | import com.apollographql.apollo.co.eventbox.event.GetAboutsQuery 7 | import kotlinx.coroutines.launch 8 | 9 | /** 10 | * Created by Farshid Roohi. 11 | * TEDxTehran | Copyrights 4/17/20. 12 | */ 13 | class AboutViewModel : BaseViewModel() { 14 | 15 | private val repository = AboutRepository() 16 | 17 | fun abouts(): LiveData> { 18 | 19 | val values = MutableLiveData>() 20 | 21 | 22 | launch { 23 | repository.request().fold({ 24 | values.postValue(it?.organizer()?.abouts()) 25 | }, { 26 | values.postValue(null) 27 | }) 28 | 29 | 30 | } 31 | 32 | return values 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/viewModel/BaseViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.viewModel 2 | 3 | import androidx.lifecycle.ViewModel 4 | import kotlinx.coroutines.CoroutineScope 5 | import kotlinx.coroutines.Dispatchers 6 | import kotlin.coroutines.CoroutineContext 7 | 8 | /** 9 | * Created by Farshid Roohi. 10 | * TEDxTehran | Copyrights 4/17/20. 11 | */ 12 | open class BaseViewModel : ViewModel(), CoroutineScope { 13 | 14 | 15 | override val coroutineContext: CoroutineContext 16 | get() = Dispatchers.IO 17 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/viewModel/GalleryViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.viewModel 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import co.eventbox.event.respository.GalleryRepository 6 | import co.eventbox.event.respository.PhotosGalleryRepository 7 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 8 | import com.apollographql.apollo.co.eventbox.event.GetAlbumPhotosQuery 9 | import kotlinx.coroutines.launch 10 | 11 | /** 12 | * Created by Farshid Roohi. 13 | * TEDxTehran | Copyrights 4/17/20. 14 | */ 15 | class GalleryViewModel : BaseViewModel() { 16 | 17 | private val galleryRepository = GalleryRepository() 18 | private val photosGalleryRepository = PhotosGalleryRepository() 19 | 20 | private var _albumsMutableLiveData = MutableLiveData?>() 21 | var albumsLiveData: LiveData?> = _albumsMutableLiveData 22 | 23 | private var _photosMutableLiveData = MutableLiveData?>() 24 | var photosLiveData: LiveData?> = _photosMutableLiveData 25 | 26 | init { 27 | albums() 28 | } 29 | 30 | fun albums() { 31 | launch { 32 | galleryRepository.request().fold({ 33 | _albumsMutableLiveData.postValue(it?.albums()) 34 | }, { 35 | _albumsMutableLiveData.postValue(null) 36 | }) 37 | } 38 | } 39 | 40 | fun photos(id: Int) { 41 | launch { 42 | photosGalleryRepository.request(id).fold({ 43 | _photosMutableLiveData.postValue(it?.album()?.photo()) 44 | }, { 45 | _photosMutableLiveData.postValue(null) 46 | }) 47 | 48 | 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/viewModel/HomeViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.viewModel 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import co.eventbox.event.respository.HomeRepository 6 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 7 | import kotlinx.coroutines.launch 8 | 9 | /** 10 | * Created by Farshid Roohi. 11 | * TEDxTehran | Copyrights 7/10/20. 12 | */ 13 | class HomeViewModel : BaseViewModel() { 14 | 15 | private val repository = HomeRepository() 16 | 17 | private val mainEventMutableLiveData = MutableLiveData() 18 | val mainEventLiveData: LiveData = mainEventMutableLiveData 19 | 20 | 21 | init { 22 | mainEvent() 23 | } 24 | 25 | fun mainEvent() { 26 | launch { 27 | repository.fetch().fold({ 28 | mainEventMutableLiveData.postValue(it?.organizer()?.mainEvent()) 29 | }, { 30 | mainEventMutableLiveData.postValue(null) 31 | }) 32 | 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/viewModel/NewsViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.viewModel 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import co.eventbox.event.respository.GalleryRepository 6 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 7 | import kotlinx.coroutines.launch 8 | 9 | /** 10 | * Created by Farshid Roohi. 11 | * TEDxTehran | Copyrights 7/10/20. 12 | */ 13 | class NewsViewModel : BaseViewModel() { 14 | 15 | private val galleryRepository = GalleryRepository() 16 | 17 | private val newsMutableLiveData = MutableLiveData?>() 18 | val newsLiveData: LiveData?> = newsMutableLiveData 19 | 20 | init { 21 | news() 22 | } 23 | 24 | fun news() { 25 | 26 | launch { 27 | galleryRepository.request().fold({ 28 | newsMutableLiveData.postValue(it?.news()) 29 | }, { 30 | newsMutableLiveData.postValue(null) 31 | }) 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/viewModel/PhotosViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.viewModel 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import co.eventbox.event.respository.GalleryRepository 6 | import co.eventbox.event.respository.PhotosGalleryRepository 7 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 8 | import com.apollographql.apollo.co.eventbox.event.GetAlbumPhotosQuery 9 | import kotlinx.coroutines.launch 10 | 11 | /** 12 | * Created by Farshid Roohi. 13 | * TEDxTehran | Copyrights 4/17/20. 14 | */ 15 | class PhotosViewModel : BaseViewModel() { 16 | 17 | private val galleryRepository = GalleryRepository() 18 | private val photosGalleryRepository = PhotosGalleryRepository() 19 | 20 | private var _photosMutableLiveData = MutableLiveData?>() 21 | var photosLiveData: LiveData?> = _photosMutableLiveData 22 | 23 | fun photos(id: Int) { 24 | launch { 25 | photosGalleryRepository.request(id).fold({ 26 | _photosMutableLiveData.postValue(it?.album()?.photo()) 27 | }, { 28 | _photosMutableLiveData.postValue(null) 29 | }) 30 | 31 | 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/viewModel/ProfileViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.viewModel 2 | 3 | import android.util.Log 4 | import androidx.lifecycle.LiveData 5 | import androidx.lifecycle.MutableLiveData 6 | import co.eventbox.event.model.User 7 | import co.eventbox.event.respository.GalleryRepository 8 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 9 | import kotlinx.coroutines.launch 10 | 11 | /** 12 | * Created by Mahdi Darvishi. 13 | * TEDxTehran | Copyrights 8/10/21. 14 | */ 15 | 16 | class ProfileViewModel : BaseViewModel() { 17 | 18 | 19 | init { 20 | } 21 | val _user = MutableLiveData() 22 | 23 | fun setUser(user: User) { 24 | _user.postValue(user) 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/viewModel/SpeakersViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.viewModel 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import co.eventbox.event.respository.SpeakersDetailsRepository 6 | import co.eventbox.event.respository.SpeakersRepository 7 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 8 | import com.apollographql.apollo.co.eventbox.event.GetTalkDetailQuery 9 | import kotlinx.coroutines.launch 10 | 11 | /** 12 | * Created by Farshid Roohi. 13 | * TEDxTehran | Copyrights 7/24/20. 14 | */ 15 | class SpeakersViewModel : BaseViewModel() { 16 | 17 | private val speakersRepository = SpeakersRepository() 18 | private var speakersDetailsRepository = SpeakersDetailsRepository() 19 | 20 | private var _speakers = MutableLiveData>() 21 | var speakers: LiveData> = _speakers 22 | 23 | init { 24 | speakers() 25 | } 26 | 27 | fun speakers() { 28 | launch { 29 | val either = speakersRepository.fetch() 30 | _speakers.postValue(either) 31 | } 32 | } 33 | 34 | fun talkDetails(id: Int): LiveData> { 35 | val liveData = MutableLiveData>() 36 | 37 | launch { 38 | val either = speakersDetailsRepository.request(id) 39 | liveData.postValue(either) 40 | } 41 | return liveData 42 | } 43 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/viewModel/SplashViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.viewModel 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import co.eventbox.event.respository.CacheDataRepository 6 | import kotlinx.coroutines.launch 7 | 8 | /** 9 | * Created by Farshid Roohi. 10 | * TEDxTehran | Copyrights 4/17/20. 11 | */ 12 | class SplashViewModel : BaseViewModel() { 13 | 14 | private val cacheRepository = CacheDataRepository() 15 | 16 | fun cacheData(): LiveData { 17 | this.cacheRepository.clearCache() 18 | val mutableLiveDataTest = MutableLiveData() 19 | launch { 20 | val either = cacheRepository.request() 21 | 22 | either.fold({ 23 | mutableLiveDataTest.postValue(it != null) 24 | },{ 25 | mutableLiveDataTest.postValue(false) 26 | }) 27 | } 28 | 29 | return mutableLiveDataTest 30 | 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/viewModel/SponsorsViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.viewModel 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import co.eventbox.event.respository.SponsorsRepository 6 | import com.apollographql.apollo.co.eventbox.event.GetEventSponsorsQuery 7 | import kotlinx.coroutines.launch 8 | 9 | /** 10 | * Created by Farshid Roohi. 11 | * TEDxTehran | Copyrights 4/17/20. 12 | */ 13 | class SponsorsViewModel : BaseViewModel() { 14 | 15 | private val repository = SponsorsRepository() 16 | 17 | fun sponsors(eventID:Int): LiveData> { 18 | 19 | val values = MutableLiveData>() 20 | 21 | launch { 22 | repository.request(eventID).fold({ 23 | values.postValue(it?.sponsorsWithType()) 24 | }, { 25 | values.postValue(null) 26 | }) 27 | } 28 | 29 | return values 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /app/src/main/java/co/eventbox/event/viewModel/TimeScheduleViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.eventbox.event.viewModel 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import co.eventbox.event.respository.TimeScheduleRepository 6 | import com.apollographql.apollo.co.eventbox.event.DashboardCacheQuery 7 | import kotlinx.coroutines.launch 8 | 9 | /** 10 | * Created by Farshid Roohi. 11 | * TEDxTehran | Copyrights 4/17/20. 12 | */ 13 | class TimeScheduleViewModel : BaseViewModel() { 14 | 15 | private val repository = TimeScheduleRepository() 16 | 17 | private val daysMutableLiveData = MutableLiveData?>() 18 | val daysLiveData: LiveData?> = daysMutableLiveData 19 | 20 | init { 21 | days() 22 | } 23 | 24 | fun days() { 25 | 26 | launch { 27 | repository.request().fold({ 28 | daysMutableLiveData.postValue(it?.organizer()?.mainEvent()?.days()) 29 | }, { 30 | daysMutableLiveData.postValue(null) 31 | }) 32 | } 33 | 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-hdpi/ic_gallery.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-hdpi/ic_home.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_networking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-hdpi/ic_networking.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-hdpi/ic_news.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-hdpi/ic_profile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_speakers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-hdpi/ic_speakers.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-ldpi/ic_gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-ldpi/ic_gallery.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-ldpi/ic_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-ldpi/ic_home.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-ldpi/ic_networking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-ldpi/ic_networking.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-ldpi/ic_news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-ldpi/ic_news.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-ldpi/ic_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-ldpi/ic_profile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-ldpi/ic_speakers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-ldpi/ic_speakers.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-mdpi/ic_gallery.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-mdpi/ic_home.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_networking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-mdpi/ic_networking.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-mdpi/ic_news.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-mdpi/ic_profile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_speakers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-mdpi/ic_speakers.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_tedxtehran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-v24/ic_tedxtehran.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xhdpi/ic_gallery.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xhdpi/ic_home.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_networking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xhdpi/ic_networking.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xhdpi/ic_news.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xhdpi/ic_profile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_speakers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xhdpi/ic_speakers.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxhdpi/ic_gallery.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxhdpi/ic_home.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_networking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxhdpi/ic_networking.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxhdpi/ic_news.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxhdpi/ic_profile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_speakers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxhdpi/ic_speakers.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxxhdpi/ic_gallery.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxxhdpi/ic_home.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_networking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxxhdpi/ic_networking.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxxhdpi/ic_news.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxxhdpi/ic_profile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_speakers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable-xxxhdpi/ic_speakers.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_sheet_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_generic.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_intertaiment.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_performance.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_talk.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dark_shadow_cover.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/favorites_chip.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_account_circle_black.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_access_time_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_directions_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_home.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_info.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_insert_link.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_library_books.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_live_tv.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_location_on_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_photo_library.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_play_circle_outline.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_video_library.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_calling.xml: -------------------------------------------------------------------------------- 1 | 6 | 14 | 21 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_message.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_phone.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_ticket.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/indicator_bottom_sheet.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable/placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/placeholdertransparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/drawable/placeholdertransparent.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/red_rectangle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_radius_20dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_layout_indicator.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | 10 | 15 | 16 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/font/shabnam.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/font/shabnam.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/shabnam_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TEDxTehran-Team/event-app-android/7e943f10d0efbec603306e6ecbf1784989ead23a/app/src/main/res/font/shabnam_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_about_us.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 21 | 22 | 26 | 27 | 35 | 36 | 37 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 54 | 55 | 60 | 61 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 19 | 20 | 30 | 31 |