├── .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 |
4 |
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 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/.idea/kotlinc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
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 |
30 |
31 |
42 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/room_status_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/schedule_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
18 |
19 |
30 |
31 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/user_git_issue_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
13 |
14 |
26 |
27 |
33 |
34 |
42 |
43 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/user_info_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
16 |
17 |
23 |
24 |
31 |
32 |
39 |
40 |
41 |
42 |
53 |
54 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/user_project_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
8 |
9 |
18 |
19 |
25 |
26 |
34 |
35 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/user_project_progress.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_bottom_navigation.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_foreground2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/mipmap-hdpi/ic_launcher_foreground2.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_foreground2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/mipmap-mdpi/ic_launcher_foreground2.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground2.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground2.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground2.png
--------------------------------------------------------------------------------
/app/src/main/res/values-night/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 | #1F43C2
11 | #F6F6F6
12 | #D5DCF2
13 | #E9E9E9
14 | #D5DCF2
15 | #D2D9F2
16 | #FF5151
17 | #FF7979
18 | #829EFD
19 | #C4C4C4
20 | #1F43C2
21 | #1F43C2
22 | #FF5151
23 | #F2F2F2
24 |
25 | #F2F2F2
26 | #444444
27 |
28 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimen.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 14dp
4 | 55dp
5 | 23sp
6 | 3dp
7 | 8dp
8 |
--------------------------------------------------------------------------------
/app/src/main/res/values/major_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - Android
5 | - Back-End
6 | - Front-End
7 | - iOS
8 | - AI
9 | - Embedded
10 | - Design
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/values/style.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
13 |
14 |
17 |
18 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
18 |
19 |
23 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/network_security_config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/test/java/com/example/project_flow_android/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.example.project_flow_android
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | buildscript {
3 | ext.kotlin_version = "1.5.21"
4 | ext.koin_version = "3.1.2"
5 |
6 |
7 | repositories {
8 | google()
9 | mavenCentral()
10 | }
11 | dependencies {
12 | classpath "com.android.tools.build:gradle:4.2.2"
13 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
14 | classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
15 | classpath "io.insert-koin:koin-gradle-plugin:$koin_version"
16 |
17 | // NOTE: Do not place your application dependencies here; they belong
18 | // in the individual module build.gradle files
19 | }
20 | }
21 |
22 | allprojects {
23 | repositories {
24 | google()
25 | mavenCentral()
26 | maven { url "https://jitpack.io" }
27 | jcenter() // Warning: this repository is going to shut down soon
28 | maven { url "https://jitpack.io" }
29 | }
30 | }
31 |
32 | task clean(type: Delete) {
33 | delete rootProject.buildDir
34 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app"s APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | android.enableJetifier=true
19 | # Kotlin code style for this project: "official" or "obsolete":
20 | kotlin.code.style=official
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DSM-JAVA-PROJECT/Project-Flow_Android/c7b7dea550ffb7025cb1ffd8abc65e8f701ab0e1/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Tue Aug 10 21:35:25 KST 2021
2 | distributionBase=GRADLE_USER_HOME
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
4 | distributionPath=wrapper/dists
5 | zipStorePath=wrapper/dists
6 | zipStoreBase=GRADLE_USER_HOME
7 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name = "Project-Flow_Android"
2 | include ':app'
3 |
4 |
--------------------------------------------------------------------------------