diff --git a/.github/workflows/PR_Builder.yml b/.github/workflows/PR_Builder.yml index bb7e0e5ec..9d4265c36 100644 --- a/.github/workflows/PR_Builder.yml +++ b/.github/workflows/PR_Builder.yml @@ -42,6 +42,7 @@ jobs: - name: Access Local Properties env: HOST_URI: ${{ secrets.HOST_URI }} + HOST_RELEASE_URI: ${{ secrets.HOST_RELEASE_URI }} KAKAO_NATIVE_APP_KEY: ${{ secrets.KAKAO_NATIVE_APP_KEY }} KAKAO_REDIRECT_SCHEME: ${{ secrets.KAKAO_REDIRECT_SCHEME }} KEYSTORE_PATH: ${{ secrets.KEYSTORE_PATH }} @@ -51,6 +52,7 @@ jobs: STORE_FILE: ${{ secrets.STORE_FILE }} run: | echo HOST_URI=\"$HOST_URI\" >> local.properties + echo HOST_RELEASE_URI=\"$HOST_RELEASE_URI\" >> local.properties echo KAKAO_NATIVE_APP_KEY=\"$KAKAO_NATIVE_APP_KEY\" >> local.properties echo KAKAO_REDIRECT_SCHEME=\"$KAKAO_REDIRECT_SCHEME\" >> local.properties echo KEYSTORE_PATH= $KEYSTORE_PATH >> local.properties diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ef8e642af..d80e7822c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -42,12 +42,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - buildConfigField( - "String", - "HOST_URI", - properties.getProperty("HOST_URI") - ) - buildConfigField( "String", "KAKAO_NATIVE_APP_KEY", @@ -71,6 +65,18 @@ android { "proguard-rules.pro" ) signingConfig = signingConfigs.getByName("release") + buildConfigField( + "String", + "HOST_URI", + properties.getProperty("HOST_RELEASE_URI") + ) + } + getByName("debug") { + buildConfigField( + "String", + "HOST_URI", + properties.getProperty("HOST_URI") + ) } } diff --git a/app/src/main/assets/splash.json b/app/src/main/assets/splash.json index d7f7c1ed1..38b8fdfce 100644 --- a/app/src/main/assets/splash.json +++ b/app/src/main/assets/splash.json @@ -1 +1 @@ -{"v":"5.9.0","fr":60,"ip":0,"op":150,"w":1080,"h":1080,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":246,"h":259,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":276,"h":242,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAADyBAMAAAB+NCdhAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAG1BMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABp4cHsAAAACHRSTlMAvD1/6loQIDoRLLsAAAS1SURBVHja7Z3LUxNBEMY3rw3HhIfuMQS0PAoBzBGkxByDVFE5BtQqj6IePLLZRebPNiERErLT3TPbM2xJ93WTmd/OfP31PCgSBEFw2lPLEb8MnMRmlNXZ6vThhcqMtO+CpJLdmWrcPY00Tz+6QBloOruZPKxrHqrEBUpP01k6eVjTocQuUHSdKWj2PKO0BEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBEVQBOUZoaQOSMp2KMoryvfioOBj9v+iVCxR3j5jFO2/bJj9cwnWKMEmpkU55EepWqJc86OswCg93eMRP8obXV/Tf+ARwY9ZY1AclK6urxv4sYN6GMFi6IIlije0uryFpaT6/krQNYLC7nE1xMNW/HlcCXlrrQPyG0sVqXd61MSbw81Q9NUy9mYrs7WRXkvs2ay1FTVEMox7xRIqzE2Vr2yuoVKIfKUQniCRrxT6puBqCFRu7oKoT6BbNNuZq1CE+vqKJ92W8X70auLVbQl3Db3d8vqtXrX3G1Fg4Fj9Vq9ahZ+/sIol7BEGX6/s+yxz6rVz/tX1IpYq5YUBY2E82QBe+JDCyycWQCpznQAJf18dHJ5nzJs6ICiVDplQfgOdDAlLGsYZimi5AXyMy/uhkU9o4uaaoS+KZl7QPKYN1/OzoAEohXhyCJqfhdU8+MGUw+V+KWLNBVNIvXA8PzH5kxx1yEABA0WdS+YzuEn8oVZNDuGWFd1EK+Bncy/8t8HWF9OiDqPkdNxyD8xQA4XnzucLsPHERFdKfci1UoHf84S+2sutFlgpS6Uf0W2eJIKVsry/CZHP51i2IIMSmyyCp9+wXStg4z0yWu/dxXsnms0a7hKGYmn/m1izyz5RR1Fim/1zBdNgbFjGp3FsTlJHWx0Zbg5msWqMsoe22bBQ+iQOuIWSvRFGnWVSi8yke4W3GJturx9Y+rwkmppfVRSWA1YSjYnXFInlHZ9O9Pu9iMSiNkgmu0dqK7HY68/HES6Yr8TXalgWrodhRQYmPKW21DK+BV7OwV2AZCuiNpNYXO1lwOxnl6T6WURv5MR6afFomtZ2H9OUt3aMmuhbndxpFLzWabdfj7/6o/2qs7Nu+O3Y6vLVSZzkWPwxR8v27IE9EvsTGe5o2J9TMQd23tj1h4KdCZT8oWDLsNCbcPFjte1iiBY/q2IcFMLGd+AHhbLv9ZPPtHOsbhEy2WM+EzcxHvKZeohVKcygeBgW+sme62Ex2e4Ont5T/HiL2dm400pkdtVVdqhc02PXi6dbp/izf/Obi1rP0fRY3OdcFUGzLqfI7mKp7GCKrE7Ex/GZ39ysr4nZjc7+d3zDbhGEQr0tMNqu5/pLGE53sXEUo/scR/U4M42YWDh+7pmHheeHpzlYuH4COz9LzEQyzqPoaXNnwV/W85AcDwPOOLWXyWrAHD8tJyk+D9ijvmNDsjEMXIT5wBydB67izAgGvDTKHSEdxi3I9A6MlNhN9yCTuOwgNEf7rcBbXJ41NdUgXvPJ8Q9nq9OcB0qbzc4n/xgLm5T2OBgQ/gIwNL+sy2TQdQAAAABJRU5ErkJggg==","e":1},{"id":"image_2","w":409,"h":372,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZkAAAF0BAMAAAADUVmhAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAD1BMVEVHcEwAAAAAAAAAAAAAAADTrAj/AAAABHRSTlMAwECBSPoMaQAAAetJREFUeNrt3b1xwzAMBlBa9gBxogGUnAdwfgawZO4/U5Te4OXYGNK9r2WDB7IED6Uczo8zlaQZgoK/1rNjDTJn1YxRxWv/T9FZvebEhO2vS0Nabzk1cfvnlmbJqbmEBddS6q40Iw0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NzdM0911pkq7HHvs0f7uz82WonZplYw+tralv3+nyWbs1WwsNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ3NbjXndOnXzNO2hrvbmmvGeehjrybn5H2nJumviJ9daS59Gr+JaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGho/plTSxNTbzk1h7Dge2tL+5RTEy9ifynxXvPXpJjyHl/Nmo/HKWkzhAX/Au3ulk8gccdwAAAAAElFTkSuQmCC","e":1},{"id":"image_3","w":255,"h":236,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAP8AAADsBAMAAABJZG3MAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAG1BMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABp4cHsAAAACHRSTlMAP4HC6hVmqOdw3OAAAARmSURBVHja7ZzLT9tAEIftukk4hpRWOfLoI8eWR8kxgBA5pgQBx0BbkWMrAfKxQCD7ZxeU0vLwbhzb+/ukwvwD89k7MzsvOwhcEtY+LBUpq9VgAinVlk3RMpxEfdN4kNm0+ndj40VaKR//q/EkZ+n0HxsUIGwaFKDsUX8aAJ/Pnwag5FX/eIBSw7AAM4YF2DYsgF8DTAHQNyzAnmEBSk0YYMawAGEbBlC8ABdA2cAAdRhAYgEuAIkFOABKbRiga2CAGAYoGxigDgMoriEnwAsDA9RpgDYMoDsBC8AODRDDAKGBASIaoE4DxDBAycAAFRpghwbo0wBNGEBqg+YSvYlMYqs2kgIk9Ov3lfrXJneCwep8cfK+M3EgPu0EvsWVjg3eeVfvTgYE+p010ZpAv+squugoABxh4IdCfzBlfwES/Y58bJMGqGoAGjb9wwAGuBQBxKwPOPKhKg3QgQFEUcAOMKQBzp8BgqduhIPgqccB06MvoxYNcCUCsBZGA5ER2DOiWQ3AfrY5c3Hy0l6XaTKCCC6MnA0SSShwFadDhSM4e1TrCgLnuGa9CobCkSucvuYiUU7ZWJo/SHOEUz67YoPFgzwdikJkaxyC/7n1ltuSBasLg5/ZytMCxRlQJDOrYTXLfVjoMfRAKxxHIJqd2/OLhqhXf2EjkI3NzjuT5yT+5xWBbovqWk4mrA1UhiicW51PPrQoWFZQR7QegnJ+fUWfQXIPWHgGyR1I6fz2hI1FlmFY3cCuWFYCXFCZodMRpLs0SY6g2+q0dR66SoAz+hUk3ghd2hOljjBkc0PbVLAvBEgcjYs+cnBMZPbgUCA9hOT1hLDJ+sH1rdhm/UBpBh8tpeorND2+kW+q+yCgCewtE9EpOAaD223UCG7iwbEAwD0fP2xjkeA2QzryHhXHbgq9WfD7GtLsSoXTtawbrMu5rLAI+fI2lxUWIbUxR+h/KDcmoAgmo9uZLsQipZvXDbzOJSVbGq4cS7OwNpMlJSh0Pt/OehsIhsOaZSVHzSlalGmigcDZiv4VwGcgWl6292FFu0r2aKja29ynASpsLHZ0olWbqyUawD4fVwHENEDjGeAZ4MkD4G7YhAHwUBzSABUaYIdOSPo0AJ2Ulg0MgBcmMVyalXP0Sv+L8hxvUNAtmpBuUvXhNt0e3Kh0T2JbsH7/Parddp6hUX77P0o3Ow2nvcjhQsqRzQvlJl+SE8SY/tFVFHL6RzZY4fSPbDDiAK5ogBYN0IMB/oShCDYBEKBFA1RhgNvCGAPYpAFmYYC/rQkK4IwG6MEA/0qSiPUBDKAKA9ypySI0CFAAd6tiBGAFBrj3nU8EvwAC4P6HThH8AgCAB1966QEefOsmB3jYoZcD9GCAR98+iwEe/9xFC5DwDwAtwKeABVgPWIDEj02FAMkfXesABsmNWRmA7dfDEaxfBWD/CYgGwPEjFgnA506WdcviHv97pu2KwqLPXI6pVn7ZmuuMnWs0fSnfWJxLN5PxMjBJOw76DSVWeHmUIIBYAAAAAElFTkSuQmCC","e":1},{"id":"image_4","w":167,"h":51,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKcAAAAzBAMAAAAAzwWKAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAElBMVEUAAAAAAAAAAAAAAAAAAAAAAADgKxmiAAAABXRSTlPAQAiYYEpThqUAAABeSURBVFjD7dcxDkBgFAThTcQBOMHmoReJXqOn+O9/FQ6xopk5wNePalK2rqy5pbutJY42a8+jq/o8KjVQUFBQUFBQUFBQUFDQ/9FPju/Mo4ccNy+r4hu9vWgN2cbyA40OTBc1zimsAAAAAElFTkSuQmCC","e":1},{"id":"image_5","w":285,"h":253,"u":"","p":"data:image/png;base64,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","e":1},{"id":"comp_0","nm":"LOGO TYPE","fr":60,"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Layer 3","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[991.392,357.033,0],"ix":2,"l":2},"a":{"a":0,"k":[137.858,120.65,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"Layer 4","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[296.234,292.154,0],"ix":2,"l":2},"a":{"a":0,"k":[204.073,185.706,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"Layer 5","refId":"image_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1296.85,351.007,0],"ix":2,"l":2},"a":{"a":0,"k":[127.082,117.626,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"Layer 6","refId":"image_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1553.441,345.34,0],"ix":2,"l":2},"a":{"a":0,"k":[83.469,25.25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"Layer 7","refId":"image_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[680.238,351.587,0],"ix":2,"l":2},"a":{"a":0,"k":[142.268,126.096,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":150,"st":0,"bm":0}]},{"id":"comp_1","nm":"motion logo","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"blue-shift","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[774.261,820.399,0],"ix":2,"l":2},"a":{"a":0,"k":[234.261,448.399,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[43,-53],[50,-31],[-68,7],[0,0]],"o":[[-43,53],[-50,31],[68,-7],[0,0]],"v":[[288,451],[135,504],[215,515],[341,414]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.715,"s":[{"i":[[43,-53],[50,-31],[-68,7],[0,0]],"o":[[-43,53],[-50,31],[68,-7],[0,0]],"v":[[240,375],[140,453],[215,515],[341,414]],"c":true}]},{"t":70,"s":[{"i":[[68.076,4.863],[-4,-83],[-68,7],[0,0]],"o":[[-294,-21],[2.832,58.762],[68,-7],[0,0]],"v":[[260,-5],[-52,453],[215,515],[341,414]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.36862745098,0.619607843137,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-12,-4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"blue","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[544,556,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[37,-21],[1,-47],[0,-57],[1,-1],[-2,-43],[0,0],[-119,0],[0,0],[2,94]],"o":[[-37,21],[-1,47],[0,57],[-1,1],[2,43],[0,0],[119,0],[0,0],[-2,-94]],"v":[[155,-151],[67,-37],[97,67],[38,167],[-28,252],[22,306],[164,304],[278,214],[277,-59]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.36862745098,0.619607843137,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"yellow-shift","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[334.314,827.089,0],"ix":2,"l":2},"a":{"a":0,"k":[-205.686,455.089,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[31,-22],[-54,-12],[8,37],[14,42]],"o":[[-31,22],[54,12],[-8,-37],[-14,-42]],"v":[[-331,426],[-244,520],[-132,511],[-261,490]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.715,"s":[{"i":[[31,-22],[-54,-12],[8,37],[14,42]],"o":[[-31,22],[54,12],[-8,-37],[-14,-42]],"v":[[-284,385],[-244,520],[-128,487],[-214,450]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38.424,"s":[{"i":[[31,-22],[-54,-12],[-14.656,89.562],[30.844,97.188]],"o":[[-31,22],[54,12],[0.312,-105.719],[-35.156,-92.812]],"v":[[-287.625,278.969],[-244,520],[-28.312,373.719],[-144.844,278.812]],"c":true}]},{"t":70,"s":[{"i":[[31,-22],[-54,-12],[-42,153],[128,4]],"o":[[-31,22],[54,12],[10.021,-36.505],[-44.25,-1.383]],"v":[[-292,151],[-244,520],[92,237],[-132,134]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.36862745098,0.619607843137,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-12,-4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"yellow","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[544,613,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[71,11],[2,-47],[0,0],[-60,0],[-33,47],[-25.152,19.631],[95,7]],"o":[[-34.939,-5.413],[-2,47],[0,0],[60,0],[33,-47],[41,-32],[-93.794,-6.911]],"v":[[-213,-53],[-291,15],[-292,229],[-231,295],[-96,223],[14,120],[-36,-23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.839215746113,0.427451010311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-52],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"red-shift","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[504.797,262.115,0],"ix":2,"l":2},"a":{"a":0,"k":[-35.203,-109.885,0],"ix":1,"l":2},"s":{"a":0,"k":[64.141,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[-17,-28],[-33,17],[-25,-2],[-20.17,17]],"o":[[0,0],[17,28],[33,-17],[25,2],[35.578,-29.987]],"v":[[-78.709,-172],[-106.142,-156],[-62.354,-154],[-17.213,-145],[7.11,-159]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.715,"s":[{"i":[[0,0],[-17,-28],[-33,17],[-25,-2],[41,22]],"o":[[0,0],[17,28],[33,-17],[25,2],[-41,-22]],"v":[[-60,-147],[-142,-96],[-53,-84],[28,-101],[57,-145]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38.424,"s":[{"i":[[0,0],[-19.047,-26.504],[-34.856,9.919],[-13.592,10.27],[41,22]],"o":[[0,0],[40.878,51.562],[79.238,-11.562],[13.434,-32.891],[-41,-22]],"v":[[-69.184,-151.078],[-257.857,-23.953],[-57.848,-31.203],[141.032,-64.75],[83.845,-137.75]],"c":true}]},{"t":70,"s":[{"i":[[0,0],[-21.517,-24.698],[-37.097,1.374],[0.175,25.079],[41,22]],"o":[[0,0],[69.696,80],[135.043,-5],[-0.524,-75],[-41,-22]],"v":[[-80.268,-156],[-397.685,63],[-32.732,123],[277.449,-21],[116.244,-129]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.36862745098,0.619607843137,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-12,-4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"red","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[467.595,366.863,0],"ix":2,"l":2},"a":{"a":0,"k":[-76.405,-189.137,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[50,23],[57,-46],[0,0],[-17,-31],[0,0],[-40,-5],[-39,71]],"o":[[-50,-23],[-57,46],[0,0],[17,31],[0,0],[40,5],[39,-71]],"v":[[48,-308],[-110,-303],[-237,-180],[-255,-116],[-216,-88],[-92,-71],[89,-157]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.400000029919,0.400000029919,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":12}]}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"Group 33765.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":94,"s":[0]},{"t":104,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[565,399,0],"ix":2,"l":2},"a":{"a":0,"k":[123,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[89.189,89.189,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"LOGO TYPE","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":90,"s":[0]},{"t":100,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":70,"s":[540,888,0],"to":[0,-16.667,0],"ti":[0,16.667,0]},{"t":100,"s":[540,788,0]}],"ix":2,"l":2},"a":{"a":0,"k":[858,292,0],"ix":1,"l":2},"s":{"a":0,"k":[38,38,100],"ix":6,"l":2}},"ao":0,"w":1716,"h":584,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"motion logo","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":70,"s":[540,540,0],"to":[0,-18.667,0],"ti":[0,18.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":100,"s":[540,428,0],"to":[0,0,0],"ti":[0,0,0]},{"t":126,"s":[540,428,0]}],"ix":2,"l":2},"a":{"a":0,"k":[540,540,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":70,"s":[100,100,100]},{"t":100,"s":[70,70,100]}],"ix":6,"l":2}},"ao":0,"w":1080,"h":1080,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[540,540,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":1080,"sh":1080,"sc":"#ffffff","ip":0,"op":150,"st":0,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"5.9.0","fr":60,"ip":0,"op":150,"w":1080,"h":1080,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","nm":"smile","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[123,129.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[237.326,158.375,0],"ix":2,"l":2},"a":{"a":0,"k":[114.326,28.875,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3,-10.25]],"o":[[0,0],[3,10.25]],"v":[[117.75,18],[111.5,39.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[211.125,144.523,0],"ix":2,"l":2},"a":{"a":0,"k":[88.125,15.023,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-38,9.25]],"o":[[0,0],[38,-9.25]],"v":[[60.5,4],[115.75,24.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[181.068,131.125,0],"ix":2,"l":2},"a":{"a":0,"k":[58.068,1.625,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[17.75,-7.5]],"o":[[0,0],[-17.75,7.5]],"v":[[64.75,-9.75],[51,13]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[137.757,35.125,0],"ix":2,"l":2},"a":{"a":0,"k":[14.757,-94.375,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7,-26.75]],"o":[[0,0],[7,26.75]],"v":[[17.5,-117.75],[14.5,-71]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[98.375,44.801,0],"ix":2,"l":2},"a":{"a":0,"k":[-24.625,-84.699,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-34.25,27.75]],"o":[[0,0],[34.25,-27.75]],"v":[[-60.75,-74.25],[11.5,-95.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[46.5,59.875,0],"ix":2,"l":2},"a":{"a":0,"k":[-76.5,-69.625,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.75,-39.25]],"o":[[0,0],[7.75,39.25]],"v":[[-107.75,-90.25],[-45.25,-49]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.56,220,0],"ix":2,"l":2},"a":{"a":0,"k":[-35.44,90.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-22.75,-0.5]],"o":[[0,0],[22.75,0.5]],"v":[[-45.25,75.75],[-25.5,105.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,235.83,0],"ix":2,"l":2},"a":{"a":0,"k":[-73,106.33,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-27.75,27.75]],"o":[[0,0],[27.75,-27.75]],"v":[[-102.5,114.5],[-43.5,96.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[18.268,249.375,0],"ix":2,"l":2},"a":{"a":0,"k":[-104.732,119.875,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.75,-22.75]],"o":[[0,0],[0.462,14.028]],"v":[[-117.5,102.5],[-95.25,133.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"eyes","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[70.5,17.125,0],"ix":2,"l":2},"a":{"a":0,"k":[-53.125,-112.375,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10.25,10.25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-63.75,71.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 9","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.125,11.125],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.438,88.062],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 8","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10.75,10.75],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-97.375,83.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10.75,10.75],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[89.375,1.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10.625,10.625],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.938,-0.063],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10.5,10.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.125,-14.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10.375,10.375],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-11.562,-122.312],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.25,11.25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-22.875,-107],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11,11],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-53.125,-112.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0}]},{"id":"comp_1","nm":"LOGO TYPE","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[991.392,357.033,0],"ix":2,"l":2},"a":{"a":0,"k":[137.858,120.65,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-2.761],[0,0],[-137.608,0],[0,0],[0,0],[2.761,0],[0,0],[0,-2.761],[0,0],[84.426,0],[0,0],[0,0],[2.761,0]],"o":[[-2.761,0],[0,0],[0,0],[137.608,0],[0,0],[0,-2.761],[0,0],[-2.762,0],[0,0],[0,0],[-84.425,0],[0,0],[0,-2.761],[0,0]],"v":[[-129.149,-120.4],[-134.149,-115.4],[-134.149,-4.446],[0,120.4],[134.149,-4.446],[134.149,-115.4],[129.149,-120.4],[89.149,-120.4],[84.149,-115.4],[84.149,-4.446],[1.097,70.4],[-84.149,-4.446],[-84.149,-115.4],[-89.149,-120.4]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.858,120.65],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[296.234,292.154,0],"ix":2,"l":2},"a":{"a":0,"k":[204.073,185.706,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.761],[0,0],[-2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[-2.761,0],[0,0],[0,2.761],[0,0],[2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[2.761,0],[0,0],[0,-2.761],[0,0],[-2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[-2.761,0]],"v":[[-203.823,-180.456],[-203.823,180.457],[-198.823,185.457],[-155.823,185.457],[-150.823,180.457],[-150.823,30],[-145.823,25],[145.823,25],[150.823,30],[150.823,180.457],[155.823,185.457],[198.823,185.457],[203.823,180.457],[203.823,-180.456],[198.823,-185.456],[155.823,-185.456],[150.823,-180.456],[150.823,-32.999],[145.823,-27.999],[-145.823,-27.999],[-150.823,-32.999],[-150.823,-180.456],[-155.823,-185.456],[-198.823,-185.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[204.073,185.707],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1296.85,351.007,0],"ix":2,"l":2},"a":{"a":0,"k":[127.082,117.626,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[42.85,0],[0,0],[0,9.844],[-11.133,0],[0,0],[0,2.762],[0,0],[2.762,0],[0,0],[0,-36.956],[-38.245,0],[0,0],[0,-14.208],[15.738,0],[0,0],[0,-2.761],[0,0],[-2.762,0],[0,0],[0,41.321]],"o":[[0,0],[-11.133,0],[0,-9.845],[0,0],[2.762,0],[0,0],[0,-2.761],[0,0],[-38.245,0],[0,36.956],[0,0],[15.738,0],[0,14.208],[0,0],[-2.762,0],[0,0],[0,2.761],[0,0],[42.85,0],[0,-41.321]],"v":[[49.121,-32.501],[-57.472,-32.501],[-77.663,-50.352],[-57.472,-68.205],[91.022,-68.205],[96.022,-73.205],[96.022,-112.376],[91.022,-117.376],[-57.472,-117.376],[-126.832,-50.352],[-57.472,16.669],[49.121,16.669],[77.663,42.438],[49.121,68.206],[-120.722,68.206],[-125.722,73.206],[-125.722,112.376],[-120.722,117.376],[49.121,117.376],[126.832,42.438]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[127.082,117.626],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1553.441,345.34,0],"ix":2,"l":2},"a":{"a":0,"k":[83.469,25.25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.761,0],[0,0],[0,-2.761],[0,0],[-2.762,0],[0,0],[0,2.761],[0,0]],"o":[[0,0],[-2.762,0],[0,0],[0,2.761],[0,0],[2.761,0],[0,0],[0,-2.761]],"v":[[78.219,-25],[-78.219,-25],[-83.219,-20],[-83.219,20],[-78.219,25],[78.219,25],[83.219,20],[83.219,-20]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.469,25.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 7 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[680.238,351.587,0],"ix":2,"l":2},"a":{"a":0,"k":[142.268,126.096,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[40.821,0],[0,0],[-0.745,42.021],[-40.821,0],[0,0],[0.745,-42.021]],"o":[[0,0],[-42.027,0],[0.721,-40.652],[0,0],[42.028,0],[-0.72,40.651]],"v":[[16.803,75.846],[-15.771,75.846],[-91.637,-2.147],[-16.802,-75.846],[15.771,-75.846],[91.637,0.547]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[69.067,0],[0,0],[0.37,-68.918],[-69.068,0],[0,0],[-0.369,68.918]],"o":[[0,0],[-68.919,0],[-0.371,69.151],[0,0],[68.919,0],[0.371,-69.152]],"v":[[16.803,-125.846],[-15.379,-125.846],[-141.647,-1.481],[-16.802,125.846],[15.379,125.846],[141.647,-0.119]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[142.268,126.096],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0}]},{"id":"comp_2","nm":"motion logo","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"blue-shift","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[774.261,820.399,0],"ix":2,"l":2},"a":{"a":0,"k":[234.261,448.399,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[43,-53],[50,-31],[-68,7],[0,0]],"o":[[-43,53],[-50,31],[68,-7],[0,0]],"v":[[288,451],[135,504],[215,515],[341,414]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14.797,"s":[{"i":[[43,-53],[50,-31],[-68,7],[0,0]],"o":[[-43,53],[-50,31],[68,-7],[0,0]],"v":[[240,375],[140,453],[215,515],[341,414]],"c":true}]},{"t":50,"s":[{"i":[[68.076,4.863],[-4,-83],[-68,7],[0,0]],"o":[[-294,-21],[2.832,58.762],[68,-7],[0,0]],"v":[[260,-5],[-52,453],[215,515],[341,414]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.36862745098,0.619607843137,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-12,-4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"blue","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[544,556,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[37,-21],[1,-47],[0,-57],[1,-1],[-2,-43],[0,0],[-119,0],[0,0],[2,94]],"o":[[-37,21],[-1,47],[0,57],[-1,1],[2,43],[0,0],[119,0],[0,0],[-2,-94]],"v":[[155,-151],[67,-37],[97,67],[38,167],[-28,252],[22,306],[164,304],[278,214],[277,-59]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.36862745098,0.619607843137,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"yellow-shift","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[334.314,827.089,0],"ix":2,"l":2},"a":{"a":0,"k":[-205.686,455.089,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[31,-22],[-54,-12],[8,37],[14,42]],"o":[[-31,22],[54,12],[-8,-37],[-14,-42]],"v":[[-331,426],[-244,520],[-132,511],[-261,490]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14.797,"s":[{"i":[[31,-22],[-54,-12],[8,37],[14,42]],"o":[[-31,22],[54,12],[-8,-37],[-14,-42]],"v":[[-284,385],[-244,520],[-128,487],[-214,450]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27.445,"s":[{"i":[[31,-22],[-54,-12],[-14.656,89.562],[30.844,97.188]],"o":[[-31,22],[54,12],[0.312,-105.719],[-35.156,-92.812]],"v":[[-287.625,278.969],[-244,520],[-28.312,373.719],[-144.844,278.812]],"c":true}]},{"t":50,"s":[{"i":[[31,-22],[-54,-12],[-42,153],[128,4]],"o":[[-31,22],[54,12],[10.021,-36.505],[-44.25,-1.383]],"v":[[-292,151],[-244,520],[92,237],[-132,134]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.36862745098,0.619607843137,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-12,-4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"yellow","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[544,613,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[71,11],[2,-47],[0,0],[-60,0],[-33,47],[-25.152,19.631],[95,7]],"o":[[-34.939,-5.413],[-2,47],[0,0],[60,0],[33,-47],[41,-32],[-93.794,-6.911]],"v":[[-213,-53],[-291,15],[-292,229],[-231,295],[-96,223],[14,120],[-36,-23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.839215746113,0.427451010311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-52],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"red-shift","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[504.797,262.115,0],"ix":2,"l":2},"a":{"a":0,"k":[-35.203,-109.885,0],"ix":1,"l":2},"s":{"a":0,"k":[64.141,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[-17,-28],[-33,17],[-25,-2],[-20.17,17]],"o":[[0,0],[17,28],[33,-17],[25,2],[35.578,-29.987]],"v":[[-78.709,-172],[-106.142,-156],[-62.354,-154],[-17.213,-145],[7.11,-159]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14.797,"s":[{"i":[[0,0],[-17,-28],[-33,17],[-25,-2],[41,22]],"o":[[0,0],[17,28],[33,-17],[25,2],[-41,-22]],"v":[[-60,-147],[-142,-96],[-53,-84],[28,-101],[57,-145]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[{"i":[[0,0],[-19.047,-26.504],[-54.685,7.203],[-15.808,25.75],[41,22]],"o":[[0,0],[40.878,51.562],[79.238,-11.562],[13.434,-32.891],[-41,-22]],"v":[[-69.184,-151.078],[-257.857,-23.953],[-55.509,-22.703],[141.032,-64.75],[83.845,-137.75]],"c":true}]},{"t":50,"s":[{"i":[[0,0],[-21.517,-24.698],[-37.097,1.374],[0.175,25.079],[41,22]],"o":[[0,0],[69.696,80],[135.043,-5],[-0.524,-75],[-41,-22]],"v":[[-80.268,-156],[-397.685,63],[-32.732,123],[277.449,-21],[116.244,-129]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.36862745098,0.619607843137,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-12,-4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"red","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[467.595,366.863,0],"ix":2,"l":2},"a":{"a":0,"k":[-76.405,-189.137,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[50,23],[57,-46],[0,0],[-17,-31],[0,0],[-40,-5],[-39,71]],"o":[[-50,-23],[-57,46],[0,0],[17,31],[0,0],[40,5],[39,-71]],"v":[[48,-308],[-110,-303],[-237,-180],[-255,-116],[-216,-88],[-92,-71],[89,-157]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.400000029919,0.400000029919,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":12}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"smile","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":58,"s":[0]},{"t":68,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[565,399,0],"ix":2,"l":2},"a":{"a":0,"k":[123,129.5,0],"ix":1,"l":2},"s":{"a":0,"k":[89.189,89.189,100],"ix":6,"l":2}},"ao":0,"w":246,"h":259,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"LOGO TYPE","refId":"comp_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":54,"s":[0]},{"t":64,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":34,"s":[540,888,0],"to":[0,-16.667,0],"ti":[0,16.667,0]},{"t":64,"s":[540,788,0]}],"ix":2,"l":2},"a":{"a":0,"k":[858,292,0],"ix":1,"l":2},"s":{"a":0,"k":[38,38,100],"ix":6,"l":2}},"ao":0,"w":1716,"h":584,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"motion logo","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":34,"s":[540,540,0],"to":[0,-18.667,0],"ti":[0,18.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":64,"s":[540,428,0],"to":[0,0,0],"ti":[0,0,0]},{"t":90,"s":[540,428,0]}],"ix":2,"l":2},"a":{"a":0,"k":[540,540,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":34,"s":[100,100,100]},{"t":64,"s":[70,70,100]}],"ix":6,"l":2}},"ao":0,"w":1080,"h":1080,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2,"l":2},"a":{"a":0,"k":[540,540,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":1080,"sh":1080,"sc":"#ffffff","ip":0,"op":150,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/java/hous/release/android/presentation/hous/HousFragment.kt b/app/src/main/java/hous/release/android/presentation/hous/HousFragment.kt index 3923fca31..10f987799 100644 --- a/app/src/main/java/hous/release/android/presentation/hous/HousFragment.kt +++ b/app/src/main/java/hous/release/android/presentation/hous/HousFragment.kt @@ -21,6 +21,7 @@ import hous.release.android.util.HousLogEvent.clickLogEvent import hous.release.android.util.ToastMessageUtil import hous.release.android.util.binding.BindingFragment import hous.release.android.util.extension.repeatOnStarted +import hous.release.android.util.extension.setOnSingleClickListener import hous.release.domain.entity.HomyType import hous.release.domain.entity.response.Homy @@ -66,7 +67,7 @@ class HousFragment : BindingFragment(R.layout.fragment_hous } private fun initClickListener() { - binding.btnHousEdit.setOnClickListener { + binding.btnHousEdit.setOnSingleClickListener { startActivity( Intent(requireContext(), EditHousNameActivity::class.java).apply { putExtra(ROOM_NAME, viewModel.hous.value.roomName) diff --git a/app/src/main/java/hous/release/android/presentation/hous/adapter/HomiesAdapter.kt b/app/src/main/java/hous/release/android/presentation/hous/adapter/HomiesAdapter.kt index 7d399c2da..9c8ed144f 100644 --- a/app/src/main/java/hous/release/android/presentation/hous/adapter/HomiesAdapter.kt +++ b/app/src/main/java/hous/release/android/presentation/hous/adapter/HomiesAdapter.kt @@ -6,6 +6,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import hous.release.android.databinding.ItemHousHomiesBinding import hous.release.android.util.ItemDiffCallback +import hous.release.android.util.extension.setOnSingleClickListener import hous.release.domain.entity.response.Homy class HomiesAdapter( @@ -18,7 +19,7 @@ class HomiesAdapter( fun bind(homy: Homy) { binding.homy = homy binding.executePendingBindings() - binding.clHousProfile.setOnClickListener { + binding.clHousProfile.setOnSingleClickListener { onClickHomie(homy, absoluteAdapterPosition) } } diff --git a/app/src/main/java/hous/release/android/presentation/login/UserInputActivity.kt b/app/src/main/java/hous/release/android/presentation/login/UserInputActivity.kt index 5d2631926..ea28527e6 100644 --- a/app/src/main/java/hous/release/android/presentation/login/UserInputActivity.kt +++ b/app/src/main/java/hous/release/android/presentation/login/UserInputActivity.kt @@ -1,18 +1,23 @@ package hous.release.android.presentation.login +import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle +import android.view.inputmethod.EditorInfo import androidx.activity.OnBackPressedCallback import androidx.activity.viewModels import dagger.hilt.android.AndroidEntryPoint import hous.release.android.R import hous.release.android.databinding.ActivityUserInputBinding import hous.release.android.presentation.enter_room.EnterRoomActivity +import hous.release.android.util.KeyBoardUtil import hous.release.android.util.ToastMessageUtil import hous.release.android.util.binding.BindingActivity import hous.release.android.util.dialog.DatePickerClickListener import hous.release.android.util.dialog.DatePickerDialog import hous.release.android.util.dialog.WarningDialogFragment.Companion.CONFIRM_ACTION +import hous.release.android.util.extension.repeatOnStarted +import hous.release.android.util.extension.setOnSingleClickListener import kotlin.system.exitProcess @AndroidEntryPoint @@ -23,10 +28,31 @@ class UserInputActivity : BindingActivity(R.layout.act override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.vm = userInputViewModel + initSignUpCollect() initNextBtnOnClickListener() initBackPressedCallback() - initSignUpObserve() initBirthdayOnClickListener() + initEditTextClearFocus() + initKeyboardNextClickListener() + } + + private fun initSignUpCollect() { + repeatOnStarted { + userInputViewModel.isSignUp.collect { success -> + if (success) { + startActivity(Intent(this, EnterRoomActivity::class.java)) + finishAffinity() + } + } + } + } + + private fun initNextBtnOnClickListener() { + binding.btnUserInputNext.setOnClickListener { + val toEnterRoom = Intent(this, EnterRoomActivity::class.java) + startActivity(toEnterRoom) + finishAffinity() + } } private fun initBackPressedCallback() { @@ -50,32 +76,16 @@ class UserInputActivity : BindingActivity(R.layout.act ) } - private fun initSignUpObserve() { - userInputViewModel.isSignUp.observe(this) { - if (userInputViewModel.isSignUp.value == true) { - val toEnterRoom = Intent(this, EnterRoomActivity::class.java) - startActivity(toEnterRoom) - finishAffinity() - } - } - } - - private fun initNextBtnOnClickListener() { - binding.btnUserInputNext.setOnClickListener { - val toEnterRoom = Intent(this, EnterRoomActivity::class.java) - startActivity(toEnterRoom) - finishAffinity() - } - } - private fun initBirthdayOnClickListener() { - binding.etUserInputBirthday.setOnClickListener { + binding.etUserInputBirthday.setOnSingleClickListener { DatePickerDialog().apply { arguments = Bundle().apply { putParcelable( CONFIRM_ACTION, DatePickerClickListener( - confirmActionWithDate = { date -> initDate(date) } + confirmActionWithDate = { date -> + userInputViewModel.initSelectedBirthDate(date) + } ) ) } @@ -83,8 +93,24 @@ class UserInputActivity : BindingActivity(R.layout.act } } - private fun initDate(date: String) { - userInputViewModel.initSelectedBirthDate(date) + @SuppressLint("ClickableViewAccessibility") + private fun initEditTextClearFocus() { + binding.clUserInput.setOnTouchListener { _, _ -> + KeyBoardUtil.hide(activity = this) + return@setOnTouchListener false + } + } + + private fun initKeyboardNextClickListener() { + binding.etUserInputNickname.setOnEditorActionListener { _, actionId, _ -> + var handled = false + if (actionId == EditorInfo.IME_ACTION_NEXT) { + binding.etUserInputBirthday.performClick() + handled = true + } + KeyBoardUtil.hide(activity = this) + handled + } } companion object { diff --git a/app/src/main/java/hous/release/android/presentation/login/UserInputViewModel.kt b/app/src/main/java/hous/release/android/presentation/login/UserInputViewModel.kt index 343201ec9..7bc9ec5f3 100644 --- a/app/src/main/java/hous/release/android/presentation/login/UserInputViewModel.kt +++ b/app/src/main/java/hous/release/android/presentation/login/UserInputViewModel.kt @@ -1,7 +1,5 @@ package hous.release.android.presentation.login -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -9,6 +7,9 @@ import hous.release.domain.entity.SplashState import hous.release.domain.usecase.InitHousTokenUseCase import hous.release.domain.usecase.PostSignUpUseCase import hous.release.domain.usecase.SetSplashStateUseCase +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch import javax.inject.Inject @@ -18,27 +19,25 @@ class UserInputViewModel @Inject constructor( private val initHousTokenUseCase: InitHousTokenUseCase, private val setSplashStateUseCase: SetSplashStateUseCase ) : ViewModel() { - val nickname = MutableLiveData() + val nickname = MutableStateFlow("") + val birthday = MutableStateFlow("") + val isPrivateBirthday = MutableStateFlow(false) - val birthday = MutableLiveData("") - - val isPrivateBirthday = MutableLiveData(false) - - private val _isSignUp = MutableLiveData() - val isSignUp: LiveData = _isSignUp + private val _isSignUp = MutableSharedFlow() + val isSignUp = _isSignUp.asSharedFlow() fun nextOnClick() { viewModelScope.launch { postSignUpUseCase( - birthday = requireNotNull(birthday.value), - isPublic = requireNotNull(isPrivateBirthday.value != true), - nickname = requireNotNull(nickname.value) + birthday = birthday.value, + isPublic = !isPrivateBirthday.value, + nickname = nickname.value ).onSuccess { response -> initHousTokenUseCase(response.token) setSplashStateUseCase(SplashState.ENTER_ROOM) - _isSignUp.value = true + _isSignUp.emit(true) }.onFailure { - _isSignUp.value = false + _isSignUp.emit(false) } } } diff --git a/app/src/main/java/hous/release/android/presentation/our_rules/add_rule/OurRuleAddFragment.kt b/app/src/main/java/hous/release/android/presentation/our_rules/add_rule/OurRuleAddFragment.kt index 0d618c663..b5ee0ac47 100644 --- a/app/src/main/java/hous/release/android/presentation/our_rules/add_rule/OurRuleAddFragment.kt +++ b/app/src/main/java/hous/release/android/presentation/our_rules/add_rule/OurRuleAddFragment.kt @@ -13,6 +13,7 @@ import hous.release.android.databinding.FragmentOurRuleAddBinding import hous.release.android.presentation.our_rules.adapter.OurRulesAddAdapter import hous.release.android.presentation.our_rules.type.ButtonState import hous.release.android.util.KeyBoardUtil +import hous.release.android.util.ToastMessageUtil import hous.release.android.util.binding.BindingFragment import hous.release.android.util.dialog.ConfirmClickListener import hous.release.android.util.dialog.LoadingDialogFragment @@ -37,9 +38,10 @@ class OurRuleAddFragment : initSaveButtonListener() initAddRuleButtonListener() initAdapter() - collectUiState() + collectUiStateAndUiEvent() } + // // {"status":409,"success":false,"message":"이미 존재하는 규칙입니다."} override fun onDestroyView() { super.onDestroyView() onBackPressedCallback.remove() @@ -54,17 +56,36 @@ class OurRuleAddFragment : private fun hideKeyBoard() = KeyBoardUtil.hide(requireActivity()) - private fun collectUiState() { + private fun collectUiStateAndUiEvent() { repeatOnStarted { - viewModel.uiState.collect { uiState -> - requireNotNull(ourRulesAddAdapter) { - getString(R.string.null_point_exception) - }.submitList(uiState.ourRuleList) - if (viewModel.uiState.value.addedRuleList.isNotEmpty()) { - viewModel.setSaveButtonState(ButtonState.ACTIVE) - } else { - viewModel.setSaveButtonState(ButtonState.INACTIVE) - } + viewModel.uiState.collect(::handelUiState) + } + repeatOnStarted { + viewModel.uiEvent.collect(::handleUiEvent) + } + } + + private fun handelUiState(uiState: OurRuleAddUIState) { + requireNotNull(ourRulesAddAdapter) { + getString(R.string.null_point_exception) + }.submitList(uiState.ourRuleList) + if (viewModel.uiState.value.addedRuleList.isNotEmpty()) { + viewModel.setSaveButtonState(ButtonState.ACTIVE) + } else { + viewModel.setSaveButtonState(ButtonState.INACTIVE) + } + } + + private fun handleUiEvent(uiEvent: OurRuleAddEvent) { + when (uiEvent) { + is OurRuleAddEvent.DuplicateError -> { + ToastMessageUtil.showToast( + requireContext(), + getString(R.string.our_rule_duplicate_rule) + ) + } + is OurRuleAddEvent.AddSuccess -> { + findNavController().popBackStack() } } } @@ -94,9 +115,8 @@ class OurRuleAddFragment : viewLifecycleOwner.lifecycleScope.launch { val loadingDialogFragment = LoadingDialogFragment() loadingDialogFragment.show(childFragmentManager, LoadingDialogFragment.TAG) - viewModel.putAddRuleList().join() + viewModel.addRuleList().join() loadingDialogFragment.dismiss() - findNavController().popBackStack() } } } diff --git a/app/src/main/java/hous/release/android/presentation/our_rules/add_rule/OurRuleAddViewModel.kt b/app/src/main/java/hous/release/android/presentation/our_rules/add_rule/OurRuleAddViewModel.kt index 5ab350dcd..dec30f312 100644 --- a/app/src/main/java/hous/release/android/presentation/our_rules/add_rule/OurRuleAddViewModel.kt +++ b/app/src/main/java/hous/release/android/presentation/our_rules/add_rule/OurRuleAddViewModel.kt @@ -8,8 +8,11 @@ import hous.release.domain.entity.ApiResult import hous.release.domain.entity.response.OurRule import hous.release.domain.usecase.GetOurRulesUseCase import hous.release.domain.usecase.PostAddRulesUseCase +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -20,28 +23,27 @@ import javax.inject.Inject class OurRuleAddViewModel @Inject constructor( private val ourRulesUseCase: GetOurRulesUseCase, private val postAddRulesUseCase: PostAddRulesUseCase -) : - ViewModel() { +) : ViewModel() { private var tmpId = -1 var inputRuleNameField = MutableStateFlow("") private var _uiState = MutableStateFlow(OurRuleAddUIState()) val uiState: StateFlow = _uiState.asStateFlow() + private val _uiEvent = MutableSharedFlow() + val uiEvent: SharedFlow = _uiEvent.asSharedFlow() init { viewModelScope.launch { ourRulesUseCase().collect { apiResult -> when (apiResult) { - is ApiResult.Success -> - _uiState.update { uiState -> - uiState.copy(isLoading = false, ourRuleList = apiResult.data) - } + is ApiResult.Success -> _uiState.update { uiState -> + uiState.copy(isLoading = false, ourRuleList = apiResult.data) + } is ApiResult.Empty -> { _uiState.update { uiState -> uiState.copy(isEmpty = true, isLoading = false) } } is ApiResult.Error -> { - // TODO ERROR 뷰 나오면 ERROR 로직 처리해주기 _uiState.update { uiState -> uiState.copy(isError = true, isLoading = false) } @@ -54,6 +56,7 @@ class OurRuleAddViewModel @Inject constructor( private fun initInputRuleNameField() { inputRuleNameField.value = "" } + fun isActiveSaveButton() = (uiState.value.saveButtonState == ButtonState.ACTIVE) fun setSaveButtonState(saveButtonState: ButtonState) { @@ -64,40 +67,45 @@ class OurRuleAddViewModel @Inject constructor( fun addRule() { if (inputRuleNameField.value.isNotBlank()) { - _uiState.value = - uiState.value.copy( - ourRuleList = _uiState.value.ourRuleList + listOf( - OurRule( - tmpId--, - inputRuleNameField.value - ) - ), - addedRuleList = _uiState.value.addedRuleList + listOf( + _uiState.value = uiState.value.copy( + ourRuleList = _uiState.value.ourRuleList + listOf( + OurRule( + tmpId--, inputRuleNameField.value ) + ), + addedRuleList = _uiState.value.addedRuleList + listOf( + inputRuleNameField.value ) + ) initInputRuleNameField() } } - fun putAddRuleList() = - viewModelScope.launch { - postAddRulesUseCase(uiState.value.addedRuleList) - .collect { apiResult -> - when (apiResult) { - is ApiResult.Success -> Timber.i(apiResult.data) - is ApiResult.Error -> Timber.e(apiResult.msg) - is ApiResult.Empty -> Timber.e("IllegalArgument Exception") - } - } + fun addRuleList() = viewModelScope.launch { + when (val responseCode = postAddRulesUseCase(uiState.value.addedRuleList)) { + SUCCEES_CODE -> _uiEvent.emit(OurRuleAddEvent.AddSuccess) + DUPLICATE_ERROR_CODE -> _uiEvent.emit(OurRuleAddEvent.DuplicateError) + else -> Timber.d("Error $responseCode") } + } + + companion object { + private const val SUCCEES_CODE = 201 + private const val DUPLICATE_ERROR_CODE = 409 + } +} + +data class OurRuleAddUIState( + val ourRuleList: List = emptyList(), + val addedRuleList: List = emptyList(), + val isError: Boolean = false, + val isEmpty: Boolean = false, + val isLoading: Boolean = true, + val saveButtonState: ButtonState = ButtonState.INACTIVE +) - data class OurRuleAddUIState( - val ourRuleList: List = emptyList(), - val addedRuleList: List = emptyList(), - val isError: Boolean = false, - val isEmpty: Boolean = false, - val isLoading: Boolean = true, - val saveButtonState: ButtonState = ButtonState.INACTIVE - ) +sealed class OurRuleAddEvent { + object DuplicateError : OurRuleAddEvent() + object AddSuccess : OurRuleAddEvent() } diff --git a/app/src/main/java/hous/release/android/presentation/personality/result/PersonalityResultActivity.kt b/app/src/main/java/hous/release/android/presentation/personality/result/PersonalityResultActivity.kt index fd84bddb3..b78e15f41 100644 --- a/app/src/main/java/hous/release/android/presentation/personality/result/PersonalityResultActivity.kt +++ b/app/src/main/java/hous/release/android/presentation/personality/result/PersonalityResultActivity.kt @@ -7,6 +7,7 @@ import hous.release.android.R import hous.release.android.databinding.ActivityPersonalityResultBinding import hous.release.android.util.binding.BindingActivity import hous.release.android.util.component.PersonalityResultImage +import hous.release.android.util.extension.repeatOnStarted import hous.release.android.util.style.HousTheme @AndroidEntryPoint @@ -37,13 +38,15 @@ class PersonalityResultActivity : } private fun initPersonalityImage() { - personalityResultViewModel.resultData.observe(this) { personalityResult -> - binding.cvPersonalityResultImage.setContent { - HousTheme { - PersonalityResultImage( - homyType = personalityResult.color, - imageUrl = personalityResult.imageUrl - ) + repeatOnStarted { + personalityResultViewModel.uiState.collect { uiState -> + binding.cvPersonalityResultImage.setContent { + HousTheme { + PersonalityResultImage( + homyType = uiState.personalityResult.color, + imageUrl = uiState.personalityResult.imageUrl + ) + } } } } diff --git a/app/src/main/java/hous/release/android/presentation/personality/result/PersonalityResultViewModel.kt b/app/src/main/java/hous/release/android/presentation/personality/result/PersonalityResultViewModel.kt index d0f3e4f57..47a1a8c5f 100644 --- a/app/src/main/java/hous/release/android/presentation/personality/result/PersonalityResultViewModel.kt +++ b/app/src/main/java/hous/release/android/presentation/personality/result/PersonalityResultViewModel.kt @@ -1,12 +1,12 @@ package hous.release.android.presentation.personality.result -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import hous.release.domain.entity.response.PersonalityResult import hous.release.domain.usecase.GetPersonalityResultUseCase +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject @@ -15,36 +15,30 @@ import javax.inject.Inject class PersonalityResultViewModel @Inject constructor( private val getPersonalityResultUseCase: GetPersonalityResultUseCase ) : ViewModel() { - private val _resultData = MutableLiveData() - val resultData: LiveData = _resultData - - private val _description = MutableLiveData("") - val description: LiveData = _description - - private val _fromTestResult = MutableLiveData() - val fromTestResult: LiveData = _fromTestResult + private val _uiState = MutableStateFlow(PersonalityResultUiState()) + val uiState = _uiState.asStateFlow() fun getPersonalityResult(personalityColor: String) { viewModelScope.launch { getPersonalityResultUseCase(personalityColor) - .onSuccess { result -> - _resultData.value = result - initDescription(result.description) + .onSuccess { response -> + _uiState.value = _uiState.value.copy( + personalityResult = response + ) }.onFailure { Timber.e(it.message) } } } - private fun initDescription(list: List) { - _description.value = list.joinToString(ENTER) - } - fun initFromTestResult(fromTestResult: Boolean) { - _fromTestResult.value = fromTestResult + _uiState.value = PersonalityResultUiState().copy( + fromTestResult = fromTestResult + ) } - companion object { - private const val ENTER = "\n" - } + data class PersonalityResultUiState( + val personalityResult: PersonalityResult = PersonalityResult(), + val fromTestResult: Boolean = false + ) } diff --git a/app/src/main/java/hous/release/android/presentation/personality/test/PersonalityTestViewModel.kt b/app/src/main/java/hous/release/android/presentation/personality/test/PersonalityTestViewModel.kt index 79dc174a0..af82e549a 100644 --- a/app/src/main/java/hous/release/android/presentation/personality/test/PersonalityTestViewModel.kt +++ b/app/src/main/java/hous/release/android/presentation/personality/test/PersonalityTestViewModel.kt @@ -88,7 +88,7 @@ class PersonalityTestViewModel @Inject constructor( smellScore = requireNotNull(sumScore[QuestionType.SMELL]) ) .onSuccess { resultColor -> - delay(2000) + delay(1000) onEvent(PersonalityTestEvent.GoToResultView(resultColor)) } .onFailure { diff --git a/app/src/main/java/hous/release/android/presentation/profile/ProfileFragment.kt b/app/src/main/java/hous/release/android/presentation/profile/ProfileFragment.kt index 6ff1f7078..667ba508c 100644 --- a/app/src/main/java/hous/release/android/presentation/profile/ProfileFragment.kt +++ b/app/src/main/java/hous/release/android/presentation/profile/ProfileFragment.kt @@ -24,6 +24,8 @@ import hous.release.android.util.HousLogEvent.clickDateLogEvent import hous.release.android.util.HousLogEvent.clickLogEvent import hous.release.android.util.binding.BindingFragment import hous.release.android.util.component.HousPersonalityPentagon +import hous.release.android.util.extension.repeatOnStarted +import hous.release.android.util.extension.setOnSingleClickListener import hous.release.android.util.style.HousTheme import hous.release.domain.entity.PersonalityInfo @@ -40,7 +42,7 @@ class ProfileFragment : BindingFragment(R.layout.fragmen override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.vm = profileViewModel - initProfileInfo() + collectUiState() initNotificationOnClickListener() initSettingOnClickListener() initBadgeOnClickListener() @@ -48,31 +50,63 @@ class ProfileFragment : BindingFragment(R.layout.fragmen initTestBtnOnClickListener() initPersonalityAdapter() initPersonalityOnClickListener() - observePersonalityPentagon() } - private fun initPersonalityOnClickListener() { - binding.llProfilePersonalityDetail.setOnClickListener { - clickDateLogEvent(CLICK_MY_PERSONALITY) - val toPersonalityResult = - Intent(requireActivity(), PersonalityResultActivity::class.java) - toPersonalityResult.putExtra( - RESULT_COLOR, - profileViewModel.profileData.value!!.personalityColor.name - ) - toPersonalityResult.putExtra(LOCATION, PROFILE) - startActivity(toPersonalityResult) + private fun collectUiState() { + repeatOnStarted { + profileViewModel.uiState.collect { uiState -> + with(binding) { + if (uiState.profile.introduction.isNullOrEmpty()) { + tvProfileIntroduction.setText(R.string.profile_empty_introduction) + tvProfileIntroduction.setTextColor( + ContextCompat.getColor(requireContext(), R.color.hous_g_4) + ) + } else { + tvProfileIntroduction.text = uiState.profile.introduction + tvProfileIntroduction.setTextColor( + ContextCompat.getColor( + requireContext(), + R.color.hous_g_6 + ) + ) + } + } + + binding.cvProfilePersonalityPentagon.setContent { + HousTheme { + HousPersonalityPentagon( + testScore = uiState.profile.testScore, + homyType = uiState.profile.personalityColor + ) + } + } + } } } private fun initNotificationOnClickListener() { - binding.btnProfileNotification.setOnClickListener { + binding.btnProfileNotification.setOnSingleClickListener { startActivity(Intent(requireContext(), NotificationActivity::class.java)) } } + private fun initPersonalityOnClickListener() { + binding.llProfilePersonalityDetail.setOnSingleClickListener { + clickDateLogEvent(CLICK_MY_PERSONALITY) + startActivity( + Intent(requireActivity(), PersonalityResultActivity::class.java).apply { + putExtra( + RESULT_COLOR, + profileViewModel.uiState.value.profile.personalityColor.name + ) + putExtra(LOCATION, PROFILE) + } + ) + } + } + private fun initSettingOnClickListener() { - binding.btnProfileSetting.setOnClickListener { + binding.btnProfileSetting.setOnSingleClickListener { startActivity( Intent(requireContext(), SettingsActivity::class.java).apply { putExtra(SettingsActivity.HAS_ROOM, true) @@ -82,37 +116,34 @@ class ProfileFragment : BindingFragment(R.layout.fragmen } private fun initBadgeOnClickListener() { - binding.ivProfileBadge.setOnClickListener { + binding.ivProfileBadge.setOnSingleClickListener { startActivity(Intent(requireContext(), BadgeActivity::class.java)) } - binding.tvProfileBadgeEmpty.setOnClickListener { + binding.tvProfileBadgeEmpty.setOnSingleClickListener { startActivity(Intent(requireContext(), BadgeActivity::class.java)) } } private fun initEditOnClickListener() { - binding.btnProfileEdit.setOnClickListener { - val toProfileEdit = Intent(requireContext(), ProfileEditActivity::class.java) - toProfileEdit.putExtra( - PROFILE, - ProfileEntity( - profileViewModel.profileData.value!!.nickname, - profileViewModel.profileData.value!!.birthday, - profileViewModel.profileData.value!!.birthdayPublic, - profileViewModel.profileData.value!!.mbti, - profileViewModel.profileData.value!!.job, - profileViewModel.profileData.value!!.introduction - ) + binding.btnProfileEdit.setOnSingleClickListener { + startActivity( + Intent(requireContext(), ProfileEditActivity::class.java).apply { + with(profileViewModel.uiState.value.profile) { + putExtra( + PROFILE, + ProfileEntity( + nickname, + birthday, + birthdayPublic, + mbti, + job, + introduction + ) + ) + } + } ) - startActivity(toProfileEdit) - } - } - - private fun initTestBtnOnClickListener() { - binding.btnProfileTestAgain.setOnClickListener { - if (profileViewModel.isTest.value == true) clickLogEvent(CLICK_RE_TEST) - startActivity(Intent(requireContext(), PersonalityActivity::class.java)) } } @@ -121,43 +152,10 @@ class ProfileFragment : BindingFragment(R.layout.fragmen profilePersonalityAdapter.submitList(personalityInfo) } - private fun initProfileInfo() { - profileViewModel.profileData.observe(viewLifecycleOwner) { profile -> - binding.tvProfileBirthday.text = profile.birthday.substring(5..9) - if (profile.introduction.isNullOrEmpty()) { - with(binding) { - tvProfileIntroduction.setText(R.string.profile_empty_introduction) - tvProfileIntroduction.setTextColor( - ContextCompat.getColor( - requireContext(), - R.color.hous_g_4 - ) - ) - } - } else { - with(binding) { - tvProfileIntroduction.text = profile.introduction - tvProfileIntroduction.setTextColor( - ContextCompat.getColor( - requireContext(), - R.color.hous_g_6 - ) - ) - } - } - } - } - - private fun observePersonalityPentagon() { - profileViewModel.profileData.observe(viewLifecycleOwner) { profile -> - binding.cvProfilePersonalityPentagon.setContent { - HousTheme { - HousPersonalityPentagon( - testScore = profile.testScore, - homyType = profile.personalityColor - ) - } - } + private fun initTestBtnOnClickListener() { + binding.btnProfileTestAgain.setOnSingleClickListener { + if (profileViewModel.uiState.value.isTest) clickLogEvent(CLICK_RE_TEST) + startActivity(Intent(requireContext(), PersonalityActivity::class.java)) } } diff --git a/app/src/main/java/hous/release/android/presentation/profile/ProfileViewModel.kt b/app/src/main/java/hous/release/android/presentation/profile/ProfileViewModel.kt index cb51f066a..adba79466 100644 --- a/app/src/main/java/hous/release/android/presentation/profile/ProfileViewModel.kt +++ b/app/src/main/java/hous/release/android/presentation/profile/ProfileViewModel.kt @@ -1,13 +1,13 @@ package hous.release.android.presentation.profile -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import hous.release.domain.entity.HomyType import hous.release.domain.entity.response.Profile import hous.release.domain.usecase.GetProfileUseCase +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject @@ -16,31 +16,32 @@ import javax.inject.Inject class ProfileViewModel @Inject constructor( private val getProfileUseCase: GetProfileUseCase ) : ViewModel() { - private val _loadingState = MutableLiveData(true) - val loadingState: LiveData = _loadingState - - private val _profileData = MutableLiveData() - val profileData: LiveData = _profileData - - private val _isTest = MutableLiveData() - val isTest: LiveData = _isTest + private val _uiState = MutableStateFlow(ProfileUiState()) + val uiState = _uiState.asStateFlow() fun getProfile() { viewModelScope.launch { getProfileUseCase() .onSuccess { response -> - _profileData.value = response - checkTest() - _loadingState.value = false + _uiState.value = _uiState.value.copy( + profile = response, + birthday = response.birthday.substring(5..9), + isTest = response.personalityColor != HomyType.GRAY, + isLoadingState = false + ) }.onFailure { response -> Timber.e(response.message) + _uiState.value = uiState.value.copy( + isLoadingState = false + ) } } } - private fun checkTest() { - viewModelScope.launch { - _isTest.value = _profileData.value!!.personalityColor != HomyType.GRAY - } - } + data class ProfileUiState( + val profile: Profile = Profile(), + val birthday: String = "", + val isTest: Boolean = false, + val isLoadingState: Boolean = true + ) } diff --git a/app/src/main/java/hous/release/android/presentation/profile/adapter/ProfilePersonalityAdapter.kt b/app/src/main/java/hous/release/android/presentation/profile/adapter/ProfilePersonalityAdapter.kt index beb30e03a..d25240bb3 100644 --- a/app/src/main/java/hous/release/android/presentation/profile/adapter/ProfilePersonalityAdapter.kt +++ b/app/src/main/java/hous/release/android/presentation/profile/adapter/ProfilePersonalityAdapter.kt @@ -10,7 +10,7 @@ import hous.release.domain.entity.PersonalityInfo class ProfilePersonalityAdapter : ListAdapter( - personalityDiffCallBack + personalityDiffCallback ) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PersonalityViewHolder { val binding = @@ -36,7 +36,7 @@ class ProfilePersonalityAdapter : } companion object { - private val personalityDiffCallBack = ItemDiffCallback( + private val personalityDiffCallback = ItemDiffCallback( onItemsTheSame = { old, new -> old.type == new.type }, onContentsTheSame = { old, new -> old == new } ) diff --git a/app/src/main/java/hous/release/android/presentation/profile/edit/ProfileEditActivity.kt b/app/src/main/java/hous/release/android/presentation/profile/edit/ProfileEditActivity.kt index bb880a461..d7825da74 100644 --- a/app/src/main/java/hous/release/android/presentation/profile/edit/ProfileEditActivity.kt +++ b/app/src/main/java/hous/release/android/presentation/profile/edit/ProfileEditActivity.kt @@ -13,6 +13,7 @@ import hous.release.android.util.dialog.DatePickerClickListener import hous.release.android.util.dialog.DatePickerDialog import hous.release.android.util.dialog.WarningDialogFragment import hous.release.android.util.dialog.WarningType +import hous.release.android.util.extension.setOnSingleClickListener import hous.release.android.util.extension.withArgs @AndroidEntryPoint @@ -98,7 +99,7 @@ class ProfileEditActivity : } private fun initBirthdayOnClickListener() { - binding.etProfileEditBirthday.setOnClickListener { + binding.etProfileEditBirthday.setOnSingleClickListener { DatePickerDialog().apply { arguments = Bundle().apply { putParcelable( diff --git a/app/src/main/java/hous/release/android/presentation/profile/edit/ProfileEntity.kt b/app/src/main/java/hous/release/android/presentation/profile/edit/ProfileEntity.kt index 42ef80402..f473a57e5 100644 --- a/app/src/main/java/hous/release/android/presentation/profile/edit/ProfileEntity.kt +++ b/app/src/main/java/hous/release/android/presentation/profile/edit/ProfileEntity.kt @@ -5,10 +5,10 @@ import kotlinx.parcelize.Parcelize @Parcelize data class ProfileEntity( - val nickname: String, - val birthday: String, - val birthdayPublic: Boolean, - val mbti: String?, - val job: String?, - val introduction: String? + val nickname: String = "", + val birthday: String = "", + val birthdayPublic: Boolean = false, + val mbti: String? = "", + val job: String? = "", + val introduction: String? = "" ) : Parcelable diff --git a/app/src/main/java/hous/release/android/presentation/profile/homie/HomieProfileActivity.kt b/app/src/main/java/hous/release/android/presentation/profile/homie/HomieProfileActivity.kt index 77e219f49..ce2be98fd 100644 --- a/app/src/main/java/hous/release/android/presentation/profile/homie/HomieProfileActivity.kt +++ b/app/src/main/java/hous/release/android/presentation/profile/homie/HomieProfileActivity.kt @@ -17,6 +17,8 @@ import hous.release.android.util.HousLogEvent.CLICK_MY_PERSONALITY import hous.release.android.util.HousLogEvent.clickDateLogEvent import hous.release.android.util.binding.BindingActivity import hous.release.android.util.component.HousPersonalityPentagon +import hous.release.android.util.extension.repeatOnStarted +import hous.release.android.util.extension.setOnSingleClickListener import hous.release.android.util.style.HousTheme @AndroidEntryPoint @@ -32,8 +34,7 @@ class HomieProfileActivity : initBackBtnOnClickListener() initHomiePersonalityOnClickListener() initHomiePersonalityAdapter() - initHomieProfileUi() - observeHomiePersonalityPentagon() + collectUiState() } private fun initHomieProfile() { @@ -47,17 +48,19 @@ class HomieProfileActivity : } private fun initHomiePersonalityOnClickListener() { - binding.llHomieProfilePersonalityDetail.setOnClickListener { + binding.llHomieProfilePersonalityDetail.setOnSingleClickListener { if (intent.getIntExtra(HOMIE_POSITION, DEFAULT) == MY) { clickDateLogEvent(CLICK_MY_PERSONALITY) } - val toPersonalityDetail = Intent(this, PersonalityResultActivity::class.java) - toPersonalityDetail.putExtra(LOCATION, HOMIE) - toPersonalityDetail.putExtra( - RESULT_COLOR, - homieProfileViewModel.homieProfileData.value!!.personalityColor.toString() - ) - startActivity(toPersonalityDetail) + Intent(this, PersonalityResultActivity::class.java).apply { + putExtra(LOCATION, HOMIE) + putExtra( + RESULT_COLOR, + homieProfileViewModel.uiState.value.personalityColor.toString() + ) + }.also { toPersonalityDetail -> + startActivity(toPersonalityDetail) + } } } @@ -66,35 +69,26 @@ class HomieProfileActivity : profilePersonalityAdapter.submitList(personalityInfo) } - private fun initHomieProfileUi() { - homieProfileViewModel.homieProfileData.observe(this) { homie -> - binding.tvHomieProfileBirthday.text = homie.birthday.substring(5..9) - if (homie.introduction.isNullOrBlank()) { - with(binding) { - tvHomieProfileIntroduction.setText(R.string.homie_profile_introduction_empty) - tvHomieProfileIntroduction.setTextColor( - getColor(R.color.hous_g_4) - ) - } - } else { - with(binding) { - tvHomieProfileIntroduction.text = homie.introduction - tvHomieProfileIntroduction.setTextColor( - getColor(R.color.hous_g_6) - ) + private fun collectUiState() { + repeatOnStarted { + homieProfileViewModel.uiState.collect { uiState -> + with(binding.tvHomieProfileIntroduction) { + if (uiState.introduction.isNullOrBlank()) { + setText(R.string.homie_profile_introduction_empty) + setTextColor(getColor(R.color.hous_g_4)) + } else { + text = uiState.introduction + setTextColor(getColor(R.color.hous_g_6)) + } } - } - } - } - private fun observeHomiePersonalityPentagon() { - homieProfileViewModel.homieProfileData.observe(this) { homie -> - binding.cvHomieProfilePersonalityPentagon.setContent { - HousTheme { - HousPersonalityPentagon( - testScore = homie.testScore, - homyType = homie.personalityColor - ) + binding.cvHomieProfilePersonalityPentagon.setContent { + HousTheme { + HousPersonalityPentagon( + testScore = uiState.testScore, + homyType = uiState.personalityColor + ) + } } } } diff --git a/app/src/main/java/hous/release/android/presentation/profile/homie/HomieProfileViewModel.kt b/app/src/main/java/hous/release/android/presentation/profile/homie/HomieProfileViewModel.kt index b1bd86169..885df83e7 100644 --- a/app/src/main/java/hous/release/android/presentation/profile/homie/HomieProfileViewModel.kt +++ b/app/src/main/java/hous/release/android/presentation/profile/homie/HomieProfileViewModel.kt @@ -1,12 +1,12 @@ package hous.release.android.presentation.profile.homie -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import hous.release.domain.entity.response.Profile import hous.release.domain.usecase.GetHomieProfileUseCase +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject @@ -15,14 +15,16 @@ import javax.inject.Inject class HomieProfileViewModel @Inject constructor( private val getHomieProfileUseCase: GetHomieProfileUseCase ) : ViewModel() { - private val _homieProfileData = MutableLiveData() - val homieProfileData: LiveData = _homieProfileData + private val _uiState = MutableStateFlow(Profile()) + val uiState = _uiState.asStateFlow() fun getHomieProfile(homieId: Int) { viewModelScope.launch { getHomieProfileUseCase(homieId) .onSuccess { response -> - _homieProfileData.value = response + _uiState.value = response.copy( + birthday = response.birthday.substring(5..9) + ) }.onFailure { response -> Timber.e(response.message) } diff --git a/app/src/main/java/hous/release/android/presentation/tutorial/TutorialActivity.kt b/app/src/main/java/hous/release/android/presentation/tutorial/TutorialActivity.kt index d721dc1f0..b409e9a89 100644 --- a/app/src/main/java/hous/release/android/presentation/tutorial/TutorialActivity.kt +++ b/app/src/main/java/hous/release/android/presentation/tutorial/TutorialActivity.kt @@ -13,13 +13,15 @@ import hous.release.android.presentation.login.LoginActivity import hous.release.android.presentation.tutorial.adapter.TutorialAdapter import hous.release.android.util.ToastMessageUtil import hous.release.android.util.binding.BindingActivity +import hous.release.android.util.extension.repeatOnStarted import hous.release.domain.entity.TutorialEntity import kotlin.system.exitProcess @AndroidEntryPoint class TutorialActivity : BindingActivity(R.layout.activity_tutorial) { - private lateinit var tutorialAdapter: TutorialAdapter private val tutorialViewModel: TutorialViewModel by viewModels() + private val tutorialAdapter: TutorialAdapter? + get() = binding.vpTutorial.adapter as? TutorialAdapter private var onBackPressedTime = 0L override fun onCreate(savedInstanceState: Bundle?) { @@ -48,9 +50,11 @@ class TutorialActivity : BindingActivity(R.layout.activ } private fun observeTutorialState() { - tutorialViewModel.isTutorialState.observe(this) { skip -> - if (skip) { - intentToLogin() + repeatOnStarted { + tutorialViewModel.isTutorialState.collect { skip -> + if (skip) { + intentToLogin() + } } } } @@ -62,9 +66,11 @@ class TutorialActivity : BindingActivity(R.layout.activ } private fun initAdapter() { - tutorialAdapter = TutorialAdapter() - tutorialAdapter.submitList(tutorialList) + if (binding.vpTutorial.adapter == null) { + binding.vpTutorial.adapter = TutorialAdapter() + } binding.vpTutorial.adapter = tutorialAdapter + tutorialAdapter?.submitList(tutorialList) binding.vpTutorial.orientation = ViewPager2.ORIENTATION_HORIZONTAL TabLayoutMediator(binding.tlTutorialDot, binding.vpTutorial) { tab, _ -> @@ -74,7 +80,7 @@ class TutorialActivity : BindingActivity(R.layout.activ binding.vpTutorial.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { super.onPageSelected(position) - tutorialViewModel.showNextBtn.value = position == 3 + tutorialViewModel.isNextBtn.value = position == 3 } }) } diff --git a/app/src/main/java/hous/release/android/presentation/tutorial/TutorialViewModel.kt b/app/src/main/java/hous/release/android/presentation/tutorial/TutorialViewModel.kt index ec73e84d6..ba4d47e45 100644 --- a/app/src/main/java/hous/release/android/presentation/tutorial/TutorialViewModel.kt +++ b/app/src/main/java/hous/release/android/presentation/tutorial/TutorialViewModel.kt @@ -1,28 +1,29 @@ package hous.release.android.presentation.tutorial -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import hous.release.domain.entity.SplashState import hous.release.domain.usecase.SetSplashStateUseCase -import javax.inject.Inject +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class TutorialViewModel @Inject constructor( private val setSplashStateUseCase: SetSplashStateUseCase ) : ViewModel() { - val showNextBtn = MutableLiveData() + val isNextBtn = MutableStateFlow(false) - private val _isTutorialState = MutableLiveData(false) - val isTutorialState: LiveData = _isTutorialState + private val _isTutorialEvent = MutableSharedFlow() + val isTutorialState = _isTutorialEvent.asSharedFlow() fun nextOnClick() { viewModelScope.launch { setSplashStateUseCase(splashState = SplashState.LOGIN) - _isTutorialState.value = true + _isTutorialEvent.emit(true) } } } diff --git a/app/src/main/java/hous/release/android/presentation/tutorial/adapter/TutorialAdapter.kt b/app/src/main/java/hous/release/android/presentation/tutorial/adapter/TutorialAdapter.kt index f557b6be4..deb53cc38 100644 --- a/app/src/main/java/hous/release/android/presentation/tutorial/adapter/TutorialAdapter.kt +++ b/app/src/main/java/hous/release/android/presentation/tutorial/adapter/TutorialAdapter.kt @@ -10,7 +10,7 @@ import hous.release.android.util.ItemDiffCallback import hous.release.domain.entity.TutorialEntity class TutorialAdapter : - ListAdapter(tutorialDiffCallBack) { + ListAdapter(tutorialDiffCallback) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TutorialViewHolder { val binding = @@ -44,7 +44,7 @@ class TutorialAdapter : } companion object { - private val tutorialDiffCallBack = ItemDiffCallback( + private val tutorialDiffCallback = ItemDiffCallback( onItemsTheSame = { old, new -> old.head == new.head }, onContentsTheSame = { old, new -> old == new } ) diff --git a/app/src/main/java/hous/release/android/util/HousLogEvent.kt b/app/src/main/java/hous/release/android/util/HousLogEvent.kt index 6f4393666..3fe23fcf1 100644 --- a/app/src/main/java/hous/release/android/util/HousLogEvent.kt +++ b/app/src/main/java/hous/release/android/util/HousLogEvent.kt @@ -31,9 +31,11 @@ object HousLogEvent { const val CLICK_FINISH_TEST = "CLICK_FINISH_TEST" fun enterScreenLogEvent(screenClass: String, screenName: String) { - Firebase.analytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) { - param(FirebaseAnalytics.Param.SCREEN_CLASS, screenClass) - param(FirebaseAnalytics.Param.SCREEN_NAME, screenName) + if (!BuildConfig.DEBUG) { + Firebase.analytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) { + param(FirebaseAnalytics.Param.SCREEN_CLASS, screenClass) + param(FirebaseAnalytics.Param.SCREEN_NAME, screenName) + } } } diff --git a/app/src/main/java/hous/release/android/util/OnSingleClickListener.kt b/app/src/main/java/hous/release/android/util/OnSingleClickListener.kt new file mode 100644 index 000000000..804ff5e0b --- /dev/null +++ b/app/src/main/java/hous/release/android/util/OnSingleClickListener.kt @@ -0,0 +1,18 @@ +package hous.release.android.util + +import android.os.SystemClock +import android.view.View + +class OnSingleClickListener(private val interval: Int = 2000, val onSingleClick: (View) -> Unit) : + View.OnClickListener { + + private var lastClickTime: Long = 0 + override fun onClick(view: View) { + val elapsedRealtime = SystemClock.elapsedRealtime() + if ((elapsedRealtime - lastClickTime) < interval) { + return + } + lastClickTime = elapsedRealtime + onSingleClick(view) + } +} diff --git a/app/src/main/java/hous/release/android/util/dialog/DatePickerDialog.kt b/app/src/main/java/hous/release/android/util/dialog/DatePickerDialog.kt index d05d3994b..c770c68fa 100644 --- a/app/src/main/java/hous/release/android/util/dialog/DatePickerDialog.kt +++ b/app/src/main/java/hous/release/android/util/dialog/DatePickerDialog.kt @@ -1,16 +1,16 @@ package hous.release.android.util.dialog -import android.app.AlertDialog import android.app.Dialog import android.os.Bundle import android.view.View import androidx.fragment.app.DialogFragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder import hous.release.android.R import hous.release.android.databinding.DialogDatePickerBinding import hous.release.android.util.dialog.WarningDialogFragment.Companion.CONFIRM_ACTION import hous.release.android.util.extension.initLayout import timber.log.Timber -import java.util.* +import java.util.Calendar class DatePickerDialog : DialogFragment() { private var _binding: DialogDatePickerBinding? = null @@ -18,11 +18,15 @@ class DatePickerDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { _binding = DialogDatePickerBinding.inflate(requireActivity().layoutInflater) - initDatePicker() initConfirmTextClickListener() initCancelTextClickListener() + initMaxDate() + isCancelable = false return activity?.let { - val dialog = AlertDialog.Builder(it).create() + val dialog = MaterialAlertDialogBuilder( + requireActivity(), + R.style.MaterialAlertDialog_rounded + ).create() dialog.setView(binding.root) dialog } ?: throw IllegalStateException() @@ -33,10 +37,8 @@ class DatePickerDialog : DialogFragment() { initLayout() } - private fun initDatePicker() { - with(binding.datePickerDialogDatePicker) { - maxDate = Calendar.getInstance().timeInMillis - } + private fun initMaxDate() { + binding.datePickerDialogDatePicker.maxDate = Calendar.getInstance().timeInMillis } private fun getYearFormat(year: Int): String = year.toString() @@ -55,6 +57,7 @@ class DatePickerDialog : DialogFragment() { arguments?.getParcelable(CONFIRM_ACTION) ?.onConfirmClick(date) ?: Timber.e(getString(R.string.null_point_exception_warning_dialog_argument)) + updateDate(year, month, dayOfMonth) } dismiss() } diff --git a/app/src/main/java/hous/release/android/util/extension/ContextExtension.kt b/app/src/main/java/hous/release/android/util/extension/ContextExtension.kt index d8afbdc4b..65dc3d277 100644 --- a/app/src/main/java/hous/release/android/util/extension/ContextExtension.kt +++ b/app/src/main/java/hous/release/android/util/extension/ContextExtension.kt @@ -5,6 +5,8 @@ import android.content.Context import android.content.Intent import android.net.ConnectivityManager import android.net.NetworkCapabilities +import android.view.View +import hous.release.android.util.OnSingleClickListener fun Context.isNetworkConnected(): Boolean { var isConnected = false @@ -12,7 +14,9 @@ fun Context.isNetworkConnected(): Boolean { val capabilities = cm.getNetworkCapabilities(cm.activeNetwork) if (capabilities != null) { isConnected = - capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) + capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport( + NetworkCapabilities.TRANSPORT_CELLULAR + ) } return isConnected } @@ -20,3 +24,7 @@ fun Context.isNetworkConnected(): Boolean { inline fun Context.startActivity(block: Intent.() -> Unit = {}) { startActivity(Intent(this, T::class.java).apply(block)) } + +fun View.setOnSingleClickListener(onSingleClick: (View) -> Unit) { + setOnClickListener(OnSingleClickListener { onSingleClick(it) }) +} diff --git a/app/src/main/res/color/selector_personality_test_text.xml b/app/src/main/res/color/selector_personality_test_text.xml index 262a36ca9..06bbe2412 100644 --- a/app/src/main/res/color/selector_personality_test_text.xml +++ b/app/src/main/res/color/selector_personality_test_text.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_back_g6.xml b/app/src/main/res/drawable/ic_back_g6.xml new file mode 100644 index 000000000..1ff7f1faf --- /dev/null +++ b/app/src/main/res/drawable/ic_back_g6.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_test_left.xml b/app/src/main/res/drawable/ic_test_left.xml index 550e63d1a..b4657e056 100644 --- a/app/src/main/res/drawable/ic_test_left.xml +++ b/app/src/main/res/drawable/ic_test_left.xml @@ -5,5 +5,5 @@ android:viewportHeight="16"> + android:fillColor="#EAF2FF"/> diff --git a/app/src/main/res/drawable/ic_test_left_click.xml b/app/src/main/res/drawable/ic_test_left_click.xml index 764b63440..bae700917 100644 --- a/app/src/main/res/drawable/ic_test_left_click.xml +++ b/app/src/main/res/drawable/ic_test_left_click.xml @@ -5,5 +5,5 @@ android:viewportHeight="16"> + android:fillColor="#5E9EFF"/> diff --git a/app/src/main/res/drawable/ic_test_right.xml b/app/src/main/res/drawable/ic_test_right.xml index 9b3adde63..c53250757 100644 --- a/app/src/main/res/drawable/ic_test_right.xml +++ b/app/src/main/res/drawable/ic_test_right.xml @@ -5,5 +5,5 @@ android:viewportHeight="16"> + android:fillColor="#EAF2FF"/> diff --git a/app/src/main/res/drawable/ic_test_right_click.xml b/app/src/main/res/drawable/ic_test_right_click.xml index 78e932a99..5dfd84e84 100644 --- a/app/src/main/res/drawable/ic_test_right_click.xml +++ b/app/src/main/res/drawable/ic_test_right_click.xml @@ -4,6 +4,6 @@ android:viewportWidth="13" android:viewportHeight="16"> + android:pathData="M12,6.268C13.333,7.038 13.333,8.962 12,9.732L3,14.928C1.667,15.698 -0,14.736 -0,13.196L-0,2.804C-0,1.264 1.667,0.302 3,1.072L12,6.268Z" + android:fillColor="#5E9EFF"/> diff --git a/app/src/main/res/drawable/selector_personality_test_btn.xml b/app/src/main/res/drawable/selector_personality_test_btn.xml index 0fbaf3a71..1f13b6cba 100644 --- a/app/src/main/res/drawable/selector_personality_test_btn.xml +++ b/app/src/main/res/drawable/selector_personality_test_btn.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_userinput_button.xml b/app/src/main/res/drawable/selector_userinput_button.xml index f3bd3b987..2ee6e8c35 100644 --- a/app/src/main/res/drawable/selector_userinput_button.xml +++ b/app/src/main/res/drawable/selector_userinput_button.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_blue_fill_16_rect.xml b/app/src/main/res/drawable/shape_blue_edit_fill_8_rect.xml similarity index 58% rename from app/src/main/res/drawable/shape_blue_fill_16_rect.xml rename to app/src/main/res/drawable/shape_blue_edit_fill_8_rect.xml index 87c1a9f33..3d9ab2e74 100644 --- a/app/src/main/res/drawable/shape_blue_fill_16_rect.xml +++ b/app/src/main/res/drawable/shape_blue_edit_fill_8_rect.xml @@ -1,6 +1,7 @@ - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_g4_fill_16_rect.xml b/app/src/main/res/drawable/shape_g4_fill_8_rect.xml similarity index 83% rename from app/src/main/res/drawable/shape_g4_fill_16_rect.xml rename to app/src/main/res/drawable/shape_g4_fill_8_rect.xml index 3f8d9a389..81e850693 100644 --- a/app/src/main/res/drawable/shape_g4_fill_16_rect.xml +++ b/app/src/main/res/drawable/shape_g4_fill_8_rect.xml @@ -2,5 +2,5 @@ - + diff --git a/app/src/main/res/layout/activity_edit_hous_name.xml b/app/src/main/res/layout/activity_edit_hous_name.xml index b7198aa11..1512813ae 100644 --- a/app/src/main/res/layout/activity_edit_hous_name.xml +++ b/app/src/main/res/layout/activity_edit_hous_name.xml @@ -34,7 +34,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" - android:layout_marginEnd="8dp" + android:layout_marginEnd="16dp" android:clickable="@{vm.roomName.length() == 0 ? false : true}" android:onClick="@{()->vm.putHousName()}" android:padding="8dp" diff --git a/app/src/main/res/layout/activity_homie_profile.xml b/app/src/main/res/layout/activity_homie_profile.xml index c2ecf9d22..842ab134b 100644 --- a/app/src/main/res/layout/activity_homie_profile.xml +++ b/app/src/main/res/layout/activity_homie_profile.xml @@ -24,7 +24,7 @@ @@ -57,7 +57,7 @@ android:id="@+id/tv_homie_profile_nickname" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@{vm.homieProfileData.nickname}" + android:text="@{vm.uiState.nickname}" android:textColor="@color/hous_black" android:theme="@style/H4" app:layout_constraintBottom_toBottomOf="parent" @@ -92,7 +92,7 @@ android:background="@drawable/shape_g6_line_20_rect" android:paddingHorizontal="8dp" android:paddingVertical="4dp" - android:text="@{vm.homieProfileData.age}" + android:text="@{vm.uiState.age}" android:textColor="@color/hous_g_6" android:theme="@style/Description" app:layout_constraintStart_toStartOf="parent" @@ -108,9 +108,10 @@ android:background="@drawable/shape_g6_line_20_rect" android:paddingHorizontal="8dp" android:paddingVertical="4dp" + android:text="@{vm.uiState.birthday}" android:textColor="@color/hous_g_6" android:theme="@style/En2" - android:visibility="@{vm.homieProfileData.birthdayPublic ? View.VISIBLE : View.GONE}" + android:visibility="@{vm.uiState.birthdayPublic ? View.VISIBLE : View.GONE}" app:layout_constraintBottom_toBottomOf="@id/tv_homie_profile_age" app:layout_constraintStart_toEndOf="@id/tv_homie_profile_age" app:layout_constraintTop_toTopOf="@id/tv_homie_profile_age" @@ -124,10 +125,10 @@ android:background="@drawable/shape_g6_line_20_rect" android:paddingHorizontal="8dp" android:paddingVertical="4dp" - android:text="@{vm.homieProfileData.mbti}" + android:text="@{vm.uiState.mbti}" android:textColor="@color/hous_g_6" android:theme="@style/En2" - android:visibility="@{vm.homieProfileData.mbti}" + android:visibility="@{vm.uiState.mbti}" app:layout_constraintBottom_toBottomOf="@id/tv_homie_profile_age" app:layout_constraintStart_toEndOf="@id/tv_homie_profile_birthday" app:layout_constraintTop_toTopOf="@id/tv_homie_profile_age" @@ -141,10 +142,10 @@ android:background="@drawable/shape_g6_line_20_rect" android:paddingHorizontal="8dp" android:paddingVertical="4dp" - android:text="@{vm.homieProfileData.job}" + android:text="@{vm.uiState.job}" android:textColor="@color/hous_g_6" android:theme="@style/Description" - android:visibility="@{vm.homieProfileData.job}" + android:visibility="@{vm.uiState.job}" app:layout_constraintBottom_toBottomOf="@id/tv_homie_profile_age" app:layout_constraintStart_toEndOf="@id/tv_homie_profile_mbti" app:layout_constraintTop_toTopOf="@id/tv_homie_profile_age" @@ -166,11 +167,11 @@ @@ -192,7 +193,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:text="@{vm.homieProfileData.representBadge==null ? @string/homie_profile_representation_empty : vm.homieProfileData.representBadge}" + android:text="@{vm.uiState.representBadge==null ? @string/homie_profile_representation_empty : vm.uiState.representBadge}" android:textColor="@color/hous_g_6" android:theme="@style/Description" app:layout_constraintEnd_toEndOf="@id/iv_homie_profile_representation_image" @@ -224,8 +225,8 @@ @@ -39,7 +39,7 @@ android:text="@string/personality_result_info" android:textColor="@color/hous_black" android:theme="@style/B1" - android:visibility="@{vm.fromTestResult ? View.INVISIBLE : View.VISIBLE}" + android:visibility="@{vm.uiState.fromTestResult ? View.INVISIBLE : View.VISIBLE}" app:layout_constraintBottom_toBottomOf="@id/btn_personality_result_back" app:layout_constraintStart_toEndOf="@id/btn_personality_result_back" app:layout_constraintTop_toTopOf="@id/btn_personality_result_back" /> @@ -53,7 +53,7 @@ android:text="@string/personality_result_detail" android:textColor="@color/hous_black" android:theme="@style/B1" - android:visibility="@{vm.fromTestResult ? View.VISIBLE : View.INVISIBLE}" + android:visibility="@{vm.uiState.fromTestResult ? View.VISIBLE : View.INVISIBLE}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -67,7 +67,7 @@ android:text="@string/personality_result_complete" android:textColor="@color/hous_blue" android:theme="@style/B1" - android:visibility="@{vm.fromTestResult ? View.VISIBLE : View.INVISIBLE}" + android:visibility="@{vm.uiState.fromTestResult ? View.VISIBLE : View.INVISIBLE}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -85,10 +85,10 @@ - - - - - diff --git a/app/src/main/res/layout/activity_profile_edit.xml b/app/src/main/res/layout/activity_profile_edit.xml index b61445cde..0df93798b 100644 --- a/app/src/main/res/layout/activity_profile_edit.xml +++ b/app/src/main/res/layout/activity_profile_edit.xml @@ -43,7 +43,7 @@ android:id="@+id/tv_profile_edit_save" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="8dp" + android:layout_marginEnd="16dp" android:enabled="@{vm.changedEditInfo && vm.nickname.length() > 0 ? true : false}" android:onClick="@{()->vm.onClickSave()}" android:padding="8dp" diff --git a/app/src/main/res/layout/activity_tutorial.xml b/app/src/main/res/layout/activity_tutorial.xml index fa3f7b445..6fa809c34 100644 --- a/app/src/main/res/layout/activity_tutorial.xml +++ b/app/src/main/res/layout/activity_tutorial.xml @@ -45,7 +45,7 @@ android:layout_height="0dp" android:layout_gravity="center" android:clickable="false" - android:visibility="@{vm.showNextBtn?View.INVISIBLE:View.VISIBLE}" + android:visibility="@{vm.isNextBtn?View.INVISIBLE:View.VISIBLE}" app:layout_constraintBottom_toBottomOf="@id/tv_tutorial_next" app:layout_constraintTop_toTopOf="@id/tv_tutorial_next" app:tabBackground="@drawable/selector_tutorial_index" @@ -59,14 +59,14 @@ android:layout_height="wrap_content" android:layout_marginHorizontal="16dp" android:layout_marginBottom="20dp" - android:background="@drawable/shape_blue_fill_16_rect" + android:background="@drawable/shape_blue_fill_8_rect" android:gravity="center" android:onClick="@{()->vm.nextOnClick()}" android:paddingVertical="10dp" android:text="@string/user_input_next" android:textColor="@color/hous_white" android:theme="@style/B1" - android:visibility="@{vm.showNextBtn?View.VISIBLE:View.INVISIBLE}" + android:visibility="@{vm.isNextBtn?View.VISIBLE:View.INVISIBLE}" app:layout_constraintBottom_toBottomOf="parent" /> diff --git a/app/src/main/res/layout/activity_user_input.xml b/app/src/main/res/layout/activity_user_input.xml index 4380715e6..0357a1cb4 100644 --- a/app/src/main/res/layout/activity_user_input.xml +++ b/app/src/main/res/layout/activity_user_input.xml @@ -12,6 +12,7 @@ @@ -47,6 +48,7 @@ android:layout_marginTop="20dp" android:background="@null" android:hint="@string/user_input_nickname_hint" + android:imeOptions="actionNext" android:inputType="text" android:maxLength="3" android:paddingVertical="2dp" diff --git a/app/src/main/res/layout/dialog_date_picker.xml b/app/src/main/res/layout/dialog_date_picker.xml index d3df13241..14ec5a879 100644 --- a/app/src/main/res/layout/dialog_date_picker.xml +++ b/app/src/main/res/layout/dialog_date_picker.xml @@ -1,10 +1,9 @@ + android:background="@drawable/shape_white_fill_8_rect"> @@ -37,6 +37,7 @@ android:layout_height="0dp" android:calendarViewShown="false" android:datePickerMode="spinner" + android:descendantFocusability="blocksDescendants" android:endYear="2099" android:startYear="1900" android:theme="@style/PickerTheme" @@ -147,5 +148,4 @@ app:layout_constraintEnd_toStartOf="@+id/tv_date_picker_confirm" app:layout_constraintTop_toTopOf="@id/tv_date_picker_confirm" /> - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index eaa2eaff2..951a4757e 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -10,14 +10,13 @@ - @@ -58,7 +57,7 @@ android:layout_height="wrap_content" android:background="@null" android:padding="10dp" - android:src="@{vm.isTest ? @drawable/ic_profile_alarm_white : @drawable/ic_profile_alarm_gray}" + android:src="@{vm.uiState.isTest ? @drawable/ic_profile_alarm_white : @drawable/ic_profile_alarm_gray}" app:layout_constraintBottom_toBottomOf="@id/btn_profile_setting" app:layout_constraintEnd_toStartOf="@id/btn_profile_setting" app:layout_constraintTop_toTopOf="@id/btn_profile_setting" @@ -78,13 +77,14 @@ @@ -101,7 +101,7 @@ android:text="@string/profile_empty_badge" android:textColor="@color/hous_g_9" android:theme="@style/Description" - android:visibility="@{vm.profileData.representBadgeImage==null ? View.VISIBLE : View.INVISIBLE}" + android:visibility="@{vm.uiState.profile.representBadgeImage==null ? View.VISIBLE : View.INVISIBLE}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/btn_profile_notification" /> @@ -138,7 +138,7 @@ android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="23dp" - android:text="@{vm.profileData.nickname}" + android:text="@{vm.uiState.profile.nickname}" android:textColor="@color/hous_black" android:theme="@style/H4" app:layout_constraintStart_toStartOf="parent" @@ -178,7 +178,7 @@ android:background="@drawable/shape_g6_line_20_rect" android:paddingHorizontal="8dp" android:paddingVertical="4dp" - android:text="@{vm.profileData.age}" + android:text="@{vm.uiState.profile.age}" android:textColor="@color/hous_g_6" android:theme="@style/Description" app:layout_constraintStart_toStartOf="@id/tv_profile_name" @@ -193,9 +193,10 @@ android:background="@drawable/shape_g6_line_20_rect" android:paddingHorizontal="8dp" android:paddingVertical="4dp" + android:text="@{vm.uiState.birthday}" android:textColor="@color/hous_g_6" android:theme="@style/En2" - android:visibility="@{vm.profileData.birthdayPublic ? View.VISIBLE : View.GONE}" + android:visibility="@{vm.uiState.profile.birthdayPublic ? View.VISIBLE : View.GONE}" app:layout_constraintBottom_toBottomOf="@id/tv_profile_age" app:layout_constraintStart_toEndOf="@id/tv_profile_age" app:layout_constraintTop_toTopOf="@id/tv_profile_age" @@ -209,10 +210,10 @@ android:background="@drawable/shape_g6_line_20_rect" android:paddingHorizontal="8dp" android:paddingVertical="4dp" - android:text="@{vm.profileData.mbti}" + android:text="@{vm.uiState.profile.mbti}" android:textColor="@color/hous_g_6" android:theme="@style/En2" - android:visibility="@{vm.profileData.mbti}" + android:visibility="@{vm.uiState.profile.mbti}" app:layout_constraintBottom_toBottomOf="@id/tv_profile_age" app:layout_constraintStart_toEndOf="@id/tv_profile_birthday" app:layout_constraintTop_toTopOf="@id/tv_profile_age" @@ -226,10 +227,10 @@ android:background="@drawable/shape_g6_line_20_rect" android:paddingHorizontal="8dp" android:paddingVertical="4dp" - android:text="@{vm.profileData.job}" + android:text="@{vm.uiState.profile.job}" android:textColor="@color/hous_g_6" android:theme="@style/Description" - android:visibility="@{vm.profileData.job}" + android:visibility="@{vm.uiState.profile.job}" app:layout_constraintBottom_toBottomOf="@id/tv_profile_age" app:layout_constraintStart_toEndOf="@id/tv_profile_mbti" app:layout_constraintTop_toTopOf="@id/tv_profile_age" @@ -271,19 +272,19 @@ android:layout_gravity="top|center" android:layout_marginTop="28dp" android:src="@drawable/ic_profile_empty_tendency" - android:visibility="@{vm.isTest ? View.GONE : View.VISIBLE}" /> + android:visibility="@{vm.uiState.isTest ? View.GONE : View.VISIBLE}" /> + android:visibility="@{vm.uiState.isTest ? View.VISIBLE : View.GONE}"> + + 똑같은 이름의 Rule이 있어요! 아직 우리 집 Rules가 없어요! 새로운 Rules 추가 Rules 수정 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 167a581bd..a9bc21e50 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -29,8 +29,18 @@ @color/hous_black normal 20dp + false -0.02 10dp @android:color/transparent + + + + diff --git a/buildSrc/src/main/java/Deps.kt b/buildSrc/src/main/java/Deps.kt index ae4049759..fa9d2e962 100644 --- a/buildSrc/src/main/java/Deps.kt +++ b/buildSrc/src/main/java/Deps.kt @@ -7,8 +7,8 @@ object AppConfig { const val compileSdkVersion = 32 const val minSdkVersion = 26 const val targetSdkVersion = 32 - const val versionCode = 4 - const val versionName = "1.0.1" + const val versionCode = 5 + const val versionName = "1.0.6" } object Deps { diff --git a/data/src/main/java/hous/release/data/datasource/OurRulesDataSource.kt b/data/src/main/java/hous/release/data/datasource/OurRulesDataSource.kt index edd0d4374..24fb061ca 100644 --- a/data/src/main/java/hous/release/data/datasource/OurRulesDataSource.kt +++ b/data/src/main/java/hous/release/data/datasource/OurRulesDataSource.kt @@ -16,8 +16,8 @@ class OurRulesDataSource @Inject constructor(private val ourRulesService: OurRul suspend fun getOurRulesContent(): BaseResponse = ourRulesService.getOurRuleContent() - suspend fun postAddedRuleContent(addedRules: List): NoDataResponse = - ourRulesService.postAddedRuleContent(AddRulesRequest(addedRules = addedRules)) + suspend fun postAddedRuleContent(addedRules: List): Result = + runCatching { ourRulesService.postAddedRuleContent(AddRulesRequest(addedRules = addedRules)) } suspend fun putEditedRuleContent(editedRules: List): NoDataResponse = ourRulesService.putEditedRuleContent( diff --git a/data/src/main/java/hous/release/data/entity/response/PersonalityResultResponse.kt b/data/src/main/java/hous/release/data/entity/response/PersonalityResultResponse.kt index 52d6ea966..12c8600ea 100644 --- a/data/src/main/java/hous/release/data/entity/response/PersonalityResultResponse.kt +++ b/data/src/main/java/hous/release/data/entity/response/PersonalityResultResponse.kt @@ -20,7 +20,7 @@ data class PersonalityResultResponse( badPersonalityImageUrl = this.badPersonalityImageUrl, badPersonalityName = this.badPersonalityName, color = HomyType.valueOf(color), - description = this.description, + description = this.description.joinToString(ENTER), goodPersonalityImageUrl = this.goodPersonalityImageUrl, goodPersonalityName = this.goodPersonalityName, imageUrl = this.imageUrl, @@ -29,4 +29,8 @@ data class PersonalityResultResponse( recommendTodo = this.recommendTodo, title = this.title ) + + companion object { + private const val ENTER = "\n" + } } diff --git a/data/src/main/java/hous/release/data/repository/OurRulesRepositoryImpl.kt b/data/src/main/java/hous/release/data/repository/OurRulesRepositoryImpl.kt index 8b1869f90..55ba43f45 100644 --- a/data/src/main/java/hous/release/data/repository/OurRulesRepositoryImpl.kt +++ b/data/src/main/java/hous/release/data/repository/OurRulesRepositoryImpl.kt @@ -33,18 +33,13 @@ class OurRulesRepositoryImpl @Inject constructor( } }.flowOn(ioDispatcher) - override fun postAddedRule(addedRuleList: List): Flow> = flow { - val response = ourRulesDataSource.postAddedRuleContent(addedRuleList) - if (response.success) { - emit(ApiResult.Success(response.message)) - } else { - emit(ApiResult.Error(response.message)) - } - }.catch { e -> - if (e is HttpException) { - emit(ApiResult.Error(e.message)) - } - }.flowOn(ioDispatcher) + override suspend fun postAddedRule(addedRuleList: List): Int { + var code: Int = -999 + ourRulesDataSource.postAddedRuleContent(addedRuleList) + .onSuccess { code = it.status } + .onFailure { if (it is HttpException) code = it.code() } + return code + } override fun putEditedRuleContent(editedRuleList: List): Flow> = flow { diff --git a/domain/src/main/java/hous/release/domain/entity/response/PersonalityResult.kt b/domain/src/main/java/hous/release/domain/entity/response/PersonalityResult.kt index 5f8543ff8..f31237d1c 100644 --- a/domain/src/main/java/hous/release/domain/entity/response/PersonalityResult.kt +++ b/domain/src/main/java/hous/release/domain/entity/response/PersonalityResult.kt @@ -5,8 +5,8 @@ import hous.release.domain.entity.HomyType data class PersonalityResult( val badPersonalityImageUrl: String = "", val badPersonalityName: String = "", - val color: HomyType, - val description: List = emptyList(), + val color: HomyType = HomyType.GRAY, + val description: String = "", val goodPersonalityImageUrl: String = "", val goodPersonalityName: String = "", val imageUrl: String = "", diff --git a/domain/src/main/java/hous/release/domain/entity/response/Profile.kt b/domain/src/main/java/hous/release/domain/entity/response/Profile.kt index 214d014eb..87c0d646a 100644 --- a/domain/src/main/java/hous/release/domain/entity/response/Profile.kt +++ b/domain/src/main/java/hous/release/domain/entity/response/Profile.kt @@ -11,7 +11,7 @@ data class Profile( val job: String? = "", val mbti: String? = "", val nickname: String = "", - val personalityColor: HomyType, + val personalityColor: HomyType = HomyType.GRAY, val representBadge: String? = "", val representBadgeImage: String? = "", val testScore: TestScore = TestScore() diff --git a/domain/src/main/java/hous/release/domain/repository/OurRulesRepository.kt b/domain/src/main/java/hous/release/domain/repository/OurRulesRepository.kt index 9686536f0..4c286ab8d 100644 --- a/domain/src/main/java/hous/release/domain/repository/OurRulesRepository.kt +++ b/domain/src/main/java/hous/release/domain/repository/OurRulesRepository.kt @@ -6,7 +6,7 @@ import kotlinx.coroutines.flow.Flow interface OurRulesRepository { fun fetchOurRulesContent(): Flow>> - fun postAddedRule(addedRuleList: List): Flow> + suspend fun postAddedRule(addedRuleList: List): Int fun putEditedRuleContent(editedRuleList: List): Flow> fun deleteRuleContent(deleteRules: List): Flow> } diff --git a/domain/src/main/java/hous/release/domain/usecase/PostAddRulesUseCase.kt b/domain/src/main/java/hous/release/domain/usecase/PostAddRulesUseCase.kt index 09efac37b..6a1431b6d 100644 --- a/domain/src/main/java/hous/release/domain/usecase/PostAddRulesUseCase.kt +++ b/domain/src/main/java/hous/release/domain/usecase/PostAddRulesUseCase.kt @@ -4,6 +4,6 @@ import hous.release.domain.repository.OurRulesRepository import javax.inject.Inject class PostAddRulesUseCase @Inject constructor(private val ourRulesRepository: OurRulesRepository) { - operator fun invoke(addedRuleList: List) = + suspend operator fun invoke(addedRuleList: List) = ourRulesRepository.postAddedRule(addedRuleList) }