From 6b378cf459f1a84a23869f07273430e17547f2ba Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 15:24:05 +0330 Subject: [PATCH 01/80] initial commit --- .gitignore | 20 ++ app/.gitignore | 1 + app/build.gradle | 43 ++++ app/proguard-rules.pro | 21 ++ .../mymoviesapp/ExampleInstrumentedTest.kt | 24 +++ app/src/main/AndroidManifest.xml | 23 +++ .../hashem/mymoviesapp/MainActivity.kt | 11 ++ .../drawable-v24/ic_launcher_foreground.xml | 30 +++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++ app/src/main/res/layout/activity_main.xml | 18 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes app/src/main/res/values-night/themes.xml | 16 ++ app/src/main/res/values/colors.xml | 10 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/themes.xml | 16 ++ .../hashem/mymoviesapp/ExampleUnitTest.kt | 17 ++ build.gradle | 18 ++ gradle.properties | 21 ++ gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++++++++++++ gradlew.bat | 89 +++++++++ settings.gradle | 10 + 33 files changed, 762 insertions(+) create mode 100644 .gitignore create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/mousavi/hashem/mymoviesapp/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/MainActivity.kt create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/test/java/com/mousavi/hashem/mymoviesapp/ExampleUnitTest.kt create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ebd43db0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +/.idea/.gitignore +/.idea/compiler.xml +/.idea/gradle.xml +/.idea/misc.xml +/.idea/vcs.xml diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 00000000..30d48a01 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,43 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' +} + +android { + compileSdk 31 + + defaultConfig { + applicationId "com.mousavi.hashem.mymoviesapp" + minSdk 21 + targetSdk 31 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.0' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.2' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/mousavi/hashem/mymoviesapp/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/mousavi/hashem/mymoviesapp/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..f3929bd7 --- /dev/null +++ b/app/src/androidTest/java/com/mousavi/hashem/mymoviesapp/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.mousavi.hashem.mymoviesapp + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.mousavi.hashem.mymoviesapp", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..dfe0c6b5 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/MainActivity.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/MainActivity.kt new file mode 100644 index 00000000..d12b7673 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/MainActivity.kt @@ -0,0 +1,11 @@ +package com.mousavi.hashem.mymoviesapp + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..07d5da9c --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..4fc24441 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..eca70cfe --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..eca70cfe --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c209e78ecd372343283f4157dcfd918ec5165bb3 GIT binary patch literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9 GIT binary patch literal 2898 zcmV-Y3$650Nk&FW3jhFDMM6+kP&il$0000G0000-002h-06|PpNWB9900E$G+qN-D z+81ABX7q?;bwx%xBg?kcwr$(C-Tex-ZCkHUw(Y9#+`E5-zuONG5fgw~E2WDng@Bc@ z24xy+R1n%~6xI#u9vJ8zREI)sb<&Il(016}Z~V1n^PU3-_H17A*Bf^o)&{_uBv}Py zulRfeE8g(g6HFhk_?o_;0@tz?1I+l+Y#Q*;RVC?(ud`_cU-~n|AX-b`JHrOIqn(-t&rOg-o`#C zh0LPxmbOAEb;zHTu!R3LDh1QO zZTf-|lJNUxi-PpcbRjw3n~n-pG;$+dIF6eqM5+L();B2O2tQ~|p{PlpNcvDbd1l%c zLtXn%lu(3!aNK!V#+HNn_D3lp z2%l+hK-nsj|Bi9;V*WIcQRTt5j90A<=am+cc`J zTYIN|PsYAhJ|=&h*4wI4ebv-C=Be#u>}%m;a{IGmJDU`0snWS&$9zdrT(z8#{OZ_Y zxwJx!ZClUi%YJjD6Xz@OP8{ieyJB=tn?>zaI-4JN;rr`JQbb%y5h2O-?_V@7pG_+y z(lqAsqYr!NyVb0C^|uclHaeecG)Sz;WV?rtoqOdAAN{j%?Uo%owya(F&qps@Id|Of zo@~Y-(YmfB+chv^%*3g4k3R0WqvuYUIA+8^SGJ{2Bl$X&X&v02>+0$4?di(34{pt* zG=f#yMs@Y|b&=HyH3k4yP&goF2LJ#tBLJNNDo6lG06r}ghC-pC4Q*=x3;|+W04zte zAl>l4kzUBQFYF(E`KJy?ZXd1tnfbH+Z~SMmA21KokJNs#eqcXWKUIC>{TuoKe^vhF z);H)o`t9j~`$h1D`#bxe@E`oE`cM9w(@)5Bp8BNukIwM>wZHfd0S;5bcXA*5KT3bj zc&_~`&{z7u{Et!Z_k78H75gXf4g8<_ul!H$eVspPeU3j&&Au=2R*Zp#M9$9s;fqwgzfiX=E_?BwVcfx3tG9Q-+<5fw z%Hs64z)@Q*%s3_Xd5>S4dg$s>@rN^ixeVj*tqu3ZV)biDcFf&l?lGwsa zWj3rvK}?43c{IruV2L`hUU0t^MemAn3U~x3$4mFDxj=Byowu^Q+#wKRPrWywLjIAp z9*n}eQ9-gZmnd9Y0WHtwi2sn6n~?i#n9VN1B*074_VbZZ=WrpkMYr{RsI ztM_8X1)J*DZejxkjOTRJ&a*lrvMKBQURNP#K)a5wIitfu(CFYV4FT?LUB$jVwJSZz zNBFTWg->Yk0j&h3e*a5>B=-xM7dE`IuOQna!u$OoxLlE;WdrNlN)1 z7**de7-hZ!(%_ZllHBLg`Ir#|t>2$*xVOZ-ADZKTN?{(NUeLU9GbuG-+Axf*AZ-P1 z0ZZ*fx+ck4{XtFsbcc%GRStht@q!m*ImssGwuK+P@%gEK!f5dHymg<9nSCXsB6 zQ*{<`%^bxB($Z@5286^-A(tR;r+p7B%^%$N5h%lb*Vlz-?DL9x;!j<5>~kmXP$E}m zQV|7uv4SwFs0jUervsxVUm>&9Y3DBIzc1XW|CUZrUdb<&{@D5yuLe%Xniw^x&{A2s z0q1+owDSfc3Gs?ht;3jw49c#mmrViUfX-yvc_B*wY|Lo7; zGh!t2R#BHx{1wFXReX*~`NS-LpSX z#TV*miO^~B9PF%O0huw!1Zv>^d0G3$^8dsC6VI!$oKDKiXdJt{mGkyA`+Gwd4D-^1qtNTUK)`N*=NTG-6}=5k6suNfdLt*dt8D| z%H#$k)z#ZRcf|zDWB|pn<3+7Nz>?WW9WdkO5(a^m+D4WRJ9{wc>Y}IN)2Kbgn;_O? zGqdr&9~|$Y0tP=N(k7^Eu;iO*w+f%W`20BNo)=Xa@M_)+o$4LXJyiw{F?a633SC{B zl~9FH%?^Rm*LVz`lkULs)%idDX^O)SxQol(3jDRyBVR!7d`;ar+D7do)jQ}m`g$TevUD5@?*P8)voa?kEe@_hl{_h8j&5eB-5FrYW&*FHVt$ z$kRF9Nstj%KRzpjdd_9wO=4zO8ritN*NPk_9avYrsF(!4))tm{Ga#OY z(r{0buexOzu7+rw8E08Gxd`LTOID{*AC1m*6Nw@osfB%0oBF5sf<~wH1kL;sd zo)k6^VyRFU`)dt*iX^9&QtWbo6yE8XXH?`ztvpiOLgI3R+=MOBQ9=rMVgi<*CU%+d1PQQ0a1U=&b0vkF207%xU0ssI2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f0f1d64e58ba64d180ce43ee13bf9a17835fbca GIT binary patch literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0 GIT binary patch literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f GIT binary patch literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 00000000..6d262652 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..f8c6127d --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..e5f33ac8 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + MyMoviesApp + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 00000000..db84acbc --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/test/java/com/mousavi/hashem/mymoviesapp/ExampleUnitTest.kt b/app/src/test/java/com/mousavi/hashem/mymoviesapp/ExampleUnitTest.kt new file mode 100644 index 00000000..0b358f28 --- /dev/null +++ b/app/src/test/java/com/mousavi/hashem/mymoviesapp/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.mousavi.hashem.mymoviesapp + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..7f88f48e --- /dev/null +++ b/build.gradle @@ -0,0 +1,18 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath "com.android.tools.build:gradle:7.0.4" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0" + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..98bed167 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..cf8bddd8 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Dec 24 15:13:54 IRST 2021 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..4f906e0c --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..d5f019d9 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + jcenter() // Warning: this repository is going to shut down soon + } +} +rootProject.name = "MyMoviesApp" +include ':app' From 06d58a46aae6117c7a2b4eae24f1bc881e421ce5 Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 15:31:31 +0330 Subject: [PATCH 02/80] add dependencies --- app/build.gradle | 46 +++++++++++++++++++++++++++++++++++++++++++++- build.gradle | 1 + 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 30d48a01..4723cc0b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,9 @@ plugins { id 'com.android.application' id 'kotlin-android' + id 'kotlin-kapt' + id 'dagger.hilt.android.plugin' + id 'kotlin-android-extensions' } android { @@ -33,10 +36,51 @@ android { dependencies { + //androidx dependencies + implementation 'androidx.fragment:fragment-ktx:1.4.0' implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.0' - implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.2' + + //material + implementation 'com.google.android.material:material:1.4.0' + + //Retrofit + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' + implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3' + + //Gson + implementation 'com.google.code.gson:gson:2.8.9' + + // Coroutines + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2' + + // Coroutine Lifecycle Scopes + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0" + + //Dagger - Hilt + implementation "com.google.dagger:hilt-android:2.38.1" + kapt "com.google.dagger:hilt-android-compiler:2.38.1" + implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03" + kapt "androidx.hilt:hilt-compiler:1.0.0" + + //Navigation Component + def nav_version = "2.4.0-rc01" + implementation("androidx.navigation:navigation-fragment-ktx:$nav_version") + implementation("androidx.navigation:navigation-ui-ktx:$nav_version") + + // Room + implementation "androidx.room:room-runtime:2.4.0" + kapt "androidx.room:room-compiler:2.4.0" + // Kotlin Extensions and Coroutines support for Room + implementation "androidx.room:room-ktx:2.3.0" + + //ImageLoader + implementation("io.coil-kt:coil:1.4.0") + testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/build.gradle b/build.gradle index 7f88f48e..42881210 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ buildscript { dependencies { classpath "com.android.tools.build:gradle:7.0.4" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0" + classpath "com.google.dagger:hilt-android-gradle-plugin:2.38.1" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From eaa3f49f06bc6e7a8718d54987b242f0ea66f2d9 Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 15:42:41 +0330 Subject: [PATCH 03/80] add Dtos(Data Transfer Objects) --- app/src/main/AndroidManifest.xml | 2 +- .../mymoviesapp/data/remote/dto/GenresDto.kt | 15 +++++++ .../data/remote/dto/PageDataDto.kt | 45 +++++++++++++++++++ .../{ => presentaion}/MainActivity.kt | 3 +- app/src/main/res/layout/activity_main.xml | 2 +- 5 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt rename app/src/main/java/com/mousavi/hashem/mymoviesapp/{ => presentaion}/MainActivity.kt (74%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dfe0c6b5..4b40a5ae 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ android:supportsRtl="true" android:theme="@style/Theme.MyMoviesApp"> diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt new file mode 100644 index 00000000..0d36b674 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt @@ -0,0 +1,15 @@ +package com.mousavi.hashem.mymoviesapp.data.remote.dto + +import com.google.gson.annotations.SerializedName + +data class GenresDto( + @SerializedName("genres") + val genres: List, +) + +data class GenreDto( + @SerializedName("id") + val id: Int, + @SerializedName("name") + val name: String, +) \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt new file mode 100644 index 00000000..3bdfca52 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt @@ -0,0 +1,45 @@ +package com.mousavi.hashem.mymoviesapp.data.remote.dto + +import com.google.gson.annotations.SerializedName + +data class PageDataDto( + @SerializedName("page") + val page: Int, + @SerializedName("results") + val movies: List, + @SerializedName("total_pages") + val totalPages: Int, + @SerializedName("total_results") + val totalResults: Int, +) + +data class MovieDto( + @SerializedName("adult") + val adult: Boolean, + @SerializedName("backdrop_path") + val backdropPath: String?, + @SerializedName("genre_ids") + val genreIds: List, + @SerializedName("id") + val id: Int, + @SerializedName("original_language") + val originalLanguage: String, + @SerializedName("original_title") + val originalTitle: String, + @SerializedName("overview") + val overview: String, + @SerializedName("popularity") + val popularity: Double, + @SerializedName("poster_path") + val posterPath: String?, + @SerializedName("release_date") + val releaseDate: String?, + @SerializedName("title") + val title: String, + @SerializedName("video") + val video: Boolean, + @SerializedName("vote_average") + val voteAverage: Double, + @SerializedName("vote_count") + val voteCount: Int, +) \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/MainActivity.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt similarity index 74% rename from app/src/main/java/com/mousavi/hashem/mymoviesapp/MainActivity.kt rename to app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt index d12b7673..7afb9581 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/MainActivity.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt @@ -1,7 +1,8 @@ -package com.mousavi.hashem.mymoviesapp +package com.mousavi.hashem.mymoviesapp.presentaion import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import com.mousavi.hashem.mymoviesapp.R class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4fc24441..9c12b24e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context=".presentaion.MainActivity"> Date: Fri, 24 Dec 2021 15:46:52 +0330 Subject: [PATCH 04/80] define repository --- .../mymoviesapp/data/repository/MoviesRepositoryImpl.kt | 5 +++++ .../mymoviesapp/domain/repository/MoviesRepository.kt | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt new file mode 100644 index 00000000..6e83c5a3 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt @@ -0,0 +1,5 @@ +package com.mousavi.hashem.mymoviesapp.data.repository + +import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository + +class MoviesRepositoryImpl : MoviesRepository \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt new file mode 100644 index 00000000..19b0efc2 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt @@ -0,0 +1,6 @@ +package com.mousavi.hashem.mymoviesapp.domain.repository + +interface MoviesRepository { + + +} \ No newline at end of file From 27427876dc9644ba819493f59d35a5986654f5d3 Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 15:50:54 +0330 Subject: [PATCH 05/80] define domain data models --- .../hashem/mymoviesapp/domain/model/Genres.kt | 10 ++++++++ .../mymoviesapp/domain/model/PageData.kt | 25 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/Genres.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/PageData.kt diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/Genres.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/Genres.kt new file mode 100644 index 00000000..3e9f2b11 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/Genres.kt @@ -0,0 +1,10 @@ +package com.mousavi.hashem.mymoviesapp.domain.model + +data class Genres( + val genres: List +) + +data class Genre( + val id: Int, + val name: String +) \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/PageData.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/PageData.kt new file mode 100644 index 00000000..ae9d7152 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/PageData.kt @@ -0,0 +1,25 @@ +package com.mousavi.hashem.mymoviesapp.domain.model + +data class PageData( + val page: Int, + val movies: MutableList, + val totalPages: Int, + val totalResults: Int, +) + +data class Movie( + val adult: Boolean = false, + val backdropPath: String? = null, + val genreIds: List = emptyList(), + val id: Int = -1, + val originalLanguage: String = "", + val originalTitle: String = "", + val overview: String = "", + val popularity: Double = 0.0, + val posterPath: String? = null, + val releaseDate: String? = null, + val title: String = "", + val video: Boolean = false, + val voteAverage: Double = 0.0, + val voteCount: Int = 0, +) From 75069d8dfa90eaf26d51602b9deae1f6f4c63ac5 Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 15:54:09 +0330 Subject: [PATCH 06/80] add hilt structure --- app/src/main/AndroidManifest.xml | 1 + .../java/com/mousavi/hashem/mymoviesapp/MoviesApp.kt | 7 +++++++ .../com/mousavi/hashem/mymoviesapp/di/AppModule.kt | 10 ++++++++++ 3 files changed, 18 insertions(+) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/MoviesApp.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4b40a5ae..0a538afb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="com.mousavi.hashem.mymoviesapp"> Date: Fri, 24 Dec 2021 16:06:34 +0330 Subject: [PATCH 07/80] add api infrastructure(Retrofit and OkHttp configuration) --- .../hashem/mymoviesapp/data/remote/Api.kt | 24 ++++++++ .../hashem/mymoviesapp/di/AppModule.kt | 61 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/Api.kt diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/Api.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/Api.kt new file mode 100644 index 00000000..4020dd2f --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/Api.kt @@ -0,0 +1,24 @@ +package com.mousavi.hashem.mymoviesapp.data.remote + +import com.mousavi.hashem.mymoviesapp.data.remote.dto.GenresDto +import com.mousavi.hashem.mymoviesapp.data.remote.dto.PageDataDto +import retrofit2.http.GET +import retrofit2.http.Query + +interface Api { + + companion object { + const val BASE_URL = "https://api.themoviedb.org/3/" + const val API_KEY = "7457b8e2de9fbd83fe4e24eaa79912f2" + const val IMAGE_BASE_URL = "https://image.tmdb.org/t/p/w500" + } + + @GET("movie/popular") + suspend fun getPopularMovies( + @Query("language") language: String, + @Query("page") page: Int, + ): PageDataDto + + @GET("genre/movie/list") + suspend fun getGenres(): GenresDto +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt index c95b206f..dbb51b3e 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt @@ -1,10 +1,71 @@ package com.mousavi.hashem.mymoviesapp.di +import android.util.Log +import com.mousavi.hashem.mymoviesapp.BuildConfig +import com.mousavi.hashem.mymoviesapp.data.remote.Api +import com.mousavi.hashem.mymoviesapp.data.remote.Api.Companion.API_KEY +import com.mousavi.hashem.mymoviesapp.data.remote.Api.Companion.BASE_URL import dagger.Module +import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.Response +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.util.concurrent.TimeUnit +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object AppModule { + + @Provides + @Singleton + fun provideOkHttp(): OkHttpClient { + val logging = HttpLoggingInterceptor { message -> + Log.d("okHttpLog", message) + }.apply { + setLevel( + if (BuildConfig.DEBUG) { + HttpLoggingInterceptor.Level.BASIC + } else { + HttpLoggingInterceptor.Level.NONE + } + ) + } + + return OkHttpClient.Builder() + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(60, TimeUnit.SECONDS) + .writeTimeout(60, TimeUnit.SECONDS) + .addInterceptor { chain -> + return@addInterceptor addApiKeyToRequests(chain) + } + .addInterceptor(logging) + .build() + } + + @Provides + @Singleton + fun provideRetrofitApi(client: OkHttpClient): Api { + return Retrofit + .Builder() + .baseUrl(BASE_URL) + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(Api::class.java) + } +} + +private fun addApiKeyToRequests(chain: Interceptor.Chain): Response { + val request = chain.request().newBuilder() + val originalHttpUrl = chain.request().url + val newUrl = originalHttpUrl.newBuilder() + .addQueryParameter("api_key", API_KEY).build() + request.url(newUrl) + return chain.proceed(request.build()) } \ No newline at end of file From 02940431aca47d389ca08094464c96b2b0427483 Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 16:44:35 +0330 Subject: [PATCH 08/80] add dto to domain data mapping functions --- .../mymoviesapp/data/remote/dto/GenresDto.kt | 19 ++++++- .../data/remote/dto/PageDataDto.kt | 49 ++++++++++++++++++- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt index 0d36b674..77abc885 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt @@ -1,15 +1,30 @@ package com.mousavi.hashem.mymoviesapp.data.remote.dto import com.google.gson.annotations.SerializedName +import com.mousavi.hashem.mymoviesapp.domain.model.Genre +import com.mousavi.hashem.mymoviesapp.domain.model.Genres data class GenresDto( @SerializedName("genres") val genres: List, -) +) { + fun toGenres(): Genres { + return Genres( + genres = genres.map { it.toGenre() } + ) + } +} data class GenreDto( @SerializedName("id") val id: Int, @SerializedName("name") val name: String, -) \ No newline at end of file +){ + fun toGenre(): Genre { + return Genre( + id = id, + name = name + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt index 3bdfca52..2bdc1d9f 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt @@ -1,6 +1,10 @@ package com.mousavi.hashem.mymoviesapp.data.remote.dto import com.google.gson.annotations.SerializedName +import com.mousavi.hashem.mymoviesapp.data.remote.Api +import com.mousavi.hashem.mymoviesapp.domain.model.Genres +import com.mousavi.hashem.mymoviesapp.domain.model.Movie +import com.mousavi.hashem.mymoviesapp.domain.model.PageData data class PageDataDto( @SerializedName("page") @@ -11,7 +15,16 @@ data class PageDataDto( val totalPages: Int, @SerializedName("total_results") val totalResults: Int, -) +) { + fun toPageData(genres: Genres): PageData { + return PageData( + page = page, + movies = movies.map { it.toMovie(genres) }.toMutableList(), + totalPages = totalPages, + totalResults = totalResults + ) + } +} data class MovieDto( @SerializedName("adult") @@ -42,4 +55,36 @@ data class MovieDto( val voteAverage: Double, @SerializedName("vote_count") val voteCount: Int, -) \ No newline at end of file +){ + fun toMovie(genres: Genres): Movie { + return Movie( + adult = adult, + backdropPath = Api.IMAGE_BASE_URL + backdropPath, + genreIds = mapGenreIdToName(genreIds, genres), + id = id, + originalLanguage = originalLanguage, + originalTitle = originalTitle, + overview = overview, + popularity = popularity, + posterPath = Api.IMAGE_BASE_URL + posterPath, + releaseDate = releaseDate, + title = title, + video = video, + voteAverage = voteAverage, + voteCount = voteCount + ) + } + + private fun mapGenreIdToName(list: List, genres: Genres): List { + val genreNames = mutableListOf() + + genres.genres.forEach { genre -> + list.forEach { id-> + if (id == genre.id){ + genreNames.add(genre.name) + } + } + } + return genreNames + } +} \ No newline at end of file From acd2f66beb74f93c6ad43db5a8868ba14b2f900f Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 16:45:13 +0330 Subject: [PATCH 09/80] implement network calls --- .../java/com/mousavi/hashem/common/Either.kt | 7 ++++ .../data/remote/NetworkDataSource.kt | 15 +++++++ .../data/remote/NetworkDataSourceImpl.kt | 41 +++++++++++++++++++ .../data/repository/MoviesRepositoryImpl.kt | 40 +++++++++++++++++- .../hashem/mymoviesapp/di/AppModule.kt | 16 ++++++++ .../domain/repository/MoviesRepository.kt | 9 ++++ 6 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/mousavi/hashem/common/Either.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSource.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSourceImpl.kt diff --git a/app/src/main/java/com/mousavi/hashem/common/Either.kt b/app/src/main/java/com/mousavi/hashem/common/Either.kt new file mode 100644 index 00000000..54a9c6f0 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/common/Either.kt @@ -0,0 +1,7 @@ +package com.mousavi.hashem.common + +sealed class Either { + data class Success(val data: T) : Either() + + data class Error(val error: E) : Either() +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSource.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSource.kt new file mode 100644 index 00000000..dfcc0cf0 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSource.kt @@ -0,0 +1,15 @@ +package com.mousavi.hashem.mymoviesapp.data.remote + +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.data.remote.dto.GenresDto +import com.mousavi.hashem.mymoviesapp.data.remote.dto.PageDataDto + +interface NetworkDataSource { + + suspend fun getPopularMovies( + language: String, + page: Int, + ): Either + + suspend fun getGenres(): Either +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSourceImpl.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSourceImpl.kt new file mode 100644 index 00000000..e2bd4a66 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSourceImpl.kt @@ -0,0 +1,41 @@ +package com.mousavi.hashem.mymoviesapp.data.remote + +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.data.remote.dto.GenresDto +import com.mousavi.hashem.mymoviesapp.data.remote.dto.PageDataDto +import retrofit2.HttpException +import java.io.IOException + +class NetworkDataSourceImpl( + private val api: Api, +) : NetworkDataSource { + + override suspend fun getPopularMovies( + language: String, + page: Int, + ): Either { + return try { + val popularMovies = api.getPopularMovies(language, page) + Either.Success(popularMovies) + } catch (e: HttpException) { + Either.Error(error = e.message ?: "Error occurred") + } catch (e: IOException) { + Either.Error(error = e.message ?: "Check your internet connection!") + } catch (e: Exception) { + Either.Error(error = e.message ?: "Unknown error!") + } + } + + override suspend fun getGenres(): Either { + return try { + val genresDto = api.getGenres() + Either.Success(genresDto) + } catch (e: HttpException) { + Either.Error(error = e.message ?: "Error occurred") + } catch (e: IOException) { + Either.Error(error = e.message ?: "Check your internet connection!") + } catch (e: Exception) { + Either.Error(error = e.message ?: "Unknown error!") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt index 6e83c5a3..2c2a6e3f 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt @@ -1,5 +1,43 @@ package com.mousavi.hashem.mymoviesapp.data.repository +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.data.remote.NetworkDataSource +import com.mousavi.hashem.mymoviesapp.domain.model.Genres +import com.mousavi.hashem.mymoviesapp.domain.model.PageData import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository +import java.util.concurrent.atomic.AtomicReference -class MoviesRepositoryImpl : MoviesRepository \ No newline at end of file +class MoviesRepositoryImpl( + private val networkDataSource: NetworkDataSource, + ) : MoviesRepository { + + //Nothing make cachedGenres null, but in future it's maybe the case, so we use atomic version + private val cachedGenres = AtomicReference() + + override suspend fun getPopularMovies(language: String, page: Int): Either { + return when (val popularMovies = networkDataSource.getPopularMovies(language, page)) { + is Either.Success -> { + Either.Success(popularMovies.data.toPageData(cachedGenres.get())) + } + is Either.Error -> { + Either.Error(popularMovies.error) + } + } + } + + override suspend fun getGenres(): Either { + val genresCached = cachedGenres.get() + if (genresCached != null) { + return Either.Success(genresCached) + } + return when (val genres = networkDataSource.getGenres()) { + is Either.Success -> { + cachedGenres.set(genres.data.toGenres()) + Either.Success(genres.data.toGenres()) + } + is Either.Error -> { + Either.Error(genres.error) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt index dbb51b3e..10abfefd 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt @@ -5,6 +5,10 @@ import com.mousavi.hashem.mymoviesapp.BuildConfig import com.mousavi.hashem.mymoviesapp.data.remote.Api import com.mousavi.hashem.mymoviesapp.data.remote.Api.Companion.API_KEY import com.mousavi.hashem.mymoviesapp.data.remote.Api.Companion.BASE_URL +import com.mousavi.hashem.mymoviesapp.data.remote.NetworkDataSource +import com.mousavi.hashem.mymoviesapp.data.remote.NetworkDataSourceImpl +import com.mousavi.hashem.mymoviesapp.data.repository.MoviesRepositoryImpl +import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -59,6 +63,18 @@ object AppModule { .build() .create(Api::class.java) } + + @Provides + @Singleton + fun provideNetworkDataSource(api: Api): NetworkDataSource { + return NetworkDataSourceImpl(api) + } + + @Provides + @Singleton + fun provideMoviesRepository(repository: MoviesRepositoryImpl): MoviesRepository { + return repository + } } private fun addApiKeyToRequests(chain: Interceptor.Chain): Response { diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt index 19b0efc2..40a443ca 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt @@ -1,6 +1,15 @@ package com.mousavi.hashem.mymoviesapp.domain.repository +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.domain.model.Genres +import com.mousavi.hashem.mymoviesapp.domain.model.PageData + interface MoviesRepository { + suspend fun getPopularMovies( + language: String, + page: Int, + ): Either + suspend fun getGenres(): Either } \ No newline at end of file From 5ecf3ec2e67eaf81fcf2028664251491da4763ba Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 16:57:44 +0330 Subject: [PATCH 10/80] create use cases --- .../com/mousavi/hashem/mymoviesapp/di/AppModule.kt | 14 ++++++++++++++ .../mymoviesapp/domain/usecases/GetGenres.kt | 14 ++++++++++++++ .../domain/usecases/GetPopularMovies.kt | 13 +++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetGenres.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetPopularMovies.kt diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt index 10abfefd..48800e9d 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt @@ -9,6 +9,8 @@ import com.mousavi.hashem.mymoviesapp.data.remote.NetworkDataSource import com.mousavi.hashem.mymoviesapp.data.remote.NetworkDataSourceImpl import com.mousavi.hashem.mymoviesapp.data.repository.MoviesRepositoryImpl import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository +import com.mousavi.hashem.mymoviesapp.domain.usecases.GetGenres +import com.mousavi.hashem.mymoviesapp.domain.usecases.GetPopularMovies import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -75,6 +77,18 @@ object AppModule { fun provideMoviesRepository(repository: MoviesRepositoryImpl): MoviesRepository { return repository } + + @Provides + @Singleton + fun provideGetPopularMoviesUseCase(repository: MoviesRepository): GetPopularMovies { + return GetPopularMovies(repository) + } + + @Provides + @Singleton + fun provideGetGenresUseCase(repository: MoviesRepository): GetGenres { + return GetGenres(repository) + } } private fun addApiKeyToRequests(chain: Interceptor.Chain): Response { diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetGenres.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetGenres.kt new file mode 100644 index 00000000..a58c38ae --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetGenres.kt @@ -0,0 +1,14 @@ +package com.mousavi.hashem.mymoviesapp.domain.usecases + +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.domain.model.Genres +import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository + +class GetGenres( + private val repository: MoviesRepository, +) { + + suspend operator fun invoke(): Either { + return repository.getGenres() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetPopularMovies.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetPopularMovies.kt new file mode 100644 index 00000000..a5cbd918 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetPopularMovies.kt @@ -0,0 +1,13 @@ +package com.mousavi.hashem.mymoviesapp.domain.usecases + +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.domain.model.PageData +import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository + +class GetPopularMovies( + private val repository: MoviesRepository, +) { + suspend operator fun invoke(language: String, page: Int): Either { + return repository.getPopularMovies(language, page) + } +} \ No newline at end of file From b4e8a846ba08f10e855250367fc7eed9e800afae Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 20:51:05 +0330 Subject: [PATCH 11/80] impl popular movies page --- app/src/main/AndroidManifest.xml | 2 + .../data/repository/MoviesRepositoryImpl.kt | 3 +- .../mymoviesapp/domain/model/PageData.kt | 9 +- .../mymoviesapp/presentaion/BaseFragment.kt | 29 ++++ .../mymoviesapp/presentaion/MainActivity.kt | 25 +++ .../explore/list/PopularMoviesAdapter.kt | 156 ++++++++++++++++++ .../explore/list/PopularMoviesFragment.kt | 65 ++++++++ .../explore/list/PopularMoviesViewModel.kt | 71 ++++++++ .../com/mousavi/hashem/util/Extensions.kt | 9 + app/src/main/res/drawable/ic_movie.xml | 9 + app/src/main/res/drawable/ic_not_bookmark.xml | 10 ++ app/src/main/res/drawable/ic_star.xml | 9 + app/src/main/res/drawable/poster.jpg | Bin 0 -> 101978 bytes app/src/main/res/drawable/rate_background.xml | 5 + app/src/main/res/layout/activity_main.xml | 24 ++- .../res/layout/fragment_popular_movies.xml | 25 +++ app/src/main/res/layout/item_loading.xml | 6 + app/src/main/res/layout/item_movie.xml | 53 ++++++ app/src/main/res/menu/bottom_bar_menu.xml | 11 ++ .../main/res/navigation/main_nav_graph.xml | 9 + .../main/res/navigation/movies_nav_graph.xml | 13 ++ app/src/main/res/values-night/themes.xml | 16 -- app/src/main/res/values/colors.xml | 11 +- app/src/main/res/values/strings.xml | 4 + app/src/main/res/values/themes.xml | 8 +- 25 files changed, 547 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/BaseFragment.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesAdapter.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesFragment.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesViewModel.kt create mode 100644 app/src/main/java/com/mousavi/hashem/util/Extensions.kt create mode 100644 app/src/main/res/drawable/ic_movie.xml create mode 100644 app/src/main/res/drawable/ic_not_bookmark.xml create mode 100644 app/src/main/res/drawable/ic_star.xml create mode 100644 app/src/main/res/drawable/poster.jpg create mode 100644 app/src/main/res/drawable/rate_background.xml create mode 100644 app/src/main/res/layout/fragment_popular_movies.xml create mode 100644 app/src/main/res/layout/item_loading.xml create mode 100644 app/src/main/res/layout/item_movie.xml create mode 100644 app/src/main/res/menu/bottom_bar_menu.xml create mode 100644 app/src/main/res/navigation/main_nav_graph.xml create mode 100644 app/src/main/res/navigation/movies_nav_graph.xml delete mode 100644 app/src/main/res/values-night/themes.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0a538afb..0eb98870 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + , - val totalPages: Int, - val totalResults: Int, + val page: Int = -1, + val movies: MutableList = mutableListOf(), + val totalPages: Int = -1, + val totalResults: Int = -1, ) data class Movie( diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/BaseFragment.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/BaseFragment.kt new file mode 100644 index 00000000..a3f92e4b --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/BaseFragment.kt @@ -0,0 +1,29 @@ +package com.mousavi.hashem.mymoviesapp.presentaion + +import android.os.Bundle +import android.view.View +import androidx.activity.OnBackPressedCallback +import androidx.annotation.CallSuper +import androidx.annotation.LayoutRes +import androidx.fragment.app.Fragment + +open class BaseFragment( + @LayoutRes private val layoutId: Int, +) : Fragment(layoutId) { + + @CallSuper + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + activity?.onBackPressedDispatcher?.addCallback( + viewLifecycleOwner, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + onBackPressed() + } + } + ) + } + + open fun onBackPressed() {} +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt index 7afb9581..e1a922ad 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt @@ -2,11 +2,36 @@ package com.mousavi.hashem.mymoviesapp.presentaion import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import androidx.navigation.NavController +import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.ui.setupWithNavController +import com.google.android.material.bottomnavigation.BottomNavigationView import com.mousavi.hashem.mymoviesapp.R +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class MainActivity : AppCompatActivity() { + + private lateinit var navController: NavController + private lateinit var bottomNavigationView: BottomNavigationView + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + setupBottomNavigation() + } + + private fun setupBottomNavigation() { + val navHostFragment = supportFragmentManager.findFragmentById( + R.id.main_nav_host + ) as NavHostFragment + navController = navHostFragment.navController + + bottomNavigationView = findViewById(R.id.bottom_navigation_view) + bottomNavigationView.setupWithNavController(navController) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesAdapter.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesAdapter.kt new file mode 100644 index 00000000..4894d916 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesAdapter.kt @@ -0,0 +1,156 @@ +package com.mousavi.hashem.mymoviesapp.presentaion.explore.list + +import android.graphics.Rect +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import coil.load +import com.mousavi.hashem.mymoviesapp.R +import com.mousavi.hashem.mymoviesapp.domain.model.Movie +import com.mousavi.hashem.util.dp + + +class PopularMoviesAdapter( + private var onLoadMoreListener: (Int) -> Unit, + private val onItemClicked: (Movie, View) -> Unit, +) : RecyclerView.Adapter() { + + companion object { + private const val VIEW_TYPE_LOADING = 0 + private const val VIEW_TYPE_DATA = 1 + } + + private val items = mutableListOf() + + var isLoading = false + set(value) { + field = value + notifyItemChanged(itemCount) + } + + var noMoreData = false + var currentPage = 1 + + private val itemDecoration = object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State, + ) { + super.getItemOffsets(outRect, view, parent, state) + val spanIndex = (view.layoutParams as GridLayoutManager.LayoutParams).spanIndex + val dp16 = 16.dp + if (spanIndex == 0) { + outRect.left = dp16 + outRect.right = dp16 / 2 + } else { + outRect.right = dp16 + outRect.left = dp16 / 2 + } + outRect.top = dp16 / 2 + outRect.bottom = dp16 / 2 + + } + } + + override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { + super.onAttachedToRecyclerView(recyclerView) + recyclerView.addItemDecoration(itemDecoration) + (recyclerView.layoutManager as? GridLayoutManager)?.let { layoutManager -> + layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + if (getItemViewType(position) == VIEW_TYPE_LOADING) return 2 + return 1 + } + } + } + } + + override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { + super.onDetachedFromRecyclerView(recyclerView) + recyclerView.removeItemDecoration(itemDecoration) + } + + fun appendData(list: List, page: Int) { + if (currentPage == page) return // if we go to details and back, the viewmodel give redundant data(last list) + currentPage = page + val currentItemsSize = items.size + if (list.isNotEmpty()) { + items.addAll(list) + val newItemsSize = items.size + notifyItemRangeChanged(currentItemsSize, newItemsSize - currentItemsSize) + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(parent.context) + if (viewType == VIEW_TYPE_LOADING) { + return LoadingViewHolder(inflater.inflate(R.layout.item_loading, parent, false)) + } + + return MovieViewHolder(inflater.inflate(R.layout.item_movie, parent, false)) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + + if (holder is MovieViewHolder) { + holder.bind(position) + } + if (!noMoreData && !isLoading && position == itemCount - 1) { + onLoadMoreListener.invoke(currentPage + 1) + } + } + + + override fun getItemCount(): Int { + var dataCount = items.size + if (isLoading) { + dataCount++ + } + return dataCount + } + + override fun getItemViewType(position: Int): Int { + val dataCount = items.size + + return if (isLoading) { + if (position < dataCount) { + VIEW_TYPE_DATA + } else { + VIEW_TYPE_LOADING + } + } else { + VIEW_TYPE_DATA + } + } + + inner class MovieViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val titleTextView: TextView = itemView.findViewById(R.id.tv_title) + private val posterImageView: ImageView = itemView.findViewById(R.id.iv_poster) + private val rateTextView: TextView = itemView.findViewById(R.id.tv_rate) + + fun bind(position: Int) { + val movie = items[position] + titleTextView.text = movie.title + posterImageView.load(movie.posterPath) + rateTextView.text = movie.voteAverage.toString() + + itemView.setOnClickListener { + val pos = adapterPosition + if (pos != RecyclerView.NO_POSITION) { + onItemClicked(items[pos], posterImageView) + } + } + } + } + + class LoadingViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + internal val loading: View = itemView.findViewById(R.id.loading) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesFragment.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesFragment.kt new file mode 100644 index 00000000..488290ab --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesFragment.kt @@ -0,0 +1,65 @@ +package com.mousavi.hashem.mymoviesapp.presentaion.explore.list + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.RecyclerView +import com.mousavi.hashem.mymoviesapp.R +import com.mousavi.hashem.mymoviesapp.presentaion.BaseFragment +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.collectLatest + +@AndroidEntryPoint +class PopularMoviesFragment : BaseFragment(R.layout.fragment_popular_movies) { + + private val viewModel: PopularMoviesViewModel by viewModels() + + private lateinit var recyclerView: RecyclerView + + private val adapter = PopularMoviesAdapter( + onLoadMoreListener = { newPage -> + viewModel.getPopularMovies( + page = newPage + ) + }, + onItemClicked = { movie, view -> + //TODO() + } + ) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + bindView(view) + observers() + recycler() + } + + private fun bindView(view: View) { + recyclerView = view.findViewById(R.id.recycler_view) + } + + private fun recycler() { + recyclerView.adapter = adapter + } + + private fun observers() { + lifecycleScope.launchWhenStarted { + viewModel.popularMovies.collectLatest { pageData -> + adapter.appendData(pageData.movies, pageData.page) + } + } + + lifecycleScope.launchWhenStarted { + viewModel.popularMoviesLoading.collectLatest { + adapter.isLoading = it + } + } + } + + override fun onBackPressed() { + super.onBackPressed() + activity?.finish() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesViewModel.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesViewModel.kt new file mode 100644 index 00000000..522c7cc9 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesViewModel.kt @@ -0,0 +1,71 @@ +package com.mousavi.hashem.mymoviesapp.presentaion.explore.list + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.domain.model.PageData +import com.mousavi.hashem.mymoviesapp.domain.usecases.GetGenres +import com.mousavi.hashem.mymoviesapp.domain.usecases.GetPopularMovies +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class PopularMoviesViewModel @Inject constructor( + private val getPopularMoviesUseCase: GetPopularMovies, + private val getGenres: GetGenres +) : ViewModel() { + + private val _popularMovies = MutableStateFlow(PageData()) + val popularMovies = _popularMovies.asStateFlow() + + private val _popularMoviesError = MutableSharedFlow() + val popularMoviesError = _popularMoviesError.asSharedFlow() + + private val _popularMoviesLoading = MutableSharedFlow() + val popularMoviesLoading = _popularMoviesLoading.asSharedFlow() + + init { + //we get genre list and cache it in repository + getGenreList() + } + + private fun getGenreList(){ + viewModelScope.launch(Dispatchers.IO) { + _popularMoviesLoading.emit(true) + when (val genres = getGenres()) { + is Either.Success -> { + getPopularMovies() + } + is Either.Error -> { + //TODO + } + } + } + } + + fun getPopularMovies( + language: String = "en-US", + page: Int = 1, + ) { + viewModelScope.launch(Dispatchers.IO) { + _popularMoviesLoading.emit(true) + when (val result = getPopularMoviesUseCase(language, page)) { + is Either.Success -> { + _popularMoviesLoading.emit(false) + _popularMovies.value = result.data + } + is Either.Error -> { + _popularMoviesLoading.emit(false) + _popularMoviesError.emit(result.error) + } + } + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/util/Extensions.kt b/app/src/main/java/com/mousavi/hashem/util/Extensions.kt new file mode 100644 index 00000000..8eb2f614 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/util/Extensions.kt @@ -0,0 +1,9 @@ +package com.mousavi.hashem.util + +import android.content.res.Resources +import kotlin.math.roundToInt + + +val Int.dp: Int get() = (this * Resources.getSystem().displayMetrics.density).roundToInt() + +val Int.dpF: Float get() = (this * Resources.getSystem().displayMetrics.density) \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_movie.xml b/app/src/main/res/drawable/ic_movie.xml new file mode 100644 index 00000000..27c315eb --- /dev/null +++ b/app/src/main/res/drawable/ic_movie.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_not_bookmark.xml b/app/src/main/res/drawable/ic_not_bookmark.xml new file mode 100644 index 00000000..5118fb58 --- /dev/null +++ b/app/src/main/res/drawable/ic_not_bookmark.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_star.xml b/app/src/main/res/drawable/ic_star.xml new file mode 100644 index 00000000..5d010a04 --- /dev/null +++ b/app/src/main/res/drawable/ic_star.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/poster.jpg b/app/src/main/res/drawable/poster.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f30a92a66e1fe960a637609ee5ebebd082280c9 GIT binary patch literal 101978 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 A?YJHAHw$=1Miv7ktd_?C9 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 + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9c12b24e..a35e202c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,13 +6,23 @@ android:layout_height="match_parent" tools:context=".presentaion.MainActivity"> - + + + app:menu="@menu/bottom_bar_menu" + app:layout_constraintBottom_toBottomOf="parent"/> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_popular_movies.xml b/app/src/main/res/layout/fragment_popular_movies.xml new file mode 100644 index 00000000..15eabe5a --- /dev/null +++ b/app/src/main/res/layout/fragment_popular_movies.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_loading.xml b/app/src/main/res/layout/item_loading.xml new file mode 100644 index 00000000..86b6a633 --- /dev/null +++ b/app/src/main/res/layout/item_loading.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_movie.xml b/app/src/main/res/layout/item_movie.xml new file mode 100644 index 00000000..47f29be3 --- /dev/null +++ b/app/src/main/res/layout/item_movie.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_bar_menu.xml b/app/src/main/res/menu/bottom_bar_menu.xml new file mode 100644 index 00000000..0be9356c --- /dev/null +++ b/app/src/main/res/menu/bottom_bar_menu.xml @@ -0,0 +1,11 @@ + +

+ + + \ No newline at end of file diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml new file mode 100644 index 00000000..92e73da6 --- /dev/null +++ b/app/src/main/res/navigation/main_nav_graph.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/movies_nav_graph.xml b/app/src/main/res/navigation/movies_nav_graph.xml new file mode 100644 index 00000000..e8974f70 --- /dev/null +++ b/app/src/main/res/navigation/movies_nav_graph.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml deleted file mode 100644 index 6d262652..00000000 --- a/app/src/main/res/values-night/themes.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127d..84d444cd 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,10 +1,15 @@ - #FFBB86FC - #FF6200EE - #FF3700B3 #FF03DAC5 #FF018786 #FF000000 #FFFFFFFF + #646464 + + #303329 + #CCCCB8 + #1B1C18 + #E6E6DC + #9FD74B + #000000 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e5f33ac8..6fae173e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,7 @@ MyMoviesApp + Explore + Favorites + Top Movies + Poster Image \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index db84acbc..5d8a22a6 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,10 +1,10 @@ - + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..f8c6127d --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..e5f33ac8 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + MyMoviesApp + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 00000000..db84acbc --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/test/java/com/mousavi/hashem/mymoviesapp/ExampleUnitTest.kt b/app/src/test/java/com/mousavi/hashem/mymoviesapp/ExampleUnitTest.kt new file mode 100644 index 00000000..0b358f28 --- /dev/null +++ b/app/src/test/java/com/mousavi/hashem/mymoviesapp/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.mousavi.hashem.mymoviesapp + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..7f88f48e --- /dev/null +++ b/build.gradle @@ -0,0 +1,18 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath "com.android.tools.build:gradle:7.0.4" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0" + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..98bed167 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..cf8bddd8 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Dec 24 15:13:54 IRST 2021 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..4f906e0c --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..d5f019d9 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + jcenter() // Warning: this repository is going to shut down soon + } +} +rootProject.name = "MyMoviesApp" +include ':app' From ea8491ae1fee0d7cd485d399a65dba9e9899ae84 Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 15:31:31 +0330 Subject: [PATCH 40/80] add dependencies --- app/build.gradle | 46 +++++++++++++++++++++++++++++++++++++++++++++- build.gradle | 1 + 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 30d48a01..4723cc0b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,9 @@ plugins { id 'com.android.application' id 'kotlin-android' + id 'kotlin-kapt' + id 'dagger.hilt.android.plugin' + id 'kotlin-android-extensions' } android { @@ -33,10 +36,51 @@ android { dependencies { + //androidx dependencies + implementation 'androidx.fragment:fragment-ktx:1.4.0' implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.0' - implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.2' + + //material + implementation 'com.google.android.material:material:1.4.0' + + //Retrofit + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' + implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3' + + //Gson + implementation 'com.google.code.gson:gson:2.8.9' + + // Coroutines + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2' + + // Coroutine Lifecycle Scopes + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0" + + //Dagger - Hilt + implementation "com.google.dagger:hilt-android:2.38.1" + kapt "com.google.dagger:hilt-android-compiler:2.38.1" + implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03" + kapt "androidx.hilt:hilt-compiler:1.0.0" + + //Navigation Component + def nav_version = "2.4.0-rc01" + implementation("androidx.navigation:navigation-fragment-ktx:$nav_version") + implementation("androidx.navigation:navigation-ui-ktx:$nav_version") + + // Room + implementation "androidx.room:room-runtime:2.4.0" + kapt "androidx.room:room-compiler:2.4.0" + // Kotlin Extensions and Coroutines support for Room + implementation "androidx.room:room-ktx:2.3.0" + + //ImageLoader + implementation("io.coil-kt:coil:1.4.0") + testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/build.gradle b/build.gradle index 7f88f48e..42881210 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ buildscript { dependencies { classpath "com.android.tools.build:gradle:7.0.4" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0" + classpath "com.google.dagger:hilt-android-gradle-plugin:2.38.1" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 4d26af6d12bec66fc2377516da903df3563947bf Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 15:42:41 +0330 Subject: [PATCH 41/80] add Dtos(Data Transfer Objects) --- app/src/main/AndroidManifest.xml | 2 +- .../mymoviesapp/data/remote/dto/GenresDto.kt | 15 +++++++ .../data/remote/dto/PageDataDto.kt | 45 +++++++++++++++++++ .../{ => presentaion}/MainActivity.kt | 3 +- app/src/main/res/layout/activity_main.xml | 2 +- 5 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt rename app/src/main/java/com/mousavi/hashem/mymoviesapp/{ => presentaion}/MainActivity.kt (74%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dfe0c6b5..4b40a5ae 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ android:supportsRtl="true" android:theme="@style/Theme.MyMoviesApp"> diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt new file mode 100644 index 00000000..0d36b674 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt @@ -0,0 +1,15 @@ +package com.mousavi.hashem.mymoviesapp.data.remote.dto + +import com.google.gson.annotations.SerializedName + +data class GenresDto( + @SerializedName("genres") + val genres: List, +) + +data class GenreDto( + @SerializedName("id") + val id: Int, + @SerializedName("name") + val name: String, +) \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt new file mode 100644 index 00000000..3bdfca52 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt @@ -0,0 +1,45 @@ +package com.mousavi.hashem.mymoviesapp.data.remote.dto + +import com.google.gson.annotations.SerializedName + +data class PageDataDto( + @SerializedName("page") + val page: Int, + @SerializedName("results") + val movies: List, + @SerializedName("total_pages") + val totalPages: Int, + @SerializedName("total_results") + val totalResults: Int, +) + +data class MovieDto( + @SerializedName("adult") + val adult: Boolean, + @SerializedName("backdrop_path") + val backdropPath: String?, + @SerializedName("genre_ids") + val genreIds: List, + @SerializedName("id") + val id: Int, + @SerializedName("original_language") + val originalLanguage: String, + @SerializedName("original_title") + val originalTitle: String, + @SerializedName("overview") + val overview: String, + @SerializedName("popularity") + val popularity: Double, + @SerializedName("poster_path") + val posterPath: String?, + @SerializedName("release_date") + val releaseDate: String?, + @SerializedName("title") + val title: String, + @SerializedName("video") + val video: Boolean, + @SerializedName("vote_average") + val voteAverage: Double, + @SerializedName("vote_count") + val voteCount: Int, +) \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/MainActivity.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt similarity index 74% rename from app/src/main/java/com/mousavi/hashem/mymoviesapp/MainActivity.kt rename to app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt index d12b7673..7afb9581 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/MainActivity.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt @@ -1,7 +1,8 @@ -package com.mousavi.hashem.mymoviesapp +package com.mousavi.hashem.mymoviesapp.presentaion import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import com.mousavi.hashem.mymoviesapp.R class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4fc24441..9c12b24e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context=".presentaion.MainActivity"> Date: Fri, 24 Dec 2021 15:46:52 +0330 Subject: [PATCH 42/80] define repository --- .../mymoviesapp/data/repository/MoviesRepositoryImpl.kt | 5 +++++ .../mymoviesapp/domain/repository/MoviesRepository.kt | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt new file mode 100644 index 00000000..6e83c5a3 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt @@ -0,0 +1,5 @@ +package com.mousavi.hashem.mymoviesapp.data.repository + +import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository + +class MoviesRepositoryImpl : MoviesRepository \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt new file mode 100644 index 00000000..19b0efc2 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt @@ -0,0 +1,6 @@ +package com.mousavi.hashem.mymoviesapp.domain.repository + +interface MoviesRepository { + + +} \ No newline at end of file From 22e27fa580ef1b7b6a4fb28c054ad820e99a4bcb Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 15:50:54 +0330 Subject: [PATCH 43/80] define domain data models --- .../hashem/mymoviesapp/domain/model/Genres.kt | 10 ++++++++ .../mymoviesapp/domain/model/PageData.kt | 25 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/Genres.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/PageData.kt diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/Genres.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/Genres.kt new file mode 100644 index 00000000..3e9f2b11 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/Genres.kt @@ -0,0 +1,10 @@ +package com.mousavi.hashem.mymoviesapp.domain.model + +data class Genres( + val genres: List +) + +data class Genre( + val id: Int, + val name: String +) \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/PageData.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/PageData.kt new file mode 100644 index 00000000..ae9d7152 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/model/PageData.kt @@ -0,0 +1,25 @@ +package com.mousavi.hashem.mymoviesapp.domain.model + +data class PageData( + val page: Int, + val movies: MutableList, + val totalPages: Int, + val totalResults: Int, +) + +data class Movie( + val adult: Boolean = false, + val backdropPath: String? = null, + val genreIds: List = emptyList(), + val id: Int = -1, + val originalLanguage: String = "", + val originalTitle: String = "", + val overview: String = "", + val popularity: Double = 0.0, + val posterPath: String? = null, + val releaseDate: String? = null, + val title: String = "", + val video: Boolean = false, + val voteAverage: Double = 0.0, + val voteCount: Int = 0, +) From 38a098c555a1486f5ca4edac976dc49a816548df Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 15:54:09 +0330 Subject: [PATCH 44/80] add hilt structure --- app/src/main/AndroidManifest.xml | 1 + .../java/com/mousavi/hashem/mymoviesapp/MoviesApp.kt | 7 +++++++ .../com/mousavi/hashem/mymoviesapp/di/AppModule.kt | 10 ++++++++++ 3 files changed, 18 insertions(+) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/MoviesApp.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4b40a5ae..0a538afb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="com.mousavi.hashem.mymoviesapp"> Date: Fri, 24 Dec 2021 16:06:34 +0330 Subject: [PATCH 45/80] add api infrastructure(Retrofit and OkHttp configuration) --- .../hashem/mymoviesapp/data/remote/Api.kt | 24 ++++++++ .../hashem/mymoviesapp/di/AppModule.kt | 61 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/Api.kt diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/Api.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/Api.kt new file mode 100644 index 00000000..4020dd2f --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/Api.kt @@ -0,0 +1,24 @@ +package com.mousavi.hashem.mymoviesapp.data.remote + +import com.mousavi.hashem.mymoviesapp.data.remote.dto.GenresDto +import com.mousavi.hashem.mymoviesapp.data.remote.dto.PageDataDto +import retrofit2.http.GET +import retrofit2.http.Query + +interface Api { + + companion object { + const val BASE_URL = "https://api.themoviedb.org/3/" + const val API_KEY = "7457b8e2de9fbd83fe4e24eaa79912f2" + const val IMAGE_BASE_URL = "https://image.tmdb.org/t/p/w500" + } + + @GET("movie/popular") + suspend fun getPopularMovies( + @Query("language") language: String, + @Query("page") page: Int, + ): PageDataDto + + @GET("genre/movie/list") + suspend fun getGenres(): GenresDto +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt index c95b206f..dbb51b3e 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt @@ -1,10 +1,71 @@ package com.mousavi.hashem.mymoviesapp.di +import android.util.Log +import com.mousavi.hashem.mymoviesapp.BuildConfig +import com.mousavi.hashem.mymoviesapp.data.remote.Api +import com.mousavi.hashem.mymoviesapp.data.remote.Api.Companion.API_KEY +import com.mousavi.hashem.mymoviesapp.data.remote.Api.Companion.BASE_URL import dagger.Module +import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.Response +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.util.concurrent.TimeUnit +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object AppModule { + + @Provides + @Singleton + fun provideOkHttp(): OkHttpClient { + val logging = HttpLoggingInterceptor { message -> + Log.d("okHttpLog", message) + }.apply { + setLevel( + if (BuildConfig.DEBUG) { + HttpLoggingInterceptor.Level.BASIC + } else { + HttpLoggingInterceptor.Level.NONE + } + ) + } + + return OkHttpClient.Builder() + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(60, TimeUnit.SECONDS) + .writeTimeout(60, TimeUnit.SECONDS) + .addInterceptor { chain -> + return@addInterceptor addApiKeyToRequests(chain) + } + .addInterceptor(logging) + .build() + } + + @Provides + @Singleton + fun provideRetrofitApi(client: OkHttpClient): Api { + return Retrofit + .Builder() + .baseUrl(BASE_URL) + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(Api::class.java) + } +} + +private fun addApiKeyToRequests(chain: Interceptor.Chain): Response { + val request = chain.request().newBuilder() + val originalHttpUrl = chain.request().url + val newUrl = originalHttpUrl.newBuilder() + .addQueryParameter("api_key", API_KEY).build() + request.url(newUrl) + return chain.proceed(request.build()) } \ No newline at end of file From ce9000715789a30056e199bb83d09039c697f89c Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 16:44:35 +0330 Subject: [PATCH 46/80] add dto to domain data mapping functions --- .../mymoviesapp/data/remote/dto/GenresDto.kt | 19 ++++++- .../data/remote/dto/PageDataDto.kt | 49 ++++++++++++++++++- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt index 0d36b674..77abc885 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/GenresDto.kt @@ -1,15 +1,30 @@ package com.mousavi.hashem.mymoviesapp.data.remote.dto import com.google.gson.annotations.SerializedName +import com.mousavi.hashem.mymoviesapp.domain.model.Genre +import com.mousavi.hashem.mymoviesapp.domain.model.Genres data class GenresDto( @SerializedName("genres") val genres: List, -) +) { + fun toGenres(): Genres { + return Genres( + genres = genres.map { it.toGenre() } + ) + } +} data class GenreDto( @SerializedName("id") val id: Int, @SerializedName("name") val name: String, -) \ No newline at end of file +){ + fun toGenre(): Genre { + return Genre( + id = id, + name = name + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt index 3bdfca52..2bdc1d9f 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/dto/PageDataDto.kt @@ -1,6 +1,10 @@ package com.mousavi.hashem.mymoviesapp.data.remote.dto import com.google.gson.annotations.SerializedName +import com.mousavi.hashem.mymoviesapp.data.remote.Api +import com.mousavi.hashem.mymoviesapp.domain.model.Genres +import com.mousavi.hashem.mymoviesapp.domain.model.Movie +import com.mousavi.hashem.mymoviesapp.domain.model.PageData data class PageDataDto( @SerializedName("page") @@ -11,7 +15,16 @@ data class PageDataDto( val totalPages: Int, @SerializedName("total_results") val totalResults: Int, -) +) { + fun toPageData(genres: Genres): PageData { + return PageData( + page = page, + movies = movies.map { it.toMovie(genres) }.toMutableList(), + totalPages = totalPages, + totalResults = totalResults + ) + } +} data class MovieDto( @SerializedName("adult") @@ -42,4 +55,36 @@ data class MovieDto( val voteAverage: Double, @SerializedName("vote_count") val voteCount: Int, -) \ No newline at end of file +){ + fun toMovie(genres: Genres): Movie { + return Movie( + adult = adult, + backdropPath = Api.IMAGE_BASE_URL + backdropPath, + genreIds = mapGenreIdToName(genreIds, genres), + id = id, + originalLanguage = originalLanguage, + originalTitle = originalTitle, + overview = overview, + popularity = popularity, + posterPath = Api.IMAGE_BASE_URL + posterPath, + releaseDate = releaseDate, + title = title, + video = video, + voteAverage = voteAverage, + voteCount = voteCount + ) + } + + private fun mapGenreIdToName(list: List, genres: Genres): List { + val genreNames = mutableListOf() + + genres.genres.forEach { genre -> + list.forEach { id-> + if (id == genre.id){ + genreNames.add(genre.name) + } + } + } + return genreNames + } +} \ No newline at end of file From d9a7d5995cfae7291188a1658feabd6b5655d3e2 Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 16:45:13 +0330 Subject: [PATCH 47/80] implement network calls --- .../java/com/mousavi/hashem/common/Either.kt | 7 ++++ .../data/remote/NetworkDataSource.kt | 15 +++++++ .../data/remote/NetworkDataSourceImpl.kt | 41 +++++++++++++++++++ .../data/repository/MoviesRepositoryImpl.kt | 40 +++++++++++++++++- .../hashem/mymoviesapp/di/AppModule.kt | 16 ++++++++ .../domain/repository/MoviesRepository.kt | 9 ++++ 6 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/mousavi/hashem/common/Either.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSource.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSourceImpl.kt diff --git a/app/src/main/java/com/mousavi/hashem/common/Either.kt b/app/src/main/java/com/mousavi/hashem/common/Either.kt new file mode 100644 index 00000000..54a9c6f0 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/common/Either.kt @@ -0,0 +1,7 @@ +package com.mousavi.hashem.common + +sealed class Either { + data class Success(val data: T) : Either() + + data class Error(val error: E) : Either() +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSource.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSource.kt new file mode 100644 index 00000000..dfcc0cf0 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSource.kt @@ -0,0 +1,15 @@ +package com.mousavi.hashem.mymoviesapp.data.remote + +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.data.remote.dto.GenresDto +import com.mousavi.hashem.mymoviesapp.data.remote.dto.PageDataDto + +interface NetworkDataSource { + + suspend fun getPopularMovies( + language: String, + page: Int, + ): Either + + suspend fun getGenres(): Either +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSourceImpl.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSourceImpl.kt new file mode 100644 index 00000000..e2bd4a66 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/remote/NetworkDataSourceImpl.kt @@ -0,0 +1,41 @@ +package com.mousavi.hashem.mymoviesapp.data.remote + +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.data.remote.dto.GenresDto +import com.mousavi.hashem.mymoviesapp.data.remote.dto.PageDataDto +import retrofit2.HttpException +import java.io.IOException + +class NetworkDataSourceImpl( + private val api: Api, +) : NetworkDataSource { + + override suspend fun getPopularMovies( + language: String, + page: Int, + ): Either { + return try { + val popularMovies = api.getPopularMovies(language, page) + Either.Success(popularMovies) + } catch (e: HttpException) { + Either.Error(error = e.message ?: "Error occurred") + } catch (e: IOException) { + Either.Error(error = e.message ?: "Check your internet connection!") + } catch (e: Exception) { + Either.Error(error = e.message ?: "Unknown error!") + } + } + + override suspend fun getGenres(): Either { + return try { + val genresDto = api.getGenres() + Either.Success(genresDto) + } catch (e: HttpException) { + Either.Error(error = e.message ?: "Error occurred") + } catch (e: IOException) { + Either.Error(error = e.message ?: "Check your internet connection!") + } catch (e: Exception) { + Either.Error(error = e.message ?: "Unknown error!") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt index 6e83c5a3..2c2a6e3f 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/data/repository/MoviesRepositoryImpl.kt @@ -1,5 +1,43 @@ package com.mousavi.hashem.mymoviesapp.data.repository +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.data.remote.NetworkDataSource +import com.mousavi.hashem.mymoviesapp.domain.model.Genres +import com.mousavi.hashem.mymoviesapp.domain.model.PageData import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository +import java.util.concurrent.atomic.AtomicReference -class MoviesRepositoryImpl : MoviesRepository \ No newline at end of file +class MoviesRepositoryImpl( + private val networkDataSource: NetworkDataSource, + ) : MoviesRepository { + + //Nothing make cachedGenres null, but in future it's maybe the case, so we use atomic version + private val cachedGenres = AtomicReference() + + override suspend fun getPopularMovies(language: String, page: Int): Either { + return when (val popularMovies = networkDataSource.getPopularMovies(language, page)) { + is Either.Success -> { + Either.Success(popularMovies.data.toPageData(cachedGenres.get())) + } + is Either.Error -> { + Either.Error(popularMovies.error) + } + } + } + + override suspend fun getGenres(): Either { + val genresCached = cachedGenres.get() + if (genresCached != null) { + return Either.Success(genresCached) + } + return when (val genres = networkDataSource.getGenres()) { + is Either.Success -> { + cachedGenres.set(genres.data.toGenres()) + Either.Success(genres.data.toGenres()) + } + is Either.Error -> { + Either.Error(genres.error) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt index dbb51b3e..10abfefd 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt @@ -5,6 +5,10 @@ import com.mousavi.hashem.mymoviesapp.BuildConfig import com.mousavi.hashem.mymoviesapp.data.remote.Api import com.mousavi.hashem.mymoviesapp.data.remote.Api.Companion.API_KEY import com.mousavi.hashem.mymoviesapp.data.remote.Api.Companion.BASE_URL +import com.mousavi.hashem.mymoviesapp.data.remote.NetworkDataSource +import com.mousavi.hashem.mymoviesapp.data.remote.NetworkDataSourceImpl +import com.mousavi.hashem.mymoviesapp.data.repository.MoviesRepositoryImpl +import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -59,6 +63,18 @@ object AppModule { .build() .create(Api::class.java) } + + @Provides + @Singleton + fun provideNetworkDataSource(api: Api): NetworkDataSource { + return NetworkDataSourceImpl(api) + } + + @Provides + @Singleton + fun provideMoviesRepository(repository: MoviesRepositoryImpl): MoviesRepository { + return repository + } } private fun addApiKeyToRequests(chain: Interceptor.Chain): Response { diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt index 19b0efc2..40a443ca 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/repository/MoviesRepository.kt @@ -1,6 +1,15 @@ package com.mousavi.hashem.mymoviesapp.domain.repository +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.domain.model.Genres +import com.mousavi.hashem.mymoviesapp.domain.model.PageData + interface MoviesRepository { + suspend fun getPopularMovies( + language: String, + page: Int, + ): Either + suspend fun getGenres(): Either } \ No newline at end of file From 316341cc6734a95c7a4c357eb66cf4b554b22545 Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 16:57:44 +0330 Subject: [PATCH 48/80] create use cases --- .../com/mousavi/hashem/mymoviesapp/di/AppModule.kt | 14 ++++++++++++++ .../mymoviesapp/domain/usecases/GetGenres.kt | 14 ++++++++++++++ .../domain/usecases/GetPopularMovies.kt | 13 +++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetGenres.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetPopularMovies.kt diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt index 10abfefd..48800e9d 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/di/AppModule.kt @@ -9,6 +9,8 @@ import com.mousavi.hashem.mymoviesapp.data.remote.NetworkDataSource import com.mousavi.hashem.mymoviesapp.data.remote.NetworkDataSourceImpl import com.mousavi.hashem.mymoviesapp.data.repository.MoviesRepositoryImpl import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository +import com.mousavi.hashem.mymoviesapp.domain.usecases.GetGenres +import com.mousavi.hashem.mymoviesapp.domain.usecases.GetPopularMovies import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -75,6 +77,18 @@ object AppModule { fun provideMoviesRepository(repository: MoviesRepositoryImpl): MoviesRepository { return repository } + + @Provides + @Singleton + fun provideGetPopularMoviesUseCase(repository: MoviesRepository): GetPopularMovies { + return GetPopularMovies(repository) + } + + @Provides + @Singleton + fun provideGetGenresUseCase(repository: MoviesRepository): GetGenres { + return GetGenres(repository) + } } private fun addApiKeyToRequests(chain: Interceptor.Chain): Response { diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetGenres.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetGenres.kt new file mode 100644 index 00000000..a58c38ae --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetGenres.kt @@ -0,0 +1,14 @@ +package com.mousavi.hashem.mymoviesapp.domain.usecases + +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.domain.model.Genres +import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository + +class GetGenres( + private val repository: MoviesRepository, +) { + + suspend operator fun invoke(): Either { + return repository.getGenres() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetPopularMovies.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetPopularMovies.kt new file mode 100644 index 00000000..a5cbd918 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/domain/usecases/GetPopularMovies.kt @@ -0,0 +1,13 @@ +package com.mousavi.hashem.mymoviesapp.domain.usecases + +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.domain.model.PageData +import com.mousavi.hashem.mymoviesapp.domain.repository.MoviesRepository + +class GetPopularMovies( + private val repository: MoviesRepository, +) { + suspend operator fun invoke(language: String, page: Int): Either { + return repository.getPopularMovies(language, page) + } +} \ No newline at end of file From cf69f37c6ef6694021244d16346926fd100362e5 Mon Sep 17 00:00:00 2001 From: Hashem Date: Fri, 24 Dec 2021 20:51:05 +0330 Subject: [PATCH 49/80] impl popular movies page --- app/src/main/AndroidManifest.xml | 2 + .../data/repository/MoviesRepositoryImpl.kt | 3 +- .../mymoviesapp/domain/model/PageData.kt | 9 +- .../mymoviesapp/presentaion/BaseFragment.kt | 29 ++++ .../mymoviesapp/presentaion/MainActivity.kt | 25 +++ .../explore/list/PopularMoviesAdapter.kt | 156 ++++++++++++++++++ .../explore/list/PopularMoviesFragment.kt | 65 ++++++++ .../explore/list/PopularMoviesViewModel.kt | 71 ++++++++ .../com/mousavi/hashem/util/Extensions.kt | 9 + app/src/main/res/drawable/ic_movie.xml | 9 + app/src/main/res/drawable/ic_not_bookmark.xml | 10 ++ app/src/main/res/drawable/ic_star.xml | 9 + app/src/main/res/drawable/poster.jpg | Bin 0 -> 101978 bytes app/src/main/res/drawable/rate_background.xml | 5 + app/src/main/res/layout/activity_main.xml | 24 ++- .../res/layout/fragment_popular_movies.xml | 25 +++ app/src/main/res/layout/item_loading.xml | 6 + app/src/main/res/layout/item_movie.xml | 53 ++++++ app/src/main/res/menu/bottom_bar_menu.xml | 11 ++ .../main/res/navigation/main_nav_graph.xml | 9 + .../main/res/navigation/movies_nav_graph.xml | 13 ++ app/src/main/res/values-night/themes.xml | 16 -- app/src/main/res/values/colors.xml | 11 +- app/src/main/res/values/strings.xml | 4 + app/src/main/res/values/themes.xml | 8 +- 25 files changed, 547 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/BaseFragment.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesAdapter.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesFragment.kt create mode 100644 app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesViewModel.kt create mode 100644 app/src/main/java/com/mousavi/hashem/util/Extensions.kt create mode 100644 app/src/main/res/drawable/ic_movie.xml create mode 100644 app/src/main/res/drawable/ic_not_bookmark.xml create mode 100644 app/src/main/res/drawable/ic_star.xml create mode 100644 app/src/main/res/drawable/poster.jpg create mode 100644 app/src/main/res/drawable/rate_background.xml create mode 100644 app/src/main/res/layout/fragment_popular_movies.xml create mode 100644 app/src/main/res/layout/item_loading.xml create mode 100644 app/src/main/res/layout/item_movie.xml create mode 100644 app/src/main/res/menu/bottom_bar_menu.xml create mode 100644 app/src/main/res/navigation/main_nav_graph.xml create mode 100644 app/src/main/res/navigation/movies_nav_graph.xml delete mode 100644 app/src/main/res/values-night/themes.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0a538afb..0eb98870 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + , - val totalPages: Int, - val totalResults: Int, + val page: Int = -1, + val movies: MutableList = mutableListOf(), + val totalPages: Int = -1, + val totalResults: Int = -1, ) data class Movie( diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/BaseFragment.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/BaseFragment.kt new file mode 100644 index 00000000..a3f92e4b --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/BaseFragment.kt @@ -0,0 +1,29 @@ +package com.mousavi.hashem.mymoviesapp.presentaion + +import android.os.Bundle +import android.view.View +import androidx.activity.OnBackPressedCallback +import androidx.annotation.CallSuper +import androidx.annotation.LayoutRes +import androidx.fragment.app.Fragment + +open class BaseFragment( + @LayoutRes private val layoutId: Int, +) : Fragment(layoutId) { + + @CallSuper + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + activity?.onBackPressedDispatcher?.addCallback( + viewLifecycleOwner, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + onBackPressed() + } + } + ) + } + + open fun onBackPressed() {} +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt index 7afb9581..e1a922ad 100644 --- a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/MainActivity.kt @@ -2,11 +2,36 @@ package com.mousavi.hashem.mymoviesapp.presentaion import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import androidx.navigation.NavController +import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.ui.setupWithNavController +import com.google.android.material.bottomnavigation.BottomNavigationView import com.mousavi.hashem.mymoviesapp.R +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class MainActivity : AppCompatActivity() { + + private lateinit var navController: NavController + private lateinit var bottomNavigationView: BottomNavigationView + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + setupBottomNavigation() + } + + private fun setupBottomNavigation() { + val navHostFragment = supportFragmentManager.findFragmentById( + R.id.main_nav_host + ) as NavHostFragment + navController = navHostFragment.navController + + bottomNavigationView = findViewById(R.id.bottom_navigation_view) + bottomNavigationView.setupWithNavController(navController) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesAdapter.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesAdapter.kt new file mode 100644 index 00000000..4894d916 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesAdapter.kt @@ -0,0 +1,156 @@ +package com.mousavi.hashem.mymoviesapp.presentaion.explore.list + +import android.graphics.Rect +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import coil.load +import com.mousavi.hashem.mymoviesapp.R +import com.mousavi.hashem.mymoviesapp.domain.model.Movie +import com.mousavi.hashem.util.dp + + +class PopularMoviesAdapter( + private var onLoadMoreListener: (Int) -> Unit, + private val onItemClicked: (Movie, View) -> Unit, +) : RecyclerView.Adapter() { + + companion object { + private const val VIEW_TYPE_LOADING = 0 + private const val VIEW_TYPE_DATA = 1 + } + + private val items = mutableListOf() + + var isLoading = false + set(value) { + field = value + notifyItemChanged(itemCount) + } + + var noMoreData = false + var currentPage = 1 + + private val itemDecoration = object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State, + ) { + super.getItemOffsets(outRect, view, parent, state) + val spanIndex = (view.layoutParams as GridLayoutManager.LayoutParams).spanIndex + val dp16 = 16.dp + if (spanIndex == 0) { + outRect.left = dp16 + outRect.right = dp16 / 2 + } else { + outRect.right = dp16 + outRect.left = dp16 / 2 + } + outRect.top = dp16 / 2 + outRect.bottom = dp16 / 2 + + } + } + + override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { + super.onAttachedToRecyclerView(recyclerView) + recyclerView.addItemDecoration(itemDecoration) + (recyclerView.layoutManager as? GridLayoutManager)?.let { layoutManager -> + layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + if (getItemViewType(position) == VIEW_TYPE_LOADING) return 2 + return 1 + } + } + } + } + + override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { + super.onDetachedFromRecyclerView(recyclerView) + recyclerView.removeItemDecoration(itemDecoration) + } + + fun appendData(list: List, page: Int) { + if (currentPage == page) return // if we go to details and back, the viewmodel give redundant data(last list) + currentPage = page + val currentItemsSize = items.size + if (list.isNotEmpty()) { + items.addAll(list) + val newItemsSize = items.size + notifyItemRangeChanged(currentItemsSize, newItemsSize - currentItemsSize) + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inflater = LayoutInflater.from(parent.context) + if (viewType == VIEW_TYPE_LOADING) { + return LoadingViewHolder(inflater.inflate(R.layout.item_loading, parent, false)) + } + + return MovieViewHolder(inflater.inflate(R.layout.item_movie, parent, false)) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + + if (holder is MovieViewHolder) { + holder.bind(position) + } + if (!noMoreData && !isLoading && position == itemCount - 1) { + onLoadMoreListener.invoke(currentPage + 1) + } + } + + + override fun getItemCount(): Int { + var dataCount = items.size + if (isLoading) { + dataCount++ + } + return dataCount + } + + override fun getItemViewType(position: Int): Int { + val dataCount = items.size + + return if (isLoading) { + if (position < dataCount) { + VIEW_TYPE_DATA + } else { + VIEW_TYPE_LOADING + } + } else { + VIEW_TYPE_DATA + } + } + + inner class MovieViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val titleTextView: TextView = itemView.findViewById(R.id.tv_title) + private val posterImageView: ImageView = itemView.findViewById(R.id.iv_poster) + private val rateTextView: TextView = itemView.findViewById(R.id.tv_rate) + + fun bind(position: Int) { + val movie = items[position] + titleTextView.text = movie.title + posterImageView.load(movie.posterPath) + rateTextView.text = movie.voteAverage.toString() + + itemView.setOnClickListener { + val pos = adapterPosition + if (pos != RecyclerView.NO_POSITION) { + onItemClicked(items[pos], posterImageView) + } + } + } + } + + class LoadingViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + internal val loading: View = itemView.findViewById(R.id.loading) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesFragment.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesFragment.kt new file mode 100644 index 00000000..488290ab --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesFragment.kt @@ -0,0 +1,65 @@ +package com.mousavi.hashem.mymoviesapp.presentaion.explore.list + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.RecyclerView +import com.mousavi.hashem.mymoviesapp.R +import com.mousavi.hashem.mymoviesapp.presentaion.BaseFragment +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.collectLatest + +@AndroidEntryPoint +class PopularMoviesFragment : BaseFragment(R.layout.fragment_popular_movies) { + + private val viewModel: PopularMoviesViewModel by viewModels() + + private lateinit var recyclerView: RecyclerView + + private val adapter = PopularMoviesAdapter( + onLoadMoreListener = { newPage -> + viewModel.getPopularMovies( + page = newPage + ) + }, + onItemClicked = { movie, view -> + //TODO() + } + ) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + bindView(view) + observers() + recycler() + } + + private fun bindView(view: View) { + recyclerView = view.findViewById(R.id.recycler_view) + } + + private fun recycler() { + recyclerView.adapter = adapter + } + + private fun observers() { + lifecycleScope.launchWhenStarted { + viewModel.popularMovies.collectLatest { pageData -> + adapter.appendData(pageData.movies, pageData.page) + } + } + + lifecycleScope.launchWhenStarted { + viewModel.popularMoviesLoading.collectLatest { + adapter.isLoading = it + } + } + } + + override fun onBackPressed() { + super.onBackPressed() + activity?.finish() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesViewModel.kt b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesViewModel.kt new file mode 100644 index 00000000..522c7cc9 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/mymoviesapp/presentaion/explore/list/PopularMoviesViewModel.kt @@ -0,0 +1,71 @@ +package com.mousavi.hashem.mymoviesapp.presentaion.explore.list + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.mousavi.hashem.common.Either +import com.mousavi.hashem.mymoviesapp.domain.model.PageData +import com.mousavi.hashem.mymoviesapp.domain.usecases.GetGenres +import com.mousavi.hashem.mymoviesapp.domain.usecases.GetPopularMovies +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class PopularMoviesViewModel @Inject constructor( + private val getPopularMoviesUseCase: GetPopularMovies, + private val getGenres: GetGenres +) : ViewModel() { + + private val _popularMovies = MutableStateFlow(PageData()) + val popularMovies = _popularMovies.asStateFlow() + + private val _popularMoviesError = MutableSharedFlow() + val popularMoviesError = _popularMoviesError.asSharedFlow() + + private val _popularMoviesLoading = MutableSharedFlow() + val popularMoviesLoading = _popularMoviesLoading.asSharedFlow() + + init { + //we get genre list and cache it in repository + getGenreList() + } + + private fun getGenreList(){ + viewModelScope.launch(Dispatchers.IO) { + _popularMoviesLoading.emit(true) + when (val genres = getGenres()) { + is Either.Success -> { + getPopularMovies() + } + is Either.Error -> { + //TODO + } + } + } + } + + fun getPopularMovies( + language: String = "en-US", + page: Int = 1, + ) { + viewModelScope.launch(Dispatchers.IO) { + _popularMoviesLoading.emit(true) + when (val result = getPopularMoviesUseCase(language, page)) { + is Either.Success -> { + _popularMoviesLoading.emit(false) + _popularMovies.value = result.data + } + is Either.Error -> { + _popularMoviesLoading.emit(false) + _popularMoviesError.emit(result.error) + } + } + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mousavi/hashem/util/Extensions.kt b/app/src/main/java/com/mousavi/hashem/util/Extensions.kt new file mode 100644 index 00000000..8eb2f614 --- /dev/null +++ b/app/src/main/java/com/mousavi/hashem/util/Extensions.kt @@ -0,0 +1,9 @@ +package com.mousavi.hashem.util + +import android.content.res.Resources +import kotlin.math.roundToInt + + +val Int.dp: Int get() = (this * Resources.getSystem().displayMetrics.density).roundToInt() + +val Int.dpF: Float get() = (this * Resources.getSystem().displayMetrics.density) \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_movie.xml b/app/src/main/res/drawable/ic_movie.xml new file mode 100644 index 00000000..27c315eb --- /dev/null +++ b/app/src/main/res/drawable/ic_movie.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_not_bookmark.xml b/app/src/main/res/drawable/ic_not_bookmark.xml new file mode 100644 index 00000000..5118fb58 --- /dev/null +++ b/app/src/main/res/drawable/ic_not_bookmark.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_star.xml b/app/src/main/res/drawable/ic_star.xml new file mode 100644 index 00000000..5d010a04 --- /dev/null +++ b/app/src/main/res/drawable/ic_star.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/poster.jpg b/app/src/main/res/drawable/poster.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f30a92a66e1fe960a637609ee5ebebd082280c9 GIT binary patch literal 101978 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
Fql1yr2r@m3N?+|UlKQF~z+K6>@Y9TVm$0kY7 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 A?YJHAHw$=1Miv7ktd_?C9 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 + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9c12b24e..a35e202c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,13 +6,23 @@ android:layout_height="match_parent" tools:context=".presentaion.MainActivity"> - + + + app:menu="@menu/bottom_bar_menu" + app:layout_constraintBottom_toBottomOf="parent"/> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_popular_movies.xml b/app/src/main/res/layout/fragment_popular_movies.xml new file mode 100644 index 00000000..15eabe5a --- /dev/null +++ b/app/src/main/res/layout/fragment_popular_movies.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_loading.xml b/app/src/main/res/layout/item_loading.xml new file mode 100644 index 00000000..86b6a633 --- /dev/null +++ b/app/src/main/res/layout/item_loading.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_movie.xml b/app/src/main/res/layout/item_movie.xml new file mode 100644 index 00000000..47f29be3 --- /dev/null +++ b/app/src/main/res/layout/item_movie.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_bar_menu.xml b/app/src/main/res/menu/bottom_bar_menu.xml new file mode 100644 index 00000000..0be9356c --- /dev/null +++ b/app/src/main/res/menu/bottom_bar_menu.xml @@ -0,0 +1,11 @@ + +

+ + + \ No newline at end of file diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml new file mode 100644 index 00000000..92e73da6 --- /dev/null +++ b/app/src/main/res/navigation/main_nav_graph.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/movies_nav_graph.xml b/app/src/main/res/navigation/movies_nav_graph.xml new file mode 100644 index 00000000..e8974f70 --- /dev/null +++ b/app/src/main/res/navigation/movies_nav_graph.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml deleted file mode 100644 index 6d262652..00000000 --- a/app/src/main/res/values-night/themes.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127d..84d444cd 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,10 +1,15 @@ - #FFBB86FC - #FF6200EE - #FF3700B3 #FF03DAC5 #FF018786 #FF000000 #FFFFFFFF + #646464 + + #303329 + #CCCCB8 + #1B1C18 + #E6E6DC + #9FD74B + #000000 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e5f33ac8..6fae173e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,7 @@ MyMoviesApp + Explore + Favorites + Top Movies + Poster Image \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index db84acbc..5d8a22a6 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,10 +1,10 @@ -