├── .gitignore ├── .idea ├── .gitignore ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── compiler.xml ├── dbnavigator.xml ├── dictionaries │ └── ams09.xml ├── gradle.xml ├── jarRepositories.xml ├── kotlinc.xml ├── misc.xml └── vcs.xml ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── project_flow_android │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── project_flow_android │ │ │ ├── base │ │ │ ├── BaseActivity.kt │ │ │ ├── BaseBindingAdapter.kt │ │ │ ├── BaseDialog.kt │ │ │ ├── BaseFragment.kt │ │ │ ├── BaseViewModel.kt │ │ │ └── SingleLiveEvent.kt │ │ │ ├── data │ │ │ ├── SharedPreferenceStorage.kt │ │ │ ├── chat │ │ │ │ ├── ChatListResponse.kt │ │ │ │ ├── ProjectMemberResponse.kt │ │ │ │ └── RoomListResponse.kt │ │ │ ├── model │ │ │ │ └── sign │ │ │ │ │ └── chat │ │ │ │ │ ├── ChatErrorResponse.kt │ │ │ │ │ ├── ChatMessageResponse.kt │ │ │ │ │ ├── ChatReceiveResponse.kt │ │ │ │ │ ├── DatePlanResponse.kt │ │ │ │ │ ├── FileResponse.kt │ │ │ │ │ ├── GetPinResponse.kt │ │ │ │ │ ├── ImageUpdateRequest.kt │ │ │ │ │ ├── ModifyNameRequest.kt │ │ │ │ │ ├── MonthPlanResponse.kt │ │ │ │ │ ├── NonParticipateResponse.kt │ │ │ │ │ ├── PinResponse.kt │ │ │ │ │ ├── ReJoinResponse.kt │ │ │ │ │ ├── RoomMemberResponse.kt │ │ │ │ │ └── UserProfileResponse.kt │ │ │ └── remote │ │ │ │ ├── PresentationRealPath.kt │ │ │ │ ├── chat │ │ │ │ ├── ChatRepository.kt │ │ │ │ └── ChatRepositoryImpl.kt │ │ │ │ ├── flow │ │ │ │ └── FlowApiImpl.kt │ │ │ │ ├── mypage │ │ │ │ └── MyPageApiImpl.kt │ │ │ │ └── sign │ │ │ │ ├── CertificationApiImpl.kt │ │ │ │ ├── LoginApiImpl.kt │ │ │ │ └── SignApiImpl.kt │ │ │ ├── database │ │ │ ├── AppDatabase.kt │ │ │ ├── OldMessage.kt │ │ │ └── OldMessageDao.kt │ │ │ ├── di │ │ │ ├── ProjectFlowApplication.kt │ │ │ └── module │ │ │ │ ├── AboutProjectModule.kt │ │ │ │ ├── CertificationModule.kt │ │ │ │ ├── ChatViewModelModule.kt │ │ │ │ ├── FinishRegisterModule.kt │ │ │ │ ├── FlowModule.kt │ │ │ │ ├── GitInfoModule.kt │ │ │ │ ├── LoginModule.kt │ │ │ │ ├── MainModule.kt │ │ │ │ ├── MyPageModule.kt │ │ │ │ ├── RegisterModule.kt │ │ │ │ └── SuccessfulModule.kt │ │ │ ├── feature │ │ │ ├── AddProjectRequest.kt │ │ │ ├── CertificationRequest.kt │ │ │ ├── GetGitProjectIssue.kt │ │ │ ├── GetMainInfoDetailResponse.kt │ │ │ ├── GetMainInfoResponse.kt │ │ │ ├── GetProjectScheduleDetailResponse.kt │ │ │ ├── GetProjectsId.kt │ │ │ ├── GetUserInfoResponse.kt │ │ │ ├── GetUserTokenRequest.kt │ │ │ ├── GitInfoResponse.kt │ │ │ ├── GitToken.kt │ │ │ ├── LoginRequest.kt │ │ │ ├── LoginResponse.kt │ │ │ ├── NewPasswordRequest.kt │ │ │ ├── PostCertificationRequest.kt │ │ │ ├── Projects.kt │ │ │ ├── RegisterRequest.kt │ │ │ └── image.kt │ │ │ ├── network │ │ │ ├── ApiProvider.kt │ │ │ ├── ChatApi.kt │ │ │ ├── GitAPI.kt │ │ │ ├── ProjectFlowAPI.kt │ │ │ ├── SafeApiRequest.kt │ │ │ └── SocketApplication.kt │ │ │ ├── ui │ │ │ ├── calendar │ │ │ │ ├── CalendarFragment.kt │ │ │ │ └── GitRVAdapter.kt │ │ │ ├── chat │ │ │ │ ├── ChatActivity.kt │ │ │ │ ├── ChatCreateActivity.kt │ │ │ │ ├── ChatRVAdapter.kt │ │ │ │ ├── CreateRVAdapter.kt │ │ │ │ ├── InviteRVAdapter.kt │ │ │ │ ├── ManageRVAdapter.kt │ │ │ │ ├── RoomRVAdapter.kt │ │ │ │ ├── ScheduleRVAdapter.kt │ │ │ │ ├── UserProjectRVAdapter.kt │ │ │ │ └── fragment │ │ │ │ │ ├── ChatFragment.kt │ │ │ │ │ ├── ChatListFragment.kt │ │ │ │ │ ├── InviteFragment.kt │ │ │ │ │ ├── ManageFragment.kt │ │ │ │ │ ├── ModifyFragment.kt │ │ │ │ │ ├── ScheduleFragment.kt │ │ │ │ │ └── UserInfoFragment.kt │ │ │ ├── flow │ │ │ │ ├── AddProjectActivity.kt │ │ │ │ ├── AddProjectFragment.kt │ │ │ │ ├── FinishProjectRVAdapter.kt │ │ │ │ ├── FlowActivity.kt │ │ │ │ ├── FlowFragment.kt │ │ │ │ ├── MainFlowAdapter.kt │ │ │ │ ├── OningProjectRVAdapter.kt │ │ │ │ ├── PreparingProjectRVAdapter.kt │ │ │ │ └── dialog │ │ │ │ │ ├── FinishPlanDialog.kt │ │ │ │ │ └── FinishProjectDialog.kt │ │ │ ├── main │ │ │ │ └── MainActivity.kt │ │ │ ├── mypage │ │ │ │ ├── HorizontalItemDecorator.kt │ │ │ │ ├── MyPageFragment.kt │ │ │ │ ├── UserProjectRVAdapter.kt │ │ │ │ ├── VerticalItemDecorator.kt │ │ │ │ └── dialog │ │ │ │ │ ├── ChangePasswordDialog.kt │ │ │ │ │ └── LogoutDialog.kt │ │ │ └── sign │ │ │ │ ├── CertificationActivity.kt │ │ │ │ ├── DashBoardActivity.kt │ │ │ │ ├── EditPasswordActivity.kt │ │ │ │ ├── FinishSignActivity.kt │ │ │ │ ├── LoginActivity.kt │ │ │ │ ├── LoginOauthActivity.kt │ │ │ │ └── RegisterActivity.kt │ │ │ ├── util │ │ │ ├── DialogUtil.kt │ │ │ ├── Event.kt │ │ │ ├── GalleryHelper.kt │ │ │ ├── HavePlanDecorator.kt │ │ │ ├── HorizontalItemDecorator.kt │ │ │ ├── KeyboardUtil.kt │ │ │ ├── SaturdayDecorator.kt │ │ │ ├── SundayDecorator.kt │ │ │ └── VerticalItemDecorator.kt │ │ │ └── viewmodel │ │ │ ├── MainViewModel.kt │ │ │ ├── calendar │ │ │ └── CalendarViewModel.kt │ │ │ ├── certification │ │ │ ├── CertificationViewModel.kt │ │ │ └── CertificationViewModelFactory.kt │ │ │ ├── chat │ │ │ └── ChatViewModel.kt │ │ │ ├── flow │ │ │ ├── AddProjectViewModel.kt │ │ │ └── FlowViewModel.kt │ │ │ ├── login │ │ │ ├── LoginViewModel.kt │ │ │ └── LoginViewModelFactory.kt │ │ │ ├── mypage │ │ │ ├── ChangePasswordViewModel.kt │ │ │ └── MyPageViewModel.kt │ │ │ └── register │ │ │ ├── FinishSignViewModel.kt │ │ │ ├── RegisterViewModel.kt │ │ │ └── RegisterViewModelFactory.kt │ └── res │ │ ├── anim │ │ ├── from_bottom.xml │ │ ├── from_top.xml │ │ ├── to_bottom.xml │ │ └── to_top.xml │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── bottomsheet_radius.xml │ │ ├── button_blue.xml │ │ ├── chat_et_radius.xml │ │ ├── flow_empty_project.png │ │ ├── git_button_img.png │ │ ├── git_logo.png │ │ ├── graph1.png │ │ ├── graph1_1.png │ │ ├── graph1_11.png │ │ ├── group.png │ │ ├── ic_baseline_account_circle_24.xml │ │ ├── ic_baseline_add_24.xml │ │ ├── ic_baseline_add_25.xml │ │ ├── ic_baseline_add_circle_24.xml │ │ ├── ic_baseline_add_photo_alternate_24.xml │ │ ├── ic_baseline_arrow_back_ios_new_24.xml │ │ ├── ic_baseline_arrow_forward_ios_24.xml │ │ ├── ic_baseline_calendar_today_24.xml │ │ ├── ic_baseline_chat_24.xml │ │ ├── ic_baseline_check_box_24.xml │ │ ├── ic_baseline_chevron_left_24.xml │ │ ├── ic_baseline_circle_24.xml │ │ ├── ic_baseline_circle_24_finish.xml │ │ ├── ic_baseline_close_24.xml │ │ ├── ic_baseline_person_24.xml │ │ ├── ic_baseline_usb_24.xml │ │ ├── ic_chat_add.xml │ │ ├── ic_chat_add_schedule.xml │ │ ├── ic_chat_photo.xml │ │ ├── ic_chat_send.xml │ │ ├── ic_chat_view_schedule.xml │ │ ├── ic_cross.xml │ │ ├── ic_current_dot.xml │ │ ├── ic_dot_selected.xml │ │ ├── ic_dot_unselected.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_manage_item_arrow.xml │ │ ├── ic_pin.xml │ │ ├── intro_human.png │ │ ├── plan_image_radius.xml │ │ ├── pms.png │ │ ├── profile_radius.xml │ │ ├── project_radius.xml │ │ ├── rectangle182.png │ │ ├── select.png │ │ ├── select_color.xml │ │ ├── selector_indicator.xml │ │ ├── shadow_test.xml │ │ ├── user_info_fail_radius.xml │ │ ├── user_info_profile_radius.xml │ │ └── user_info_success_radius.xml │ │ ├── font │ │ ├── font_nanumgothic_bold.xml │ │ ├── font_roboto_bold.xml │ │ ├── font_roboto_regular.xml │ │ ├── nanum_gothic_bold.ttf │ │ ├── nanumgothic_bold.ttf │ │ ├── nanumgothic_extrabold.ttf │ │ ├── nanumgothic_regular.ttf │ │ ├── roboto_bold.ttf │ │ └── roboto_regular.ttf │ │ ├── layout │ │ ├── activity_add_project.xml │ │ ├── activity_chat.xml │ │ ├── activity_chat_create.xml │ │ ├── activity_dash_borad.xml │ │ ├── activity_edit_password.xml │ │ ├── activity_email_verify.xml │ │ ├── activity_finish_sign.xml │ │ ├── activity_flow.xml │ │ ├── activity_login.xml │ │ ├── activity_login_oauth.xml │ │ ├── activity_main.xml │ │ ├── activity_register.xml │ │ ├── add_schedule_bottom.xml │ │ ├── chat_create_user_item.xml │ │ ├── chat_forced_plan_item_mine.xml │ │ ├── chat_item_mine.xml │ │ ├── chat_item_other.xml │ │ ├── chat_join_plan_item_mine.xml │ │ ├── chat_join_plan_item_other.xml │ │ ├── chat_list_item.xml │ │ ├── chat_plan_item_mine.xml │ │ ├── chat_resign_plan_item_mine.xml │ │ ├── chat_resign_plan_item_other.xml │ │ ├── dialog_changepassword.xml │ │ ├── dialog_closing_plan.xml │ │ ├── dialog_finish_project.xml │ │ ├── dialog_join_project.xml │ │ ├── dialog_logout.xml │ │ ├── dialog_over_project.xml │ │ ├── fragment_add_project.xml │ │ ├── fragment_calendar.xml │ │ ├── fragment_chat.xml │ │ ├── fragment_chat_list.xml │ │ ├── fragment_flow.xml │ │ ├── fragment_invite.xml │ │ ├── fragment_manage.xml │ │ ├── fragment_modify.xml │ │ ├── fragment_my_page.xml │ │ ├── fragment_schedule.xml │ │ ├── fragment_user_info.xml │ │ ├── item_flow_view.xml │ │ ├── manage_item.xml │ │ ├── mine_image_item.xml │ │ ├── other_image_item.xml │ │ ├── pin_dialog.xml │ │ ├── remove_schedule_bottom.xml │ │ ├── room_exit_dialog.xml │ │ ├── room_status_item.xml │ │ ├── schedule_item.xml │ │ ├── user_git_issue_item.xml │ │ ├── user_info_item.xml │ │ ├── user_project_finish_item.xml │ │ ├── user_project_item.xml │ │ ├── user_project_mypage_item.xml │ │ ├── user_project_oning_item.xml │ │ ├── user_project_plan_item.xml │ │ └── user_project_progress.xml │ │ ├── menu │ │ └── menu_bottom_navigation.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_foreground2.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_foreground2.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_foreground2.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_foreground2.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_foreground2.png │ │ ├── raw │ │ └── animation.json │ │ ├── values-night │ │ └── themes.xml │ │ ├── values │ │ ├── colors.xml │ │ ├── dimen.xml │ │ ├── major_item.xml │ │ ├── strings.xml │ │ ├── style.xml │ │ └── themes.xml │ │ └── xml │ │ └── network_security_config.xml │ └── test │ └── java │ └── com │ └── example │ └── project_flow_android │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | 17 | .idea/runConfigurations.xml 18 | 19 | .idea/ 20 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/dictionaries/ams09.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Project_Flow 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Project-Flow Android 2 | 3 | #### ```개발자들의 프로젝트를 관리를 도와주는 앱 📂``` 4 | ### 사용기술 5 |
```Kotlin```,```Coroutine```, ```Rxjava```, ```Retrofit2```, ```Socket```, ```AAC``` 6 | 7 |
8 | 9 | ### 개발규칙 10 | 11 | + #### 모든 개발은 master branch가 아닌 ```feature```에서 진행하며, 개발 완료시 develop으로 ```merge``` 한다. 12 | 13 | + #### Resource는 아래 해당 사항에 맞추어 사용한다. 14 |
15 | 16 | ### Drawable 17 | + [what_description_where] 18 | + icon -> ic, background -> back (what) 19 | + ex) ic_list, back_broder_black 20 | 21 | ### Layout 22 | + [what_description] 23 | + ex) activity_main, fragment_chatting 24 | 25 | ### ID 26 | + [where_what_description] 27 | + textview -> tv, editText -> et, button -> btn, customview → cv 28 | + ex) main_intro_tv, login_submit_btn 29 | 30 | ### Color 31 | + [color] 32 | + ex) red80, blue99 33 | 34 | 35 | ### About Git 36 | 37 | ##### ```Commit message ``` 38 | 39 | ###### [UPDATE] — 신규파일 추가 40 | ###### [MODIFY] - 코드 변경 41 | ###### [REFACTOR] — 코드 리팩토링 42 | ###### [FIX] — 에러 수정, 필요한 모듈 추가 및 삭제 43 | ###### [REMOVE] — 파일 제거 44 | ###### [STYLE] — 디자인 관련 변경사항 45 | 46 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | ### Android template 3 | # Built application files 4 | *.apk 5 | *.aar 6 | *.ap_ 7 | *.aab 8 | 9 | # Files for the ART/Dalvik VM 10 | *.dex 11 | 12 | # Java class files 13 | *.class 14 | 15 | # Generated files 16 | bin/ 17 | gen/ 18 | out/ 19 | # Uncomment the following line in case you need and you don't have the release build type files in your app 20 | # release/ 21 | 22 | # Gradle files 23 | .gradle/ 24 | build/ 25 | 26 | # Local configuration file (sdk path, etc) 27 | local.properties 28 | 29 | # Proguard folder generated by Eclipse 30 | proguard/ 31 | 32 | # Log Files 33 | *.log 34 | 35 | # Android Studio Navigation editor temp files 36 | .navigation/ 37 | 38 | # Android Studio captures folder 39 | captures/ 40 | 41 | # IntelliJ 42 | *.iml 43 | .idea/workspace.xml 44 | .idea/tasks.xml 45 | .idea/gradle.xml 46 | .idea/assetWizardSettings.xml 47 | .idea/dictionaries 48 | .idea/libraries 49 | # Android Studio 3 in .gitignore file. 50 | .idea/caches 51 | .idea/modules.xml 52 | # Comment next line if keeping position of elements in Navigation Editor is relevant for you 53 | .idea/navEditor.xml 54 | 55 | # Keystore files 56 | # Uncomment the following lines if you do not want to check your keystore files in. 57 | #*.jks 58 | #*.keystore 59 | 60 | # External native build folder generated in Android Studio 2.2 and later 61 | .externalNativeBuild 62 | .cxx/ 63 | 64 | # Google Services (e.g. APIs or Firebase) 65 | # google-services.json 66 | 67 | # Freeline 68 | freeline.py 69 | freeline/ 70 | freeline_project_description.json 71 | 72 | # fastlane 73 | fastlane/report.xml 74 | fastlane/Preview.html 75 | fastlane/screenshots 76 | fastlane/test_output 77 | fastlane/readme.md 78 | 79 | # Version control 80 | vcs.xml 81 | 82 | # lint 83 | lint/intermediates/ 84 | lint/generated/ 85 | lint/outputs/ 86 | lint/tmp/ 87 | # lint/reports/ 88 | 89 | # Android Profiling 90 | *.hprof 91 | 92 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/project_flow_android/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.example.project_flow_android", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/base/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.base 2 | 3 | import android.os.Bundle 4 | import androidx.annotation.LayoutRes 5 | import androidx.appcompat.app.AppCompatActivity 6 | import androidx.databinding.DataBindingUtil 7 | import androidx.databinding.ViewDataBinding 8 | import androidx.lifecycle.ViewModel 9 | import com.example.project_flow_android.BR 10 | 11 | abstract class BaseActivity( 12 | @LayoutRes private val layoutResId: Int 13 | ) : AppCompatActivity() { 14 | 15 | protected lateinit var binding: B 16 | abstract val vm: ViewModel 17 | 18 | override fun onCreate(savedInstanceState: Bundle?) { 19 | super.onCreate(savedInstanceState) 20 | binding = DataBindingUtil.setContentView(this, layoutResId) 21 | binding.lifecycleOwner = this 22 | binding.setVariable(BR.vm, vm) 23 | 24 | } 25 | 26 | 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/base/BaseBindingAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.base 2 | 3 | import android.graphics.PorterDuff 4 | import android.widget.ImageView 5 | import androidx.core.content.ContextCompat 6 | import androidx.databinding.BindingAdapter 7 | import androidx.recyclerview.widget.LinearLayoutManager 8 | import androidx.recyclerview.widget.RecyclerView 9 | import androidx.swiperefreshlayout.widget.CircularProgressDrawable 10 | import com.bumptech.glide.Glide 11 | import com.example.project_flow_android.R 12 | 13 | object BaseBindingAdapter { 14 | @JvmStatic 15 | @BindingAdapter("recycler_view_adapter") 16 | fun recyclerViewAdapter( 17 | recyclerView: RecyclerView, 18 | adapter: RecyclerView.Adapter? 19 | ) { 20 | val setLayoutManager = LinearLayoutManager(recyclerView.context) 21 | setLayoutManager.orientation = RecyclerView.VERTICAL 22 | recyclerView.layoutManager = setLayoutManager 23 | if (adapter != null) { 24 | recyclerView.adapter = adapter 25 | } 26 | } 27 | 28 | @JvmStatic 29 | @BindingAdapter("glide_image_load") 30 | fun glideImageLoad(imageView: ImageView, resource: String?) { 31 | val circularProgressDrawable = CircularProgressDrawable(imageView.context) 32 | circularProgressDrawable.strokeWidth = 10f 33 | circularProgressDrawable.centerRadius = 40f 34 | circularProgressDrawable.setColorFilter(ContextCompat.getColor(imageView.context, R.color.blue_main), PorterDuff.Mode.SRC_IN ) 35 | circularProgressDrawable.start() 36 | 37 | Glide.with(imageView.context) 38 | .load(resource) 39 | .placeholder(circularProgressDrawable) 40 | .error(R.drawable.ic_baseline_person_24) 41 | .into(imageView) 42 | } 43 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/base/BaseDialog.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.base 2 | 3 | import android.graphics.Color 4 | import android.graphics.drawable.ColorDrawable 5 | import android.os.Bundle 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | import androidx.annotation.LayoutRes 10 | import androidx.databinding.DataBindingUtil 11 | import androidx.databinding.ViewDataBinding 12 | import androidx.databinding.library.baseAdapters.BR 13 | import androidx.fragment.app.DialogFragment 14 | import androidx.lifecycle.ViewModel 15 | 16 | abstract class BaseDialog(@LayoutRes private val layoutResId: Int) : DialogFragment() { 17 | lateinit var binding: B 18 | abstract val vm: ViewModel 19 | 20 | 21 | override fun onCreateView( 22 | inflater: LayoutInflater, 23 | container: ViewGroup?, 24 | savedInstanceState: Bundle? 25 | ): View { 26 | binding = DataBindingUtil.inflate(inflater, layoutResId, container, false) 27 | binding.lifecycleOwner = this 28 | binding.setVariable(BR.vm, vm) 29 | 30 | return binding.root 31 | } 32 | 33 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 34 | super.onViewCreated(view, savedInstanceState) 35 | dialog!!.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/base/BaseFragment.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.base 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.annotation.LayoutRes 8 | import androidx.databinding.DataBindingUtil 9 | import androidx.databinding.ViewDataBinding 10 | import androidx.fragment.app.Fragment 11 | import androidx.lifecycle.ViewModel 12 | import com.example.project_flow_android.BR 13 | 14 | abstract class BaseFragment( 15 | @LayoutRes private val layoutRes: Int 16 | ) : Fragment() { 17 | protected lateinit var binding: B 18 | abstract val vm: ViewModel 19 | 20 | override fun onCreateView( 21 | inflater: LayoutInflater, 22 | container: ViewGroup?, 23 | savedInstanceState: Bundle? 24 | ): View? { 25 | binding = DataBindingUtil.inflate(inflater, layoutRes, container, false) 26 | return binding.root 27 | } 28 | 29 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 30 | super.onViewCreated(view, savedInstanceState) 31 | binding.lifecycleOwner = this 32 | binding.setVariable(BR.vm,vm) 33 | observeEvent() 34 | } 35 | 36 | abstract fun observeEvent() 37 | 38 | 39 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/base/BaseViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.base 2 | 3 | import androidx.lifecycle.ViewModel 4 | import io.reactivex.disposables.CompositeDisposable 5 | import io.reactivex.disposables.Disposable 6 | 7 | open class BaseViewModel : ViewModel(){ 8 | 9 | private val compositeDisposable = CompositeDisposable() 10 | 11 | fun addDisposable(disposable: Disposable) { 12 | compositeDisposable.add(disposable) 13 | } 14 | 15 | override fun onCleared() { 16 | compositeDisposable.clear() 17 | super.onCleared() 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/base/SingleLiveEvent.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.base 2 | 3 | import android.util.Log 4 | import androidx.annotation.MainThread 5 | import androidx.lifecycle.LifecycleOwner 6 | import androidx.lifecycle.MutableLiveData 7 | import androidx.lifecycle.Observer 8 | import java.util.concurrent.atomic.AtomicBoolean 9 | 10 | /* 11 | * Copyright 2017 Google Inc. 12 | * 13 | * Licensed under the Apache License, Version 2.0 (the "License"); 14 | * you may not use this file except in compliance with the License. 15 | * You may obtain a copy of the License at 16 | * 17 | * http://www.apache.org/licenses/LICENSE-2.0 18 | * 19 | * Unless required by applicable law or agreed to in writing, software 20 | * distributed under the License is distributed on an "AS IS" BASIS, 21 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 22 | * See the License for the specific language governing permissions and 23 | * limitations under the License. 24 | */ 25 | class SingleLiveEvent : MutableLiveData() { 26 | 27 | private val mPending = AtomicBoolean(false) 28 | 29 | @MainThread 30 | override fun observe(owner: LifecycleOwner, observer: Observer) { 31 | if (hasActiveObservers()) { 32 | Log.w(TAG, "Multiple observers registered but only one will be notified of changes.") 33 | } 34 | 35 | // Observe the internal MutableLiveData 36 | super.observe(owner, Observer { t -> 37 | if (mPending.compareAndSet(true, false)) { 38 | observer.onChanged(t) 39 | } 40 | }) 41 | } 42 | 43 | @MainThread 44 | override fun setValue(t: T?) { 45 | mPending.set(true) 46 | super.setValue(t) 47 | } 48 | 49 | /** 50 | * Used for cases where T is Void, to make calls cleaner. 51 | */ 52 | @MainThread 53 | fun call() { 54 | value = null 55 | } 56 | 57 | companion object { 58 | 59 | const val TAG = "SingleLiveEvent" 60 | } 61 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/chat/ChatListResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.chat 2 | 3 | data class ChatListResponse(val chatListResponse: ArrayList) { 4 | data class ChatContentResponse( 5 | val id: String, 6 | val type: String, 7 | val message: String, 8 | val createdAt: String, 9 | val planTitle: String, 10 | val planId: String, 11 | val readers: List, 12 | val isParticipated: Boolean, 13 | val chatRoomId: String, 14 | val isMine: Boolean 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/chat/ProjectMemberResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.chat 2 | 3 | data class ProjectMemberResponse( 4 | val responses : ArrayList 5 | ) { 6 | data class User( 7 | val name : String, 8 | val id : String, 9 | val profileImage: String 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/chat/RoomListResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.chat 2 | 3 | data class RoomListResponse(val responses: ArrayList) { 4 | data class ChatRoomResponse( 5 | val chatRoomName: String, 6 | val id: String, 7 | val chatRoomImage: String 8 | ) 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/ChatErrorResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class ChatErrorResponse( 4 | val status : Int, 5 | val message : String 6 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/ChatMessageResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class ChatMessageResponse( 4 | val oldChatMessageResponses : ArrayList, 5 | val size : Int, 6 | val hasNextPage: Boolean 7 | ){ 8 | data class ChatReceiveResponse( 9 | val type: String, 10 | val id: String, 11 | val planId: String?, 12 | val planName: String?, 13 | val startDate: String?, 14 | val endDate: String?, 15 | val message: String?, 16 | val senderName: String, 17 | val senderImage: String, 18 | val readerList: ArrayList, 19 | val createdAt: String, 20 | val mine: Boolean, 21 | val userId: String?, 22 | val userEmail: String?, 23 | val userName: String?, 24 | val profileImage: String? 25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/ChatReceiveResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class ChatReceiveResponse( 4 | val id: String, 5 | val message: String, 6 | val senderName: String, 7 | val senderImage: String, 8 | val readerList: ArrayList, 9 | val createdAt: String, 10 | val mine: Boolean 11 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/DatePlanResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class DatePlanResponse( 4 | val planDetails: ArrayList 5 | ){ 6 | data class DateResponse( 7 | val id: String, 8 | val name: String, 9 | val isFinish: Boolean 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/FileResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class FileResponse( 4 | val imageUrl: String 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/GetPinResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class GetPinResponse( 4 | val content: String 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/ImageUpdateRequest.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class ImageUpdateRequest( 4 | val imageUrl: String 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/ModifyNameRequest.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class ModifyNameRequest( 4 | val name: String 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/MonthPlanResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class MonthPlanResponse( 4 | val monthPlans: ArrayList 5 | ){ 6 | data class MonthResponse( 7 | val startDate: String, 8 | val endDate: String, 9 | val isFinish: Boolean 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/NonParticipateResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class NonParticipateResponse( 4 | val responses: ArrayList 5 | ){ 6 | data class NonUserList( 7 | val name: String, 8 | val email: String, 9 | val profileImage: String 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/PinResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class PinResponse( 4 | val type: String, 5 | val content: String 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/ReJoinResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class ReJoinResponse( 4 | val userEmail: String 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/RoomMemberResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class RoomMemberResponse( 4 | val responses : ArrayList 5 | ) { 6 | data class MemberResponse( 7 | val name: String, 8 | val id: String, 9 | val profileImage: String 10 | ) 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/model/sign/chat/UserProfileResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.model.sign.chat 2 | 3 | data class UserProfileResponse( 4 | val userName: String, 5 | val userEmail: String, 6 | val phoneNumber: String, 7 | val profileImage: String, 8 | val projectResponses: ArrayList 9 | ){ 10 | data class ProjectResponse( 11 | val projectImage: String, 12 | val projectName: String, 13 | val projectStartDate: String, 14 | val projectEndDate: String, 15 | val finished: Boolean 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/remote/PresentationRealPath.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.remote 2 | 3 | import android.content.Context 4 | import android.database.Cursor 5 | import android.net.Uri 6 | import android.provider.MediaStore 7 | import androidx.loader.content.CursorLoader 8 | import okhttp3.MediaType.Companion.toMediaTypeOrNull 9 | import okhttp3.MultipartBody 10 | import okhttp3.RequestBody.Companion.asRequestBody 11 | import java.io.File 12 | 13 | fun Uri.toRealPath(context: Context): String { 14 | val proj = arrayOf(MediaStore.Images.Media.DATA) 15 | val loader = CursorLoader(context, this, proj, null, null, null) 16 | val cursor: Cursor = loader.loadInBackground()!! 17 | 18 | val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) 19 | cursor.moveToFirst() 20 | 21 | val result = cursor.getString(columnIndex) 22 | 23 | cursor.close() 24 | 25 | return result 26 | } 27 | 28 | fun File.toMultipartPart(): MultipartBody.Part { 29 | val fileBody = this.asRequestBody("image/jpeg".toMediaTypeOrNull()) 30 | return MultipartBody.Part.createFormData("file", this.name, fileBody) 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/remote/chat/ChatRepository.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.remote.chat 2 | 3 | import com.example.project_flow_android.data.model.sign.chat.* 4 | import okhttp3.MultipartBody 5 | import org.json.JSONObject 6 | import com.example.project_flow_android.data.chat.ProjectMemberResponse 7 | import com.example.project_flow_android.data.chat.RoomListResponse 8 | import retrofit2.Response 9 | 10 | interface ChatRepository{ 11 | suspend fun getProjectUser(header:String, projectId: String) : Response 12 | suspend fun getRoomList(header: String, projectId: String) : Response 13 | suspend fun getRoomMember(header: String, chatRoomId: String) : Response 14 | suspend fun getChatList(header: String, chatRoomId: String, page: Int, size: Int) : Response 15 | suspend fun getUserProfile(header: String, userId: String) : Response 16 | suspend fun modifyRoomName(header: String, chatRoomId: String, name: ModifyNameRequest) : Response 17 | suspend fun fileUpload(header: String, file: MultipartBody.Part) : Response 18 | suspend fun imageUpdate(header: String, chatRoomId: String, imageUrl: ImageUpdateRequest) : Response 19 | suspend fun getNonParticipate(header:String, projectId: String, chatRoomId: String) : Response 20 | suspend fun getPin(header: String, chatRoomId: String) : Response 21 | suspend fun getMonthPlan(header: String, project_id: String, year: String, month: String) : Response 22 | suspend fun getDatePlan(header: String, project_id: String, date: String) : Response 23 | suspend fun deletePlan(header: String, planId: String) : Response 24 | suspend fun resignPlan(header: String, chatRoomId: String, planId: String) : Response 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/remote/flow/FlowApiImpl.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.remote.flow 2 | 3 | import com.example.project_flow_android.data.remote.toMultipartPart 4 | import com.example.project_flow_android.feature.* 5 | import com.example.project_flow_android.network.ApiProvider 6 | import com.example.project_flow_android.network.ProjectFlowAPI 7 | import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers 8 | import io.reactivex.rxjava3.annotations.NonNull 9 | import io.reactivex.rxjava3.core.Single 10 | import io.reactivex.rxjava3.schedulers.Schedulers 11 | import okhttp3.MediaType 12 | import okhttp3.MediaType.Companion.toMediaTypeOrNull 13 | import okhttp3.RequestBody 14 | import retrofit2.Response 15 | import retrofit2.http.FormUrlEncoded 16 | import retrofit2.http.Multipart 17 | import java.io.File 18 | 19 | class FlowApiImpl { 20 | private fun providerFlowApi(): ProjectFlowAPI = ApiProvider.RetroFitBuilder.create( 21 | ProjectFlowAPI::class.java) 22 | 23 | fun finishProject( 24 | token: String, 25 | ProjectId: String, 26 | ): @NonNull Single> = 27 | providerFlowApi().finishProject(token, ProjectId) 28 | .observeOn(AndroidSchedulers.mainThread()) 29 | .subscribeOn(Schedulers.io()) 30 | 31 | fun getMainInfo( 32 | token: String, 33 | ): @NonNull Single> = 34 | providerFlowApi().getMainInfo(token) 35 | .observeOn(AndroidSchedulers.mainThread()) 36 | .subscribeOn(Schedulers.io()) 37 | 38 | fun finishPlan( 39 | token: String, 40 | projectId: String, 41 | PlanId: String, 42 | ): @NonNull Single> = 43 | providerFlowApi().finishPlan(token, projectId, PlanId) 44 | .observeOn(AndroidSchedulers.mainThread()) 45 | .subscribeOn(Schedulers.io()) 46 | 47 | 48 | fun gitOauth(): @NonNull Single> = 49 | providerFlowApi().gitOauth() 50 | .observeOn(AndroidSchedulers.mainThread()) 51 | .subscribeOn(Schedulers.io()) 52 | 53 | fun addProject2( 54 | token: String, 55 | request: AddProjectRequest, 56 | ): @NonNull Single> = 57 | providerFlowApi().addProject2(token, request) 58 | .observeOn(AndroidSchedulers.mainThread()) 59 | .subscribeOn(Schedulers.io()) 60 | 61 | 62 | fun postImage(file: File): @NonNull Single> = 63 | providerFlowApi().postImage(file.toMultipartPart()) 64 | .observeOn(AndroidSchedulers.mainThread()) 65 | .subscribeOn(Schedulers.io()) 66 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/remote/mypage/MyPageApiImpl.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.remote.mypage 2 | 3 | import com.example.project_flow_android.data.remote.toMultipartPart 4 | import com.example.project_flow_android.feature.GetGitProjectIssue 5 | import com.example.project_flow_android.feature.GetUserInfoResponse 6 | import com.example.project_flow_android.feature.NewPasswordRequest 7 | import com.example.project_flow_android.feature.image 8 | import com.example.project_flow_android.network.ApiProvider 9 | import com.example.project_flow_android.network.GitAPI 10 | import com.example.project_flow_android.network.ProjectFlowAPI 11 | import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers 12 | import io.reactivex.rxjava3.annotations.NonNull 13 | import io.reactivex.rxjava3.core.Single 14 | import io.reactivex.rxjava3.schedulers.Schedulers 15 | import okhttp3.MultipartBody 16 | import retrofit2.Response 17 | import java.io.File 18 | 19 | class MyPageApiImpl { 20 | 21 | private fun providerMypageApi(): ProjectFlowAPI = ApiProvider.RetroFitBuilder.create( 22 | ProjectFlowAPI::class.java) 23 | 24 | private fun providerGitApi(): GitAPI = ApiProvider.GitRetroFitBuilder.create( 25 | GitAPI::class.java 26 | ) 27 | 28 | fun getUserInfo(token: String): @NonNull Single> = 29 | providerMypageApi().getuserInfo(token) 30 | .observeOn(AndroidSchedulers.mainThread()) 31 | .subscribeOn(Schedulers.io()) 32 | 33 | fun changePassword( 34 | token: String, 35 | password: String, 36 | ): @NonNull Single> = 37 | providerMypageApi().changePassword(token, password) 38 | .observeOn(AndroidSchedulers.mainThread()) 39 | .subscribeOn(Schedulers.io()) 40 | 41 | 42 | fun getGitInfo(token: String): @NonNull Single> = 43 | providerGitApi().getGitInfo(token) 44 | .observeOn(AndroidSchedulers.mainThread()) 45 | .subscribeOn(Schedulers.io()) 46 | 47 | fun patchImage( token: String,request: String): @NonNull Single> = 48 | providerMypageApi().patchImage( token,request) 49 | .observeOn(AndroidSchedulers.mainThread()) 50 | .subscribeOn(Schedulers.io()) 51 | 52 | fun postProfileImage(file: File): @NonNull Single> = 53 | providerMypageApi().postImage(file.toMultipartPart()) 54 | .observeOn(AndroidSchedulers.mainThread()) 55 | .subscribeOn(Schedulers.io()) 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/remote/sign/CertificationApiImpl.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.remote.sign 2 | 3 | import com.example.project_flow_android.feature.CertificationRequest 4 | import com.example.project_flow_android.feature.PostCertificationRequest 5 | import com.example.project_flow_android.network.ApiProvider 6 | import com.example.project_flow_android.network.ProjectFlowAPI 7 | import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers 8 | import io.reactivex.rxjava3.annotations.NonNull 9 | import io.reactivex.rxjava3.core.Single 10 | import io.reactivex.rxjava3.schedulers.Schedulers 11 | import retrofit2.Response 12 | 13 | class CertificationApiImpl { 14 | private fun providerSignApi(): ProjectFlowAPI = ApiProvider.RetroFitBuilder.create(ProjectFlowAPI::class.java) 15 | 16 | fun checkCertification(request: PostCertificationRequest): @NonNull Single> = 17 | providerSignApi().checkCertification(request) 18 | .observeOn(AndroidSchedulers.mainThread()) 19 | .subscribeOn(Schedulers.io()) 20 | 21 | fun postCertification(request: CertificationRequest): @NonNull Single> = 22 | providerSignApi().postCertification(request) 23 | .observeOn(AndroidSchedulers.mainThread()) 24 | .subscribeOn(Schedulers.io()) 25 | 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/remote/sign/LoginApiImpl.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.remote.sign 2 | 3 | import com.example.project_flow_android.feature.* 4 | import com.example.project_flow_android.network.ApiProvider 5 | import com.example.project_flow_android.network.ProjectFlowAPI 6 | import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers 7 | import io.reactivex.rxjava3.annotations.NonNull 8 | import io.reactivex.rxjava3.core.Single 9 | import io.reactivex.rxjava3.schedulers.Schedulers 10 | import retrofit2.Response 11 | 12 | class LoginApiImpl { 13 | 14 | private fun providerSignApi(): ProjectFlowAPI = ApiProvider.RetroFitBuilder.create(ProjectFlowAPI::class.java) 15 | 16 | fun loginApi(request: LoginRequest):@NonNull Single> = providerSignApi().login(request) 17 | .observeOn(AndroidSchedulers.mainThread()) 18 | .subscribeOn(Schedulers.io()) 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/data/remote/sign/SignApiImpl.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.data.remote.sign 2 | 3 | import com.example.project_flow_android.feature.* 4 | import com.example.project_flow_android.network.ApiProvider 5 | import com.example.project_flow_android.network.ProjectFlowAPI 6 | import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers 7 | import io.reactivex.rxjava3.annotations.NonNull 8 | import io.reactivex.rxjava3.core.Single 9 | import io.reactivex.rxjava3.schedulers.Schedulers 10 | import retrofit2.Response 11 | 12 | class SignApiImpl { 13 | 14 | private fun providerSignApi(): ProjectFlowAPI = ApiProvider.RetroFitBuilder.create(ProjectFlowAPI::class.java) 15 | 16 | fun registerApi(request: RegisterRequest):@NonNull Single> = providerSignApi().register(request) 17 | .observeOn(AndroidSchedulers.mainThread()) 18 | .subscribeOn(Schedulers.io()) 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/database/AppDatabase.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.database 2 | 3 | import androidx.room.Database 4 | import androidx.room.RoomDatabase 5 | 6 | @Database(entities = [OldMessage::class], version = 1) 7 | abstract class AppDatabase : RoomDatabase() { 8 | abstract fun oldMessageDao() : OldMessageDao 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/database/OldMessage.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.database 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | 7 | @Entity(primaryKeys = arrayOf("id", "chatRoomId")) 8 | data class OldMessage( 9 | @PrimaryKey val id: String, 10 | @PrimaryKey val chatRoomId: String, 11 | @ColumnInfo val type: String, 12 | @ColumnInfo val planId: String?, 13 | @ColumnInfo val planName: String?, 14 | @ColumnInfo val startDate: String?, 15 | @ColumnInfo val endDate: String?, 16 | @ColumnInfo val message: String?, 17 | @ColumnInfo val senderName: String, 18 | @ColumnInfo val senderImage: String, 19 | @ColumnInfo val readerList: ArrayList, 20 | @ColumnInfo val createdAt: String, 21 | @ColumnInfo val mine: Boolean 22 | ) 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/database/OldMessageDao.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.database 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.Query 6 | 7 | @Dao 8 | interface OldMessageDao { 9 | @Query("SELECT * FROM oldmessage") 10 | fun getAll(): List 11 | 12 | @Insert 13 | fun insertMessage(oldMessage: OldMessage) 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/ProjectFlowApplication.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di 2 | 3 | import android.app.Application 4 | import android.content.Context 5 | import com.example.project_flow_android.di.module.* 6 | 7 | import org.koin.android.ext.koin.androidContext 8 | import org.koin.core.context.startKoin 9 | 10 | class ProjectFlowApplication : Application() { 11 | override fun onCreate() { 12 | super.onCreate() 13 | startKoin { 14 | androidContext(this@ProjectFlowApplication) 15 | modules( 16 | listOf( 17 | loginModule, 18 | registerModule, 19 | mainModule, 20 | certificationModule, 21 | successfulModule, 22 | chatViewModelModule, 23 | finishRegisterModule, 24 | aboutProjectmodule, 25 | mypageModule, 26 | flowModule, 27 | gitinfoModule 28 | ) 29 | ) 30 | } 31 | context = applicationContext 32 | } 33 | companion object{ 34 | lateinit var context: Context 35 | private set 36 | } 37 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/module/AboutProjectModule.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di.module 2 | 3 | import com.example.project_flow_android.viewmodel.flow.AddProjectViewModel 4 | import org.koin.androidx.viewmodel.dsl.viewModel 5 | import org.koin.dsl.module 6 | 7 | val aboutProjectmodule = module { 8 | 9 | viewModel { AddProjectViewModel(get(), get()) } 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/module/CertificationModule.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di.module 2 | 3 | import com.example.project_flow_android.data.remote.sign.CertificationApiImpl 4 | import com.example.project_flow_android.data.remote.sign.SignApiImpl 5 | import com.example.project_flow_android.viewmodel.certification.CertificationViewModelFactory 6 | import org.koin.dsl.module 7 | 8 | val certificationModule = module { 9 | single { CertificationApiImpl() } 10 | single { SignApiImpl() } 11 | single { CertificationViewModelFactory(get(),get(),get()) } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/module/ChatViewModelModule.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di 2 | 3 | import com.example.project_flow_android.viewmodel.chat.ChatViewModel 4 | import org.koin.androidx.viewmodel.dsl.viewModel 5 | import org.koin.dsl.module 6 | 7 | val chatViewModelModule = module { 8 | viewModel { ChatViewModel() } 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/module/FinishRegisterModule.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di.module 2 | 3 | import com.example.project_flow_android.viewmodel.register.FinishSignViewModel 4 | import org.koin.androidx.viewmodel.dsl.viewModel 5 | import org.koin.dsl.module 6 | 7 | val finishRegisterModule = module { 8 | viewModel { FinishSignViewModel(get()) } 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/module/FlowModule.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di.module 2 | 3 | import com.example.project_flow_android.data.remote.flow.FlowApiImpl 4 | import com.example.project_flow_android.data.remote.mypage.MyPageApiImpl 5 | import com.example.project_flow_android.viewmodel.flow.FlowViewModel 6 | import org.koin.androidx.viewmodel.dsl.viewModel 7 | import org.koin.dsl.module 8 | 9 | val flowModule = module { 10 | viewModel { FlowViewModel(get(),get(),get()) } 11 | 12 | single { MyPageApiImpl() } 13 | single { FlowApiImpl() } 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/module/GitInfoModule.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di.module 2 | 3 | import com.example.project_flow_android.data.remote.mypage.MyPageApiImpl 4 | import com.example.project_flow_android.data.remote.sign.LoginApiImpl 5 | import com.example.project_flow_android.viewmodel.calendar.CalendarViewModel 6 | import com.example.project_flow_android.viewmodel.login.LoginViewModelFactory 7 | import org.koin.dsl.module 8 | 9 | val gitinfoModule = module { 10 | single { MyPageApiImpl() } 11 | single { CalendarViewModel(get()) } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/module/LoginModule.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di 2 | 3 | import com.example.project_flow_android.data.remote.sign.LoginApiImpl 4 | import com.example.project_flow_android.viewmodel.login.LoginViewModelFactory 5 | import org.koin.dsl.module 6 | 7 | val loginModule = module { 8 | single { LoginApiImpl() } 9 | single { LoginViewModelFactory(get(),get()) } 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/module/MainModule.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di.module 2 | 3 | import android.app.Application 4 | import com.example.project_flow_android.data.SharedPreferenceStorage 5 | import org.koin.android.ext.koin.androidApplication 6 | import org.koin.dsl.module 7 | 8 | val mainModule = module { 9 | single { SharedPreferenceStorage(androidApplication()) } 10 | 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/module/MyPageModule.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di.module 2 | 3 | import com.example.project_flow_android.data.remote.mypage.MyPageApiImpl 4 | import com.example.project_flow_android.data.remote.sign.SignApiImpl 5 | import com.example.project_flow_android.viewmodel.mypage.ChangePasswordViewModel 6 | import com.example.project_flow_android.viewmodel.mypage.MyPageViewModel 7 | import io.reactivex.rxjava3.core.Single 8 | import org.koin.androidx.viewmodel.dsl.viewModel 9 | import org.koin.dsl.module 10 | 11 | val mypageModule = module { 12 | viewModel { MyPageViewModel(get(), get()) } 13 | 14 | single { MyPageApiImpl() } 15 | 16 | viewModel { ChangePasswordViewModel(get(), get()) } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/module/RegisterModule.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di 2 | 3 | import com.example.project_flow_android.viewmodel.register.RegisterViewModelFactory 4 | import org.koin.dsl.module 5 | 6 | val registerModule = module { 7 | single { RegisterViewModelFactory(get())} 8 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/di/module/SuccessfulModule.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.di.module 2 | 3 | import com.example.project_flow_android.viewmodel.register.FinishSignViewModel 4 | import org.koin.androidx.viewmodel.dsl.viewModel 5 | import org.koin.dsl.module 6 | 7 | val successfulModule = module { 8 | viewModel { FinishSignViewModel(get()) } 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/AddProjectRequest.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | 4 | data class AddProjectRequest( 5 | val projectName: String, 6 | val explanation: String, 7 | val startDate: String, 8 | val endDate: String, 9 | val image : String, 10 | val emails: Array 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/CertificationRequest.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class CertificationRequest(val email:String) 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/GetGitProjectIssue.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class GetGitProjectIssue(val list : ArrayList){ 4 | data class GetGitIssue( 5 | val number : Int, 6 | val title : String, 7 | val user : List 8 | ){ 9 | data class GetUserInfo( 10 | val login : String 11 | ) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/GetMainInfoDetailResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class GetMainInfoDetailResponse( 4 | val id: String, 5 | val name: String, 6 | val logoImage: String, 7 | val startDate: String, 8 | val endDate: String, 9 | val personalProgress: String, 10 | val projectProgress: String, 11 | val remainingDays : String, 12 | val before : List, 13 | val ongoing : List, 14 | val after : List 15 | ) 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/GetMainInfoResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class GetMainInfoResponse(val projects : ArrayList){ 4 | data class GetMainInfoDetailResponse( 5 | val id: String, 6 | val name: String, 7 | val logoImage: String, 8 | val startDate: String, 9 | val endDate: String, 10 | val personalProgress: Float, 11 | val projectProgress: Float, 12 | val remainingDays : String, 13 | val before : List, 14 | val ongoing : List, 15 | val after : List 16 | ) 17 | } 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/GetProjectScheduleDetailResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class GetProjectScheduleDetailResponse( 4 | val planId: String, 5 | val name: String, 6 | val startDate: String, 7 | val endDate: String, 8 | val mainPageUsers: List, 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/GetProjectsId.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class GetProjectsId(val projectId : String) 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/GetUserInfoResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class GetUserInfoResponse(val name:String, val profileImage:String, val projects : List) 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/GetUserTokenRequest.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class GetUserTokenRequest(val token:String) -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/GitInfoResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class GitInfoResponse( 4 | val issueNumber: String, 5 | val issueContent: String, 6 | val issueUser: String, 7 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/GitToken.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class GitToken(val githubToken : String) 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/LoginRequest.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class LoginRequest(val email:String, val password:String) 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/LoginResponse.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class LoginResponse(val accessToken:String,val refreshToken:String) 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/NewPasswordRequest.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class NewPasswordRequest(val password : String) 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/PostCertificationRequest.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class PostCertificationRequest(val code:String) 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/Projects.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class Projects( 4 | val projectName: String, 5 | val logoImage: String, 6 | val startDate: String, 7 | val endDate: String, 8 | val finished: Boolean, 9 | val remainingDays: String, 10 | val personalProgress : String, 11 | val projectProgress: String 12 | ) 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/RegisterRequest.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class RegisterRequest(val name:String,val email:String,val phone_number:String,val password : String) 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/feature/image.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.feature 2 | 3 | data class image(val image : String) 4 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/network/GitAPI.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.network 2 | 3 | import com.example.project_flow_android.feature.GetGitProjectIssue 4 | import io.reactivex.rxjava3.core.Single 5 | import retrofit2.Response 6 | import retrofit2.http.GET 7 | import retrofit2.http.Header 8 | 9 | interface GitAPI { 10 | 11 | @GET("https://api.github.com/{}") 12 | 13 | fun getGitInfo( 14 | @Header("Authorization") token: String 15 | ): Single> 16 | 17 | 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/network/SafeApiRequest.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.network 2 | import com.example.project_flow_android.data.chat.ProjectMemberResponse 3 | import io.reactivex.rxjava3.core.Single 4 | import retrofit2.Response 5 | import java.lang.Exception 6 | 7 | abstract class SafeApiRequest { 8 | suspend fun safeApiCall(result: suspend() -> Response): Response { 9 | val response = result.invoke() 10 | return try { 11 | if(response.isSuccessful){ 12 | Response.success(response.body()) 13 | } else { 14 | Response.error(response.code(), response.errorBody()!!) 15 | } 16 | } catch (e : Exception){ 17 | e.printStackTrace() 18 | Response.error(response.code(), response.errorBody()!!) 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/calendar/CalendarFragment.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.calendar 2 | 3 | import android.os.Bundle 4 | import androidx.fragment.app.Fragment 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import com.example.project_flow_android.R 9 | import com.example.project_flow_android.feature.GitInfoResponse 10 | import kotlinx.android.synthetic.main.fragment_calendar.* 11 | 12 | class 13 | CalendarFragment : Fragment() { 14 | 15 | lateinit var gitRV: GitRVAdapter 16 | val list = mutableListOf() 17 | 18 | private fun initRecyclerView() { 19 | gitRV = GitRVAdapter() 20 | recyclerView.adapter = gitRV 21 | 22 | list.run { 23 | add(GitInfoResponse("#50 ", "이슈 넘버 수정", "By. 이은별")) 24 | add(GitInfoResponse("#49", "변수 이름 수정", "By. 이은별")) 25 | add(GitInfoResponse("#48", "인터페이스 생성", "By. 이은별")) 26 | add(GitInfoResponse("#47", "인증번호 에러", "By. 이은별")) 27 | add(GitInfoResponse("#44", "프로젝트 생성 오류 수정", "By. 이은별")) 28 | add(GitInfoResponse("#43", "회원가입 로직 수정", "By. 안병헌")) 29 | add(GitInfoResponse("#42", "이미지 전송 오류 ", "By. 안병런")) 30 | } 31 | 32 | gitRV.list = list 33 | gitRV.notifyDataSetChanged() 34 | 35 | } 36 | 37 | override fun onCreateView( 38 | inflater: LayoutInflater, container: ViewGroup?, 39 | savedInstanceState: Bundle?, 40 | ): View? { 41 | 42 | return inflater.inflate(R.layout.fragment_calendar, container, false) 43 | } 44 | 45 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 46 | super.onViewCreated(view, savedInstanceState) 47 | // initRecyclerView() 48 | } 49 | 50 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/calendar/GitRVAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.calendar 2 | 3 | import android.app.Activity 4 | import android.content.Context 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import android.widget.ImageView 9 | import android.widget.TextView 10 | import androidx.recyclerview.widget.RecyclerView 11 | import com.example.project_flow_android.R 12 | import com.example.project_flow_android.feature.GitInfoResponse 13 | import com.example.project_flow_android.ui.chat.InviteRVAdapter 14 | import gun0912.tedimagepicker.util.ToastUtil.context 15 | 16 | class GitRVAdapter: RecyclerView.Adapter() { 17 | 18 | var list = mutableListOf() 19 | 20 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 21 | val view = LayoutInflater.from(parent.context).inflate(R.layout.user_git_issue_item, parent, false) 22 | return ViewHolder(view) 23 | } 24 | 25 | override fun getItemCount(): Int = list.size 26 | 27 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 28 | holder.bind(list[position]) 29 | } 30 | 31 | inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { 32 | 33 | private val txtName: TextView = view.findViewById(R.id.git_num) 34 | private val txtAge: TextView = view.findViewById(R.id.git_content) 35 | private val imgProfile: TextView = view.findViewById(R.id.git_user) 36 | 37 | fun bind(item: GitInfoResponse) { 38 | txtName.text = item.issueNumber 39 | txtAge.text = item.issueContent 40 | imgProfile.text = item.issueUser 41 | 42 | } 43 | } 44 | 45 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/chat/ChatActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.chat 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import android.os.Bundle 5 | import androidx.fragment.app.Fragment 6 | import com.example.project_flow_android.R 7 | import com.example.project_flow_android.ui.chat.fragment.ChatFragment 8 | 9 | class ChatActivity : AppCompatActivity() { 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setContentView(R.layout.activity_chat) 14 | 15 | val fragmentTransaction = supportFragmentManager.beginTransaction() 16 | fragmentTransaction.replace(R.id.chat_frame_container, ChatFragment()).commit() 17 | } 18 | 19 | fun replace(fragment: Fragment) { 20 | val fragmentTransaction = supportFragmentManager.beginTransaction() 21 | fragmentTransaction.setCustomAnimations(R.anim.from_bottom, R.anim.to_top, R.anim.from_top, R.anim.to_bottom) 22 | .addToBackStack(null) 23 | fragmentTransaction.replace(R.id.chat_frame_container, fragment).commit() 24 | } 25 | 26 | fun popBackStack(fragment: Fragment){ 27 | val fragmentManager = this.supportFragmentManager 28 | fragmentManager.beginTransaction().remove(fragment).commit() 29 | fragmentManager.popBackStack() 30 | } 31 | 32 | override fun onDestroy() { 33 | super.onDestroy() 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/chat/CreateRVAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.chat 2 | 3 | import android.app.Activity 4 | import android.net.Uri 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import androidx.recyclerview.widget.RecyclerView 9 | import com.bumptech.glide.Glide 10 | import com.example.project_flow_android.R 11 | import com.example.project_flow_android.data.chat.ProjectMemberResponse 12 | import kotlinx.android.synthetic.main.chat_create_user_item.view.* 13 | import kotlinx.android.synthetic.main.chat_item_other.view.* 14 | 15 | class CreateRVAdapter(private val activity: Activity, private val items : ProjectMemberResponse) : RecyclerView.Adapter() { 16 | 17 | interface OnItemClickListener{ 18 | fun onItemClick(v: View, position: Int) 19 | } 20 | private var itemClickListener: OnItemClickListener? = null 21 | 22 | fun setOnItemClickListener(itemClickListener: OnItemClickListener){ 23 | this.itemClickListener = itemClickListener 24 | } 25 | 26 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 27 | val inflateView = LayoutInflater.from(parent.context).inflate(R.layout.chat_create_user_item, parent, false) 28 | return ViewHolder(inflateView) 29 | } 30 | 31 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 32 | if(holder is ViewHolder){ 33 | holder.apply { 34 | bind(items.responses[position]) 35 | } 36 | } 37 | } 38 | 39 | override fun getItemCount() = items.responses.size 40 | 41 | inner class ViewHolder(v: View) : RecyclerView.ViewHolder(v){ 42 | val view = v 43 | fun bind(item: ProjectMemberResponse.User){ 44 | view.create_user_item_name_tv.text = item.name 45 | if(item.profileImage != null){ 46 | view.create_user_item_iv.clipToOutline = true 47 | Glide.with(activity).load(Uri.parse(item.profileImage)).into(view.create_user_item_iv) 48 | } 49 | val position = absoluteAdapterPosition 50 | if(position != RecyclerView.NO_POSITION){ 51 | itemView.setOnClickListener{ 52 | itemClickListener?.onItemClick(itemView, position) 53 | } 54 | } 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/chat/InviteRVAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.chat 2 | 3 | import android.app.Activity 4 | import android.net.Uri 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import androidx.recyclerview.widget.RecyclerView 9 | import com.bumptech.glide.Glide 10 | import com.example.project_flow_android.R 11 | import com.example.project_flow_android.data.model.sign.chat.NonParticipateResponse 12 | import kotlinx.android.synthetic.main.chat_create_user_item.view.* 13 | 14 | class InviteRVAdapter(private val activity: Activity, private val items: NonParticipateResponse) : RecyclerView.Adapter() { 15 | 16 | interface OnItemClickListener{ 17 | fun onItemClick(v: View, position: Int) 18 | } 19 | 20 | private var itemClickListener: InviteRVAdapter.OnItemClickListener? = null 21 | 22 | fun setOnItemClickListener(itemClickListener: InviteRVAdapter.OnItemClickListener){ 23 | this.itemClickListener = itemClickListener 24 | } 25 | 26 | 27 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 28 | val inflateView = LayoutInflater.from(parent.context).inflate(R.layout.chat_create_user_item, parent,false) 29 | return ViewHolder(inflateView) 30 | } 31 | 32 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 33 | if(holder is ViewHolder){ 34 | holder.apply { 35 | bind(items.responses[position]) 36 | } 37 | } 38 | } 39 | 40 | override fun getItemCount(): Int = items.responses.size 41 | 42 | inner class ViewHolder(v: View) : RecyclerView.ViewHolder(v){ 43 | val view = v 44 | fun bind(item : NonParticipateResponse.NonUserList){ 45 | view.create_user_item_name_tv.text = item.name 46 | if(item.profileImage != null){ 47 | view.create_user_item_iv.clipToOutline = true 48 | Glide.with(activity).load(Uri.parse(item.profileImage)).into(view.create_user_item_iv) 49 | } 50 | 51 | val position = absoluteAdapterPosition 52 | if(position != RecyclerView.NO_POSITION){ 53 | itemView.setOnClickListener{ 54 | itemClickListener?.onItemClick(itemView, position) 55 | } 56 | } 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/chat/ManageRVAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.chat 2 | 3 | import android.app.Activity 4 | import android.net.Uri 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import androidx.recyclerview.widget.RecyclerView 9 | import com.bumptech.glide.Glide 10 | import com.example.project_flow_android.R 11 | import com.example.project_flow_android.data.model.sign.chat.RoomMemberResponse 12 | import kotlinx.android.synthetic.main.manage_item.view.* 13 | 14 | class ManageRVAdapter(private val items: RoomMemberResponse, private val activity: Activity) : RecyclerView.Adapter() { 15 | 16 | interface OnItemClickListener{ 17 | fun onItemClick(v: View, position: Int) 18 | } 19 | 20 | private var itemClickListener : OnItemClickListener? = null 21 | 22 | fun setOnItemClickListener(itemClickListener: OnItemClickListener){ 23 | this.itemClickListener = itemClickListener 24 | } 25 | 26 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 27 | val inflateView = LayoutInflater.from(parent.context).inflate(R.layout.manage_item, parent, false) 28 | return ViewHolder(inflateView) 29 | } 30 | 31 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 32 | if(holder is ViewHolder){ 33 | holder.apply { 34 | bind(items.responses[position]) 35 | } 36 | } 37 | } 38 | 39 | override fun getItemCount() = items.responses.size 40 | 41 | inner class ViewHolder(v : View) : RecyclerView.ViewHolder(v) { 42 | val view = v 43 | fun bind(item: RoomMemberResponse.MemberResponse){ 44 | if(item.profileImage != null){ 45 | view.manage_item_profile_iv.clipToOutline = true 46 | Glide.with(activity).load(Uri.parse(item.profileImage)).into(view.manage_item_profile_iv) 47 | } 48 | view.manage_item_name_tv.text = item.name 49 | 50 | val position = absoluteAdapterPosition 51 | if(position != RecyclerView.NO_POSITION){ 52 | itemView.setOnClickListener{ 53 | itemClickListener?.onItemClick(itemView, position) 54 | } 55 | } 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/chat/RoomRVAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.chat 2 | 3 | import android.app.Activity 4 | import android.net.Uri 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import androidx.recyclerview.widget.RecyclerView 9 | import com.bumptech.glide.Glide 10 | import com.example.project_flow_android.R 11 | import com.example.project_flow_android.data.chat.RoomListResponse 12 | import kotlinx.android.synthetic.main.chat_list_item.view.* 13 | 14 | class RoomRVAdapter(private val items : RoomListResponse, private val activity: Activity) : RecyclerView.Adapter() { 15 | 16 | interface OnItemClickListener{ 17 | fun onItemClick(v: View, position: Int) 18 | } 19 | private var itemClickListener: OnItemClickListener? = null 20 | 21 | fun setOnItemClickListener(itemClickListener: OnItemClickListener){ 22 | this.itemClickListener = itemClickListener 23 | } 24 | 25 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 26 | val inflateView = LayoutInflater.from(parent.context).inflate(R.layout.chat_list_item, parent, false) 27 | return ViewHolder(inflateView) 28 | } 29 | 30 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 31 | if(holder is ViewHolder) 32 | holder.apply { 33 | bind(items.responses[position]) 34 | } 35 | } 36 | 37 | override fun getItemCount() = items.responses.size 38 | 39 | inner class ViewHolder(v : View) : RecyclerView.ViewHolder(v){ 40 | val view = v 41 | fun bind(item : RoomListResponse.ChatRoomResponse){ 42 | if(item.chatRoomImage != null){ 43 | view.chat_list_iv.clipToOutline = true 44 | Glide.with(activity).load(Uri.parse(item.chatRoomImage)).into(view.chat_list_iv) 45 | } 46 | view.chat_list_name_tv.text = item.chatRoomName 47 | 48 | val position = absoluteAdapterPosition 49 | if(position != RecyclerView.NO_POSITION){ 50 | itemView.setOnClickListener{ 51 | itemClickListener?.onItemClick(itemView, position) 52 | } 53 | } 54 | } 55 | } 56 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/chat/ScheduleRVAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.chat 2 | 3 | import android.view.LayoutInflater 4 | import android.view.View 5 | import android.view.ViewGroup 6 | import androidx.recyclerview.widget.RecyclerView 7 | import com.example.project_flow_android.R 8 | import com.example.project_flow_android.data.model.sign.chat.DatePlanResponse 9 | import kotlinx.android.synthetic.main.schedule_item.view.* 10 | 11 | class ScheduleRVAdapter(private val items: DatePlanResponse) : RecyclerView.Adapter() { 12 | 13 | interface OnItemClickListener{ 14 | fun onItemClick(v: View, position: Int) 15 | } 16 | 17 | private var onItemClickListener : OnItemClickListener? = null 18 | 19 | fun setOnItemClickListener(onItemClickListener: OnItemClickListener){ 20 | this.onItemClickListener = onItemClickListener 21 | } 22 | 23 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 24 | val inflateView = LayoutInflater.from(parent.context).inflate(R.layout.schedule_item, parent, false) 25 | return ViewHolder(inflateView) 26 | } 27 | 28 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 29 | if(holder is ViewHolder){ 30 | holder.apply { 31 | bind(items.planDetails[position]) 32 | } 33 | } 34 | } 35 | 36 | override fun getItemCount(): Int = items.planDetails.size 37 | 38 | inner class ViewHolder(v : View) : RecyclerView.ViewHolder(v){ 39 | val view = v 40 | fun bind(item: DatePlanResponse.DateResponse){ 41 | view.schedule_plan_tv.text = item.name 42 | if(item.isFinish){ 43 | view.schedule_iv.setImageResource(R.drawable.ic_baseline_circle_24_finish) 44 | } 45 | 46 | val position = absoluteAdapterPosition 47 | if(position != RecyclerView.NO_POSITION){ 48 | itemView.setOnClickListener{ 49 | onItemClickListener?.onItemClick(itemView, position) 50 | } 51 | } 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/chat/UserProjectRVAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.chat 2 | 3 | import android.app.Activity 4 | import android.net.Uri 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import androidx.recyclerview.widget.RecyclerView 9 | import com.bumptech.glide.Glide 10 | import com.example.project_flow_android.R 11 | import com.example.project_flow_android.data.model.sign.chat.UserProfileResponse 12 | import kotlinx.android.synthetic.main.user_info_item.view.* 13 | 14 | class UserProjectRVAdapter(private val items: UserProfileResponse, private val activity: Activity) : 15 | RecyclerView.Adapter() { 16 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 17 | val inflateView = 18 | LayoutInflater.from(parent.context).inflate(R.layout.user_info_item, parent, false) 19 | return ViewHolder(inflateView) 20 | } 21 | 22 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 23 | if(holder is ViewHolder){ 24 | holder.apply { 25 | bind(items.projectResponses[position]) 26 | } 27 | } 28 | } 29 | 30 | override fun getItemCount() = items.projectResponses.size 31 | 32 | inner class ViewHolder(v: View) : RecyclerView.ViewHolder(v) { 33 | val view = v 34 | fun bind(item: UserProfileResponse.ProjectResponse) { 35 | if (item.projectImage != null) { 36 | view.user_info_item_profile_iv.clipToOutline = true 37 | Glide.with(activity).load(Uri.parse(item.projectImage)) 38 | .into(view.user_info_item_profile_iv) 39 | } 40 | view.user_info_item_name_tv.text = item.projectName 41 | view.user_info_term_tv.text = "${item.projectStartDate} ~ ${item.projectEndDate}" 42 | if(item.finished){ 43 | view.user_info_success_tv.text = activity.getString(R.string.user_info_finish) 44 | } else { 45 | view.user_info_success_tv.text = activity.getString(R.string.user_info_fail) 46 | view.user_info_success_tv.background = activity.getDrawable(R.drawable.user_info_fail_radius) 47 | } 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/chat/fragment/UserInfoFragment.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.chat.fragment 2 | 3 | import android.net.Uri 4 | import android.os.Bundle 5 | import androidx.fragment.app.Fragment 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | import androidx.recyclerview.widget.LinearLayoutManager 10 | import com.bumptech.glide.Glide 11 | import com.example.project_flow_android.R 12 | import com.example.project_flow_android.data.model.sign.chat.UserProfileResponse 13 | import com.example.project_flow_android.ui.chat.ChatActivity 14 | import com.example.project_flow_android.ui.chat.UserProjectRVAdapter 15 | import com.example.project_flow_android.viewmodel.chat.ChatViewModel 16 | import kotlinx.android.synthetic.main.fragment_user_info.* 17 | import org.koin.androidx.viewmodel.ext.android.viewModel 18 | 19 | class UserInfoFragment : Fragment() { 20 | 21 | private val chatViewModel: ChatViewModel by viewModel() 22 | 23 | override fun onCreateView( 24 | inflater: LayoutInflater, container: ViewGroup?, 25 | savedInstanceState: Bundle?, 26 | ): View? { 27 | // Inflate the layout for this fragment 28 | return inflater.inflate(R.layout.fragment_user_info, container, false) 29 | } 30 | 31 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 32 | super.onViewCreated(view, savedInstanceState) 33 | 34 | val bundle = arguments 35 | if(bundle != null){ 36 | val userId = bundle.getString("userId") 37 | chatViewModel.getUserProfile(userId!!) 38 | } 39 | 40 | val layoutManager = LinearLayoutManager(requireContext()) 41 | user_info_rv.layoutManager = layoutManager 42 | 43 | chatViewModel.userProfileLiveData.observe(viewLifecycleOwner, { 44 | val userInfo = chatViewModel.userProfileLiveData.value!! 45 | val adapter = 46 | UserProjectRVAdapter(userInfo, requireActivity()) 47 | user_info_rv.adapter = adapter 48 | bind(userInfo) 49 | }) 50 | 51 | user_info_prev_iv.setOnClickListener{ 52 | (activity as ChatActivity).popBackStack(UserInfoFragment()) 53 | } 54 | } 55 | 56 | private fun bind(userInfo: UserProfileResponse) { 57 | if(userInfo.profileImage != null){ 58 | user_info_iv.clipToOutline = true 59 | Glide.with(requireActivity()).load(Uri.parse(userInfo.profileImage)).into(user_info_iv) 60 | } 61 | user_info_name_tv.text = userInfo.userName 62 | user_info_tel_tv.text = userInfo.phoneNumber 63 | } 64 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/flow/AddProjectActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.flow 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import android.widget.Toast 6 | import com.example.project_flow_android.R 7 | import com.example.project_flow_android.base.BaseActivity 8 | import com.example.project_flow_android.data.remote.toRealPath 9 | import com.example.project_flow_android.databinding.ActivityAddProjectBinding 10 | import com.example.project_flow_android.ui.main.MainActivity 11 | import com.example.project_flow_android.viewmodel.flow.AddProjectViewModel 12 | import gun0912.tedimagepicker.builder.TedRxImagePicker 13 | import org.koin.androidx.viewmodel.ext.android.viewModel 14 | 15 | class AddProjectActivity : BaseActivity(R.layout.activity_add_project) { 16 | 17 | override val vm: AddProjectViewModel by viewModel() 18 | 19 | private fun getImage() { 20 | TedRxImagePicker.with(this) 21 | .start() 22 | .subscribe({ uri -> 23 | val imagePath = uri.toRealPath(this) 24 | vm.imagePath = imagePath 25 | binding.getImg.setImageURI(uri) 26 | vm.getImage2() 27 | }, Throwable::printStackTrace) 28 | } 29 | 30 | override fun onCreate(savedInstanceState: Bundle?) { 31 | super.onCreate(savedInstanceState) 32 | observeEvent() 33 | 34 | } 35 | 36 | private fun observeEvent() { 37 | vm.run { 38 | successAddProject.observe(this@AddProjectActivity, { 39 | if (successAddProject.value == true) { 40 | Toast.makeText(this@AddProjectActivity,"프로젝트 생성에 성공하였습니다",Toast.LENGTH_SHORT).show() 41 | finish() 42 | } 43 | }) 44 | binding.getImg.setOnClickListener { 45 | getImage() 46 | } 47 | binding.goProjectImg.setOnClickListener { 48 | finish() 49 | } 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/flow/AddProjectFragment.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.flow 2 | 3 | import com.example.project_flow_android.R 4 | import com.example.project_flow_android.base.BaseFragment 5 | import com.example.project_flow_android.data.remote.toRealPath 6 | import com.example.project_flow_android.databinding.FragmentAddProjectBinding 7 | import com.example.project_flow_android.ui.main.MainActivity 8 | import com.example.project_flow_android.viewmodel.flow.AddProjectViewModel 9 | import gun0912.tedimagepicker.builder.TedRxImagePicker 10 | import org.koin.androidx.viewmodel.ext.android.viewModel 11 | 12 | class AddProjectFragment{ 13 | 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/flow/FinishProjectRVAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.flow 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.example.project_flow_android.databinding.UserProjectFinishItemBinding 7 | import com.example.project_flow_android.databinding.UserProjectOningItemBinding 8 | import com.example.project_flow_android.databinding.UserProjectPlanItemBinding 9 | import com.example.project_flow_android.feature.GetMainInfoDetailResponse 10 | import com.example.project_flow_android.feature.GetMainInfoResponse 11 | import com.example.project_flow_android.feature.GetProjectScheduleDetailResponse 12 | import com.example.project_flow_android.feature.Projects 13 | import com.example.project_flow_android.viewmodel.flow.FlowViewModel 14 | 15 | class FinishProjectRVAdapter( 16 | private val viewModel: FlowViewModel 17 | ) : 18 | RecyclerView.Adapter() { 19 | 20 | private var projectList = ArrayList() 21 | 22 | inner class ProjectViewHolder(private val binding: UserProjectFinishItemBinding) : 23 | RecyclerView.ViewHolder(binding.root) { 24 | 25 | fun bind(item: GetProjectScheduleDetailResponse, position: Int) { 26 | binding.scheduleContent = item.name 27 | binding.scheduleStartPeriod = 28 | "${item.startDate} ~ ${item.endDate}" 29 | binding.vm = viewModel 30 | binding.notifyChange() 31 | } 32 | } 33 | 34 | fun setItem(projects: List) { 35 | this.projectList = projects as ArrayList 36 | notifyDataSetChanged() 37 | } 38 | 39 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProjectViewHolder { 40 | val binding = UserProjectFinishItemBinding.inflate(LayoutInflater.from(parent.context),parent,false) 41 | return ProjectViewHolder(binding) 42 | } 43 | 44 | 45 | override fun getItemCount(): Int { 46 | return projectList.size 47 | } 48 | 49 | override fun onBindViewHolder(holder: ProjectViewHolder, position: Int) { 50 | holder.bind(projectList[position], position) 51 | } 52 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/flow/FlowActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.flow 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import android.os.Bundle 5 | import androidx.fragment.app.Fragment 6 | import com.example.project_flow_android.R 7 | import com.example.project_flow_android.network.SocketApplication 8 | import com.example.project_flow_android.ui.chat.fragment.ChatListFragment 9 | import com.example.project_flow_android.viewmodel.chat.ChatViewModel 10 | import com.example.project_flow_android.viewmodel.flow.FlowViewModel 11 | import org.koin.androidx.viewmodel.ext.android.viewModel 12 | 13 | class FlowActivity : AppCompatActivity() -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/flow/PreparingProjectRVAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.flow 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.example.project_flow_android.databinding.UserProjectPlanItemBinding 7 | import com.example.project_flow_android.feature.GetProjectScheduleDetailResponse 8 | import com.example.project_flow_android.viewmodel.flow.FlowViewModel 9 | 10 | class PreparingProjectRVAdapter( 11 | private val viewModel: FlowViewModel 12 | ) : 13 | RecyclerView.Adapter() { 14 | 15 | private var projectList = ArrayList() 16 | 17 | lateinit var id: String 18 | 19 | inner class ProjectViewHolder(private val binding: UserProjectPlanItemBinding) : 20 | RecyclerView.ViewHolder(binding.root) { 21 | 22 | fun bind(item: GetProjectScheduleDetailResponse, position: Int) { 23 | binding.scheduleContent = item.name 24 | binding.scheduleStartPeriod = 25 | "${item.startDate} ~ ${item.endDate}" 26 | binding.vm = viewModel 27 | binding.notifyChange() 28 | } 29 | } 30 | 31 | fun setItem(projects: List, id: String) { 32 | this.id = id 33 | this.projectList = projects as ArrayList 34 | notifyDataSetChanged() 35 | } 36 | 37 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProjectViewHolder { 38 | val binding = 39 | UserProjectPlanItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) 40 | return ProjectViewHolder(binding) 41 | } 42 | 43 | override fun onBindViewHolder(holder: ProjectViewHolder, position: Int) { 44 | holder.bind(projectList[position], position) 45 | } 46 | 47 | override fun getItemCount(): Int { 48 | return projectList.size 49 | } 50 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/flow/dialog/FinishPlanDialog.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.flow.dialog 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import android.widget.Toast 6 | import com.example.project_flow_android.R 7 | import com.example.project_flow_android.base.BaseDialog 8 | import com.example.project_flow_android.databinding.DialogClosingPlanBinding 9 | import com.example.project_flow_android.databinding.DialogFinishProjectBinding 10 | import com.example.project_flow_android.databinding.UserProjectOningItemBinding 11 | import com.example.project_flow_android.viewmodel.flow.FlowViewModel 12 | import kotlinx.android.synthetic.main.dialog_finish_project.* 13 | 14 | class FinishPlanDialog(override val vm: FlowViewModel) : 15 | BaseDialog(R.layout.dialog_closing_plan) { 16 | 17 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 18 | super.onViewCreated(view, savedInstanceState) 19 | binding.run { 20 | inputScheduleContentTv.text = vm?.planItemContent?.value!! 21 | closingScheduleBtn.setOnClickListener { 22 | vm?.finishPlan() 23 | dismiss() 24 | } 25 | vm?.successPlanRemove?.observe(viewLifecycleOwner, { 26 | if (vm?.successPlanRemove?.value == true) { 27 | Toast.makeText(requireActivity(), "일정 마감이 완료되었습니다", Toast.LENGTH_SHORT).show() 28 | dismiss() 29 | } 30 | }) 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/flow/dialog/FinishProjectDialog.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.flow.dialog 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import com.example.project_flow_android.R 8 | import com.example.project_flow_android.base.BaseDialog 9 | import com.example.project_flow_android.databinding.DialogChangepasswordBinding 10 | import com.example.project_flow_android.databinding.DialogFinishProjectBinding 11 | import com.example.project_flow_android.viewmodel.flow.FlowViewModel 12 | 13 | class FinishProjectDialog(override val vm: FlowViewModel) : 14 | BaseDialog(R.layout.dialog_finish_project) { 15 | 16 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 17 | super.onViewCreated(view, savedInstanceState) 18 | binding.run { 19 | textView12.text = vm?.clickFinish?.value?.name 20 | cancleTv.setOnClickListener { 21 | vm?.finishProject() 22 | dismiss() 23 | } 24 | confirmTv.setOnClickListener { 25 | dismiss() 26 | } 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/mypage/HorizontalItemDecorator.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.mypage 2 | 3 | import android.graphics.Rect 4 | import android.view.View 5 | import androidx.recyclerview.widget.RecyclerView 6 | 7 | class HorizontalItemDecorator(private val divHeight : Int) : RecyclerView.ItemDecoration() { 8 | 9 | @Override 10 | override fun getItemOffsets(outRect: Rect, view: View, parent : RecyclerView, state : RecyclerView.State) { 11 | super.getItemOffsets(outRect, view, parent, state) 12 | outRect.left = divHeight 13 | outRect.right = divHeight 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/mypage/UserProjectRVAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.mypage 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.example.project_flow_android.databinding.UserProjectMypageItemBinding 7 | import com.example.project_flow_android.feature.Projects 8 | import com.example.project_flow_android.viewmodel.mypage.MyPageViewModel 9 | import kotlinx.android.synthetic.main.user_info_item.view.* 10 | 11 | class UserProjectRVAdapter(private val viewModel: MyPageViewModel) : 12 | RecyclerView.Adapter() { 13 | private var userProjectList = ArrayList() 14 | 15 | inner class ProjectViewHolder(private val binding: UserProjectMypageItemBinding) : 16 | RecyclerView.ViewHolder(binding.root) { 17 | 18 | fun bind(position: Int) { 19 | binding.projectName = userProjectList[position].projectName 20 | binding.projectImage = userProjectList[position].logoImage 21 | binding.projectContent = "${userProjectList[position].startDate} ~ ${userProjectList[position].endDate}" 22 | binding.vm = viewModel 23 | binding.notifyChange() 24 | } 25 | } 26 | 27 | fun setItem(projects: List) { 28 | this.userProjectList = projects as ArrayList 29 | notifyDataSetChanged() 30 | } 31 | 32 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProjectViewHolder { 33 | val binding = UserProjectMypageItemBinding.inflate(LayoutInflater.from(parent.context)) 34 | return ProjectViewHolder(binding) 35 | } 36 | 37 | override fun onBindViewHolder(holder: ProjectViewHolder, position: Int) { 38 | holder.bind(position) 39 | } 40 | 41 | override fun getItemCount(): Int { 42 | return userProjectList.size 43 | } 44 | 45 | 46 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/mypage/VerticalItemDecorator.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.mypage 2 | 3 | import android.graphics.Rect 4 | import android.view.View 5 | import androidx.recyclerview.widget.RecyclerView 6 | 7 | class VerticalItemDecorator(private val divHeight : Int) : RecyclerView.ItemDecoration() { 8 | 9 | @Override 10 | override fun getItemOffsets(outRect: Rect, view: View, parent : RecyclerView, state : RecyclerView.State) { 11 | super.getItemOffsets(outRect, view, parent, state) 12 | outRect.top = divHeight 13 | outRect.bottom = divHeight 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/mypage/dialog/ChangePasswordDialog.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.mypage.dialog 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import android.widget.Toast 6 | import com.example.project_flow_android.R 7 | import com.example.project_flow_android.base.BaseDialog 8 | import com.example.project_flow_android.databinding.DialogChangepasswordBinding 9 | import com.example.project_flow_android.ui.flow.FlowFragment 10 | import com.example.project_flow_android.viewmodel.mypage.ChangePasswordViewModel 11 | import org.koin.androidx.viewmodel.ext.android.viewModel 12 | 13 | class ChangePasswordDialog : 14 | BaseDialog(R.layout.dialog_changepassword) { 15 | override val vm: ChangePasswordViewModel by viewModel() 16 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 17 | super.onViewCreated(view, savedInstanceState) 18 | 19 | vm.run { 20 | binding.cancleTv.setOnClickListener { 21 | dismiss() 22 | } 23 | binding.confirmTv.setOnClickListener { 24 | changePassword() 25 | } 26 | successChange.observe(viewLifecycleOwner, { 27 | if(successChange.value == true){ 28 | Toast.makeText(requireContext(),"비밀번호 변경에 성공하였습니다",Toast.LENGTH_SHORT).show() 29 | dismiss() 30 | } 31 | }) 32 | } 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/mypage/dialog/LogoutDialog.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.mypage.dialog 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import android.widget.Toast 6 | import com.example.project_flow_android.R 7 | import com.example.project_flow_android.base.BaseDialog 8 | import com.example.project_flow_android.databinding.DialogLogoutBinding 9 | import com.example.project_flow_android.ui.main.MainActivity 10 | import com.example.project_flow_android.viewmodel.mypage.MyPageViewModel 11 | 12 | class LogoutDialog(override val vm: MyPageViewModel) : 13 | BaseDialog(R.layout.dialog_logout) { 14 | 15 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 16 | super.onViewCreated(view, savedInstanceState) 17 | 18 | vm.run { 19 | binding.checkLogoutTv.setOnClickListener { 20 | dismiss() 21 | } 22 | binding.checkCancelTv.setOnClickListener { 23 | Toast.makeText(requireContext(),"로그아웃 성공",Toast.LENGTH_SHORT).show() 24 | (requireActivity() as MainActivity).startLogin() 25 | } 26 | } 27 | 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/sign/CertificationActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.sign 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import androidx.lifecycle.ViewModelProvider 6 | import com.example.project_flow_android.R 7 | import com.example.project_flow_android.base.BaseActivity 8 | import com.example.project_flow_android.databinding.ActivityEmailVerifyBinding 9 | import com.example.project_flow_android.viewmodel.certification.CertificationViewModel 10 | import com.example.project_flow_android.viewmodel.certification.CertificationViewModelFactory 11 | import org.koin.android.ext.android.inject 12 | 13 | class CertificationActivity : 14 | BaseActivity(R.layout.activity_email_verify) { 15 | 16 | private val vmFactory by inject() 17 | override val vm: CertificationViewModel by lazy { 18 | ViewModelProvider(this, vmFactory).get(CertificationViewModel::class.java) 19 | } 20 | 21 | override fun onCreate(savedInstanceState: Bundle?) { 22 | super.onCreate(savedInstanceState) 23 | 24 | 25 | successfulCertification() 26 | vm.run { 27 | secondPostCertificationCode.observe(this@CertificationActivity, { 28 | binding.comment3Tv.text = changeComment3.value 29 | }) 30 | postCertification() 31 | firstPostCertificationCode.observe(this@CertificationActivity, { 32 | binding.comment3Tv.text = changeComment3.value 33 | }) 34 | 35 | 36 | } 37 | } 38 | 39 | private fun successfulCertification() { 40 | vm.run { 41 | successfulCertification.observe(this@CertificationActivity, { 42 | if (it) { 43 | val intent = Intent(this@CertificationActivity, FinishSignActivity::class.java) 44 | startActivity(intent) 45 | } 46 | }) 47 | } 48 | } 49 | 50 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/sign/DashBoardActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.sign 2 | 3 | import android.content.Intent 4 | import androidx.appcompat.app.AppCompatActivity 5 | import android.os.Bundle 6 | import android.os.Handler 7 | import com.example.project_flow_android.R 8 | 9 | 10 | class DashBoardActivity : AppCompatActivity() { 11 | 12 | override fun onCreate(savedInstanceState: Bundle?) { 13 | super.onCreate(savedInstanceState) 14 | setContentView(R.layout.activity_dash_borad) 15 | 16 | Handler().postDelayed({ 17 | val intent = Intent(this, RegisterActivity::class.java) 18 | intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION) 19 | startActivity(intent) 20 | finish() 21 | }, DURATION) 22 | 23 | } 24 | companion object { 25 | private const val DURATION : Long = 1500 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/sign/EditPasswordActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.sign 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import androidx.lifecycle.ViewModelProvider 6 | import com.example.project_flow_android.R 7 | import com.example.project_flow_android.base.BaseActivity 8 | import com.example.project_flow_android.databinding.ActivityEditPasswordBinding 9 | import com.example.project_flow_android.viewmodel.register.RegisterViewModel 10 | import com.example.project_flow_android.viewmodel.register.RegisterViewModelFactory 11 | import org.koin.android.ext.android.inject 12 | 13 | class EditPasswordActivity : BaseActivity(R.layout.activity_edit_password){ 14 | 15 | private val vmFactory by inject() 16 | override val vm: RegisterViewModel by lazy { 17 | ViewModelProvider(this, vmFactory).get(RegisterViewModel::class.java) 18 | } 19 | 20 | override fun onCreate(savedInstanceState: Bundle?) { 21 | super.onCreate(savedInstanceState) 22 | 23 | editPassword() 24 | } 25 | 26 | private fun editPassword(){ 27 | vm.run { 28 | finishRegister.observe(this@EditPasswordActivity,{ 29 | if(it){ 30 | val intent = Intent(this@EditPasswordActivity, CertificationActivity::class.java) 31 | startActivity(intent) 32 | } 33 | binding.comment2Tv.text = changeComment2.value 34 | }) 35 | 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/sign/FinishSignActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.sign 2 | 3 | 4 | import android.content.Intent 5 | import android.os.Bundle 6 | import com.example.project_flow_android.R 7 | import com.example.project_flow_android.base.BaseActivity 8 | import com.example.project_flow_android.databinding.ActivityFinishSignBinding 9 | import com.example.project_flow_android.viewmodel.register.FinishSignViewModel 10 | import org.koin.androidx.viewmodel.ext.android.viewModel 11 | 12 | class FinishSignActivity : BaseActivity(R.layout.activity_finish_sign) { 13 | 14 | override val vm: FinishSignViewModel by viewModel() 15 | 16 | override fun onStart() { 17 | super.onStart() 18 | 19 | vm.inputUserName() 20 | } 21 | 22 | override fun onBackPressed() { 23 | // non back press super.onBackPressed() 24 | } 25 | 26 | override fun onCreate(savedInstanceState: Bundle?) { 27 | super.onCreate(savedInstanceState) 28 | 29 | vm.run { 30 | finishRegister.observe(this@FinishSignActivity,{ 31 | if(it) { 32 | binding.usernameTv.text = vm.userName 33 | } 34 | }) 35 | } 36 | 37 | binding.successRegisterBtn.setOnClickListener{ 38 | val intent = Intent(this@FinishSignActivity, LoginActivity::class.java) 39 | startActivity(intent) 40 | } 41 | } 42 | 43 | } 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/sign/LoginActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.sign 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import android.webkit.WebView 6 | import android.webkit.WebViewClient 7 | import androidx.core.view.isInvisible 8 | import androidx.lifecycle.ViewModelProvider 9 | import com.example.project_flow_android.R 10 | import com.example.project_flow_android.base.BaseActivity 11 | import com.example.project_flow_android.databinding.ActivityLoginBinding 12 | import com.example.project_flow_android.ui.main.MainActivity 13 | import com.example.project_flow_android.viewmodel.login.LoginViewModel 14 | import com.example.project_flow_android.viewmodel.login.LoginViewModelFactory 15 | import kotlinx.android.synthetic.main.activity_login.* 16 | import org.koin.android.ext.android.inject 17 | 18 | class LoginActivity : BaseActivity(R.layout.activity_login) { 19 | 20 | private val vmFactory by inject() 21 | override val vm: LoginViewModel by lazy { 22 | ViewModelProvider(this, vmFactory).get(LoginViewModel::class.java) 23 | } 24 | 25 | override fun onCreate(savedInstanceState: Bundle?) { 26 | super.onCreate(savedInstanceState) 27 | successfulLogin() 28 | 29 | } 30 | 31 | private fun successfulLogin() { 32 | vm.run { 33 | successLogin.observe(this@LoginActivity, { 34 | if (it) { 35 | val intent = Intent(this@LoginActivity, MainActivity::class.java) 36 | startActivity(intent) 37 | binding.comment2Tv.text = vm.changeComment.value 38 | } 39 | 40 | binding.oauthBtn.setOnClickListener{ 41 | val intent = Intent(this@LoginActivity,LoginOauthActivity::class.java) 42 | startActivity(intent) 43 | } 44 | binding.comment2Tv.text = vm.changeComment.value 45 | }) 46 | 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/sign/LoginOauthActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.sign 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import android.os.Bundle 5 | import android.webkit.WebView 6 | import android.webkit.WebViewClient 7 | import androidx.core.view.isInvisible 8 | import androidx.lifecycle.ViewModelProvider 9 | import com.example.project_flow_android.R 10 | import com.example.project_flow_android.base.BaseActivity 11 | import com.example.project_flow_android.databinding.ActivityLoginOauthBinding 12 | import com.example.project_flow_android.viewmodel.login.LoginViewModel 13 | import com.example.project_flow_android.viewmodel.login.LoginViewModelFactory 14 | import org.koin.android.ext.android.inject 15 | 16 | class LoginOauthActivity : BaseActivity(R.layout.activity_login_oauth) { 17 | 18 | private val vmFactory by inject() 19 | override val vm: LoginViewModel by lazy { 20 | ViewModelProvider(this, vmFactory).get(LoginViewModel::class.java) 21 | } 22 | 23 | 24 | override fun onCreate(savedInstanceState: Bundle?) { 25 | super.onCreate(savedInstanceState) 26 | setContentView(R.layout.activity_login_oauth) 27 | getOauth() 28 | 29 | } 30 | 31 | 32 | private fun getOauth() { 33 | binding.webView.visibility 34 | val webView = findViewById(R.id.web_view) 35 | webView.webViewClient = WebViewClient() 36 | webView.loadUrl("http://18.210.203.222:8080/auth/oauth") 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/ui/sign/RegisterActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.ui.sign 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import androidx.lifecycle.ViewModelProvider 6 | import com.example.project_flow_android.R 7 | import com.example.project_flow_android.base.BaseActivity 8 | import com.example.project_flow_android.databinding.ActivityRegisterBinding 9 | import com.example.project_flow_android.viewmodel.register.RegisterViewModel 10 | import com.example.project_flow_android.viewmodel.register.RegisterViewModelFactory 11 | import org.koin.android.ext.android.inject 12 | 13 | class RegisterActivity : BaseActivity(R.layout.activity_register) { 14 | 15 | private val vmFactory by inject() 16 | override val vm: RegisterViewModel by lazy { 17 | ViewModelProvider(this, vmFactory).get(RegisterViewModel::class.java) 18 | } 19 | 20 | override fun onCreate(savedInstanceState: Bundle?) { 21 | super.onCreate(savedInstanceState) 22 | 23 | next() 24 | binding.registerCheckTv.setOnClickListener { 25 | val intent = Intent(this, LoginActivity::class.java) 26 | startActivity(intent) 27 | } 28 | } 29 | 30 | fun next() { 31 | vm.run { 32 | nextRegister.observe(this@RegisterActivity, { 33 | if (it) { 34 | val intent = Intent(this@RegisterActivity, EditPasswordActivity::class.java) 35 | startActivity(intent) 36 | } 37 | 38 | }) 39 | changeComment.observe(this@RegisterActivity, { 40 | binding.commentTv.text = it 41 | }) 42 | } 43 | } 44 | } 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/util/DialogUtil.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.util 2 | 3 | import android.app.Activity 4 | import android.app.DatePickerDialog 5 | import android.content.Context 6 | import android.util.Log 7 | import android.widget.EditText 8 | import com.example.project_flow_android.R 9 | import com.google.android.material.bottomsheet.BottomSheetDialog 10 | import org.aviran.cookiebar2.CookieBar 11 | import java.text.SimpleDateFormat 12 | import java.util.* 13 | 14 | class DialogUtil(private val activity: Activity) { 15 | fun showDatePicker(editText: EditText){ 16 | val calendar = Calendar.getInstance() 17 | val year = calendar.get(Calendar.YEAR) 18 | val month = calendar.get(Calendar.MONTH) 19 | val day = calendar.get(Calendar.DAY_OF_MONTH) 20 | 21 | val datePicker = DatePickerDialog(activity, R.style.DatePickerStyle, 22 | { view, year, month, dayOfMonth -> 23 | if(dayOfMonth < 10){ 24 | editText.setText("${year}년 ${month+1}월 0${dayOfMonth}일") 25 | } else { 26 | editText.setText("${year}년 ${month+1}월 ${dayOfMonth}일") 27 | } 28 | }, year, month, day) 29 | datePicker.show() 30 | } 31 | 32 | fun showBottomSheet() : BottomSheetDialog{ 33 | val bottom = BottomSheetDialog(activity) 34 | bottom.setContentView(R.layout.add_schedule_bottom) 35 | return bottom 36 | } 37 | 38 | fun showScheduleBottomSheet() : BottomSheetDialog{ 39 | val bottom = BottomSheetDialog(activity) 40 | bottom.setContentView(R.layout.dialog_closing_plan) 41 | return bottom 42 | } 43 | 44 | fun cookieBarBuilder( 45 | title: Int, 46 | message: String?, 47 | res_message: Int?, 48 | backgroundColor: Int, 49 | ) { 50 | if (message != null) { 51 | CookieBar.build(activity) 52 | .setTitle(title) 53 | .setMessage(message) 54 | .setTitleColor(R.color.white) 55 | .setBackgroundColor(backgroundColor) 56 | .show() 57 | } else { 58 | CookieBar.build(activity) 59 | .setTitle(title) 60 | .setMessage(res_message!!) 61 | .setTitleColor(R.color.white) 62 | .setBackgroundColor(backgroundColor) 63 | .show() 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/util/Event.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.util 2 | 3 | open class Event(private val content: T) { 4 | var hasBeenHandled = false 5 | private set 6 | 7 | fun getContentIfNotHandled(): T? { 8 | return if (hasBeenHandled) { 9 | null 10 | } else { 11 | hasBeenHandled = true 12 | content 13 | } 14 | } 15 | 16 | fun peekContent(): T = content 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/util/GalleryHelper.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.util 2 | 3 | import android.Manifest 4 | import android.app.Activity 5 | import android.content.Intent 6 | import android.content.pm.PackageManager 7 | import android.provider.MediaStore 8 | import androidx.activity.result.ActivityResultLauncher 9 | import androidx.core.app.ActivityCompat 10 | import androidx.core.content.ContextCompat 11 | 12 | class GalleryHelper(private val activity : Activity) { 13 | 14 | fun selectPhoto(startForResult: ActivityResultLauncher) { 15 | val writePermission = 16 | ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) 17 | val readPermission = 18 | ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) 19 | 20 | if (writePermission == PackageManager.PERMISSION_DENIED || readPermission == PackageManager.PERMISSION_DENIED) { 21 | ActivityCompat.requestPermissions( 22 | activity, 23 | arrayOf( 24 | Manifest.permission.WRITE_EXTERNAL_STORAGE, 25 | Manifest.permission.READ_EXTERNAL_STORAGE 26 | ), 27 | 0 28 | ) 29 | } 30 | else { 31 | val intent = Intent(Intent.ACTION_PICK) 32 | intent.apply { 33 | data = MediaStore.Images.Media.EXTERNAL_CONTENT_URI 34 | type = "image/*" 35 | putExtra("crop", "true") 36 | } 37 | startForResult.launch(intent) 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/util/HavePlanDecorator.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.util 2 | 3 | import android.graphics.Color 4 | import com.prolificinteractive.materialcalendarview.CalendarDay 5 | import com.prolificinteractive.materialcalendarview.DayViewDecorator 6 | import com.prolificinteractive.materialcalendarview.DayViewFacade 7 | import com.prolificinteractive.materialcalendarview.spans.DotSpan 8 | 9 | class HavePlanDecorator(dates: Collection, isEndDate: Boolean) : DayViewDecorator { 10 | private val mDates = dates 11 | private val isEnd = isEndDate 12 | 13 | override fun shouldDecorate(day: CalendarDay?): Boolean { 14 | return mDates.contains(day) 15 | } 16 | 17 | override fun decorate(view: DayViewFacade?) { 18 | if(isEnd) 19 | view?.addSpan(DotSpan(5F, Color.parseColor("#FF7979"))) 20 | else 21 | view?.addSpan(DotSpan(5F, Color.parseColor("#1F43C2"))) 22 | 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/util/HorizontalItemDecorator.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.util 2 | 3 | import android.graphics.Rect 4 | import android.view.View 5 | import androidx.recyclerview.widget.RecyclerView 6 | 7 | 8 | class HorizontalItemDecorator(private val divHeight : Int) : RecyclerView.ItemDecoration() { 9 | 10 | @Override 11 | override fun getItemOffsets(outRect: Rect, view: View, parent : RecyclerView, state : RecyclerView.State) { 12 | super.getItemOffsets(outRect, view, parent, state) 13 | outRect.left = divHeight 14 | outRect.right = divHeight 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/util/KeyboardUtil.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.util 2 | 3 | import android.content.Context 4 | import android.view.inputmethod.InputMethodManager 5 | import android.widget.EditText 6 | 7 | class KeyboardUtil(context: Context) { 8 | private val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 9 | 10 | fun hideKeyboard(editText: EditText){ 11 | imm.hideSoftInputFromWindow(editText.windowToken, 0) 12 | } 13 | 14 | fun showKeyboard(){ 15 | imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/util/SaturdayDecorator.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.util 2 | 3 | import android.graphics.Color 4 | import android.text.style.ForegroundColorSpan 5 | import com.prolificinteractive.materialcalendarview.CalendarDay 6 | import com.prolificinteractive.materialcalendarview.DayViewDecorator 7 | import com.prolificinteractive.materialcalendarview.DayViewFacade 8 | import java.util.* 9 | 10 | class SaturdayDecorator : DayViewDecorator { 11 | private val calendar = Calendar.getInstance() 12 | 13 | override fun shouldDecorate(day: CalendarDay?): Boolean { 14 | day?.copyTo(calendar) 15 | val weekDay = calendar[Calendar.DAY_OF_WEEK] 16 | return weekDay == Calendar.SATURDAY 17 | } 18 | 19 | override fun decorate(view: DayViewFacade?) { 20 | view?.addSpan(ForegroundColorSpan(Color.BLUE)); 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/util/SundayDecorator.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.util 2 | 3 | import android.graphics.Color 4 | import android.text.style.ForegroundColorSpan 5 | import com.prolificinteractive.materialcalendarview.CalendarDay 6 | import com.prolificinteractive.materialcalendarview.DayViewDecorator 7 | import com.prolificinteractive.materialcalendarview.DayViewFacade 8 | import java.util.* 9 | 10 | class SundayDecorator : DayViewDecorator { 11 | private val calendar = Calendar.getInstance() 12 | 13 | override fun shouldDecorate(day: CalendarDay?): Boolean { 14 | day?.copyTo(calendar) 15 | val weekDay = calendar[Calendar.DAY_OF_WEEK] 16 | return weekDay == Calendar.SUNDAY 17 | } 18 | 19 | override fun decorate(view: DayViewFacade?) { 20 | view?.addSpan(ForegroundColorSpan(Color.RED)); 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/util/VerticalItemDecorator.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.util 2 | 3 | import android.graphics.Rect 4 | import android.view.View 5 | import androidx.recyclerview.widget.RecyclerView 6 | 7 | 8 | class VerticalItemDecorator(private val divHeight : Int) : RecyclerView.ItemDecoration() { 9 | 10 | @Override 11 | override fun getItemOffsets(outRect: Rect, view: View, parent : RecyclerView, state : RecyclerView.State) { 12 | super.getItemOffsets(outRect, view, parent, state) 13 | outRect.top = divHeight 14 | outRect.bottom = divHeight 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/viewmodel/MainViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.viewmodel 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.example.project_flow_android.R 7 | 8 | class MainViewModel :ViewModel(){ 9 | 10 | var activeFragment: Fragment? = null 11 | val tabSelectedItem = MutableLiveData(R.id.menu_flow_it) 12 | 13 | 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/viewmodel/calendar/CalendarViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.viewmodel.calendar 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.example.project_flow_android.data.remote.mypage.MyPageApiImpl 7 | import com.example.project_flow_android.feature.GetGitProjectIssue 8 | import com.example.project_flow_android.feature.GetMainInfoResponse 9 | 10 | class CalendarViewModel(private val myPageApiImpl: MyPageApiImpl) : ViewModel(){ 11 | 12 | private val _getMainInfo = MutableLiveData() 13 | val getMainInfo: LiveData get() = _getMainInfo 14 | 15 | val gitToken = "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" 16 | 17 | fun getGitInfo(){ 18 | myPageApiImpl.getGitInfo(gitToken).subscribe({ it -> 19 | if(it.isSuccessful){ 20 | _getMainInfo.value = it.body() 21 | it 22 | } 23 | }){ 24 | it 25 | } 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/viewmodel/certification/CertificationViewModelFactory.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.viewmodel.certification 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.ViewModelProvider 5 | import com.example.project_flow_android.data.SharedPreferenceStorage 6 | import com.example.project_flow_android.data.remote.sign.CertificationApiImpl 7 | import com.example.project_flow_android.data.remote.sign.SignApiImpl 8 | 9 | class CertificationViewModelFactory( 10 | private val certificationApiImpl : CertificationApiImpl, 11 | private val signApiImpl: SignApiImpl, 12 | private val sharedPrefenceStorage: SharedPreferenceStorage 13 | ) : ViewModelProvider.Factory { 14 | override fun create(modelClass: Class): T = 15 | modelClass.getConstructor(CertificationApiImpl::class.java, 16 | SignApiImpl::class.java, SharedPreferenceStorage::class.java) 17 | .newInstance(certificationApiImpl,signApiImpl, sharedPrefenceStorage) 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/viewmodel/flow/AddProjectViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.viewmodel.flow 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.example.project_flow_android.data.SharedPreferenceStorage 7 | import com.example.project_flow_android.data.remote.flow.FlowApiImpl 8 | import com.example.project_flow_android.feature.AddProjectRequest 9 | import java.io.File 10 | 11 | class AddProjectViewModel( 12 | private val flowApiImpl: FlowApiImpl, 13 | private val sharedPreferenceStorage: SharedPreferenceStorage, 14 | ) : ViewModel() { 15 | 16 | val token by lazy { 17 | sharedPreferenceStorage.getInfo("access_token") 18 | } 19 | 20 | val projectName = MutableLiveData() 21 | val projectExplanation = MutableLiveData() 22 | val projectMember = MutableLiveData() 23 | val startDate = MutableLiveData() 24 | val endDate = MutableLiveData() 25 | 26 | private val _successAddProject = MutableLiveData() 27 | val successAddProject: LiveData get() = _successAddProject 28 | 29 | lateinit var imagePath: String 30 | val responseImage = MutableLiveData() 31 | 32 | fun getImage2() { 33 | flowApiImpl.postImage( 34 | File(imagePath) 35 | ).subscribe({ 36 | if (it.isSuccessful) { 37 | responseImage.value = it.body()!!.image 38 | } else { 39 | it 40 | } 41 | 42 | }, { 43 | it 44 | }) 45 | } 46 | 47 | 48 | fun addProject() { 49 | val member: String = projectMember.value!! 50 | val splitArray: List = member.split(",") 51 | val numArray = splitArray.toTypedArray() 52 | flowApiImpl.addProject2( 53 | token, 54 | AddProjectRequest(projectName.value!!, 55 | projectExplanation.value!!, 56 | startDate.value!!, 57 | endDate.value!!, 58 | responseImage.value!!, 59 | numArray)).subscribe({ 60 | if (it.isSuccessful) { 61 | _successAddProject.value = true 62 | sharedPreferenceStorage.saveInfo( it.body()!!.projectId,"projectId") 63 | it 64 | } else { 65 | it 66 | } 67 | 68 | }, { 69 | it 70 | }) 71 | } 72 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/viewmodel/login/LoginViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.viewmodel.login 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.example.project_flow_android.data.SharedPreferenceStorage 7 | import com.example.project_flow_android.data.remote.sign.LoginApiImpl 8 | import com.example.project_flow_android.feature.LoginRequest 9 | 10 | class LoginViewModel( 11 | private val loginApiImpl: LoginApiImpl, 12 | private val sharedPreferenceStorage: SharedPreferenceStorage 13 | ) : ViewModel() { 14 | 15 | val userEmail = MutableLiveData() 16 | val userPassword = MutableLiveData() 17 | val accessToken = MutableLiveData() 18 | 19 | private val _changeComment = MutableLiveData() 20 | val changeComment: LiveData get() = _changeComment 21 | 22 | private val _successLogin = MutableLiveData(false) 23 | val successLogin: LiveData get() = _successLogin 24 | 25 | fun doLogin() { 26 | loginApiImpl.loginApi(LoginRequest(userEmail.value!!, userPassword.value!!)).subscribe({ 27 | if (it.isSuccessful) { 28 | _successLogin.value = true 29 | sharedPreferenceStorage.saveInfo("userEmail", userEmail.value!!) 30 | sharedPreferenceStorage.saveInfo("userPassword", userPassword.value!!) 31 | sharedPreferenceStorage.saveInfo(it.body()!!.accessToken, "access_token") 32 | sharedPreferenceStorage.saveInfo(it.body()!!.refreshToken, "refresh_token") 33 | } else { 34 | _changeComment.value = "로그인에 실패하였습니다" 35 | } 36 | }, { 37 | _changeComment.value = "로그인 실패하였습니다" 38 | }) 39 | } 40 | } 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/viewmodel/login/LoginViewModelFactory.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.viewmodel.login 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.ViewModelProvider 5 | import com.example.project_flow_android.data.SharedPreferenceStorage 6 | import com.example.project_flow_android.data.remote.sign.LoginApiImpl 7 | 8 | class LoginViewModelFactory( 9 | private val loginApiImpl: LoginApiImpl, 10 | private val sharedPrefenceStorage: SharedPreferenceStorage 11 | ) : ViewModelProvider.Factory { 12 | override fun create(modelClass: Class): T = 13 | modelClass.getConstructor(LoginApiImpl::class.java, SharedPreferenceStorage::class.java) 14 | .newInstance(loginApiImpl, sharedPrefenceStorage) 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/viewmodel/mypage/ChangePasswordViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.viewmodel.mypage 2 | 3 | import android.widget.Toast 4 | import androidx.lifecycle.LiveData 5 | import androidx.lifecycle.MutableLiveData 6 | import androidx.lifecycle.ViewModel 7 | import androidx.lifecycle.viewModelScope 8 | import com.example.project_flow_android.data.SharedPreferenceStorage 9 | import com.example.project_flow_android.data.remote.mypage.MyPageApiImpl 10 | import com.example.project_flow_android.data.remote.sign.SignApiImpl 11 | import com.example.project_flow_android.feature.NewPasswordRequest 12 | import kotlinx.coroutines.* 13 | import retrofit2.Callback 14 | 15 | class ChangePasswordViewModel(val myPageApiImpl: MyPageApiImpl, private val sharedPreferenceStorage: SharedPreferenceStorage):ViewModel() { 16 | 17 | 18 | val token by lazy { 19 | sharedPreferenceStorage.getInfo("access_token") 20 | } 21 | 22 | val changePassword = MutableLiveData() 23 | val _toastContent = MutableLiveData() 24 | private val toastContent : LiveData get() = _toastContent 25 | val successChange: LiveData get() = _successChange 26 | private val _successChange = MutableLiveData(false) 27 | 28 | fun changePassword(){ 29 | myPageApiImpl.changePassword(token, changePassword.value!!).subscribe({ 30 | if(it.isSuccessful){ 31 | _successChange.value = true 32 | _toastContent.value = "변경에 성공하였습니다" 33 | } 34 | else { 35 | } 36 | },{ 37 | }) 38 | _toastContent.value = "새로운 비밀번호를 입력해주세요" 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/viewmodel/register/FinishSignViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.viewmodel.register 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.example.project_flow_android.data.SharedPreferenceStorage 7 | 8 | class FinishSignViewModel(private val sharedPrefenceStorage: SharedPreferenceStorage): ViewModel() { 9 | 10 | private val _finishRegister = MutableLiveData(false) 11 | val finishRegister: LiveData get() = _finishRegister 12 | val userName = sharedPrefenceStorage.getInfo("userName") 13 | 14 | fun inputUserName(){ 15 | _finishRegister.value = true 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/project_flow_android/viewmodel/register/RegisterViewModelFactory.kt: -------------------------------------------------------------------------------- 1 | package com.example.project_flow_android.viewmodel.register 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.ViewModelProvider 5 | import com.example.project_flow_android.data.SharedPreferenceStorage 6 | 7 | class RegisterViewModelFactory( 8 | private val sharedPrefenceStorage: SharedPreferenceStorage 9 | ) : ViewModelProvider.Factory { 10 | override fun create(modelClass: Class): T = 11 | modelClass.getConstructor(SharedPreferenceStorage::class.java) 12 | .newInstance(sharedPrefenceStorage) 13 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/from_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/anim/from_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/anim/to_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/anim/to_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottomsheet_radius.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_blue.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | 9 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/chat_et_radius.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/flow_empty_project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/drawable/flow_empty_project.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/git_button_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/drawable/git_button_img.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/git_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/drawable/git_logo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/graph1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/drawable/graph1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/graph1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/drawable/graph1_1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/graph1_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/drawable/graph1_11.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/drawable/group.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_account_circle_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_add_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_add_25.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_add_circle_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_add_photo_alternate_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_arrow_back_ios_new_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_arrow_forward_ios_24.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_calendar_today_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_chat_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_check_box_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_chevron_left_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_circle_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_circle_24_finish.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_close_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_person_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_usb_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_chat_add.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_chat_photo.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_chat_send.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_chat_view_schedule.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cross.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_current_dot.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dot_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dot_unselected.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_manage_item_arrow.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pin.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/intro_human.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/drawable/intro_human.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/plan_image_radius.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/drawable/pms.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/profile_radius.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/project_radius.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rectangle182.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/drawable/rectangle182.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/drawable/select.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/select_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_indicator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow_test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/user_info_fail_radius.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/user_info_profile_radius.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/user_info_success_radius.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/font/font_nanumgothic_bold.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/font/font_roboto_bold.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/font/font_roboto_regular.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/font/nanum_gothic_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/font/nanum_gothic_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/nanumgothic_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/font/nanumgothic_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/nanumgothic_extrabold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/font/nanumgothic_extrabold.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/nanumgothic_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/font/nanumgothic_regular.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/roboto_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/font/roboto_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/roboto_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/font/roboto_regular.ttf -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_chat.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_flow.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_login_oauth.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 17 | 18 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | 17 | 18 | 29 | 30 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/chat_create_user_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 20 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/chat_item_mine.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 20 | 21 | 32 | 33 | 34 | 35 | 45 | 46 | 57 | 58 | -------------------------------------------------------------------------------- /app/src/main/res/layout/chat_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 20 | 21 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_over_project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 18 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_chat_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 21 | 22 | 32 | 33 | 38 | 39 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_user_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 20 | 21 | 28 | 29 | 37 | 38 | 47 | 48 | 49 | 50 | 54 | 55 | 64 | 65 | 70 | 71 | -------------------------------------------------------------------------------- /app/src/main/res/layout/manage_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 19 | 20 | 21 | 29 | 30 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/layout/mine_image_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 16 | 17 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/other_image_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 28 | 29 | 39 | 40 | 51 | 52 | -------------------------------------------------------------------------------- /app/src/main/res/layout/pin_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/room_exit_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 18 | 19 |