diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6addf70..6b755c5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,7 +20,8 @@ + android:exported="true" + android:windowSoftInputMode="adjustPan"> @@ -32,14 +33,13 @@ + android:exported="false" + android:windowSoftInputMode="adjustPan" /> - + android:exported="false" /> - \ No newline at end of file diff --git a/app/src/main/assets/mock_repo_list.json b/app/src/main/assets/mock_repo_list.json index d7ce7c8..565ad78 100644 --- a/app/src/main/assets/mock_repo_list.json +++ b/app/src/main/assets/mock_repo_list.json @@ -575,13 +575,13 @@ "deployments_url": "https://api.github.com/repos/leeeha/CS-Study/deployments", "created_at": "2023-03-03T04:58:29Z", "updated_at": "2023-03-03T04:58:29Z", - "pushed_at": "2023-05-10T08:14:05Z", + "pushed_at": "2023-05-25T12:57:56Z", "git_url": "git://github.com/leeeha/CS-Study.git", "ssh_url": "git@github.com:leeeha/CS-Study.git", "clone_url": "https://github.com/leeeha/CS-Study.git", "svn_url": "https://github.com/leeeha/CS-Study", "homepage": null, - "size": 234, + "size": 253, "stargazers_count": 0, "watchers_count": 0, "language": null, @@ -595,7 +595,7 @@ "mirror_url": null, "archived": false, "disabled": false, - "open_issues_count": 0, + "open_issues_count": 2, "license": null, "allow_forking": true, "is_template": false, @@ -603,7 +603,7 @@ "topics": [], "visibility": "public", "forks": 2, - "open_issues": 0, + "open_issues": 2, "watchers": 0, "default_branch": "main" }, @@ -885,13 +885,13 @@ "deployments_url": "https://api.github.com/repos/leeeha/gdsc-seoultech.github.io/deployments", "created_at": "2021-09-14T11:12:49Z", "updated_at": "2022-10-31T11:30:48Z", - "pushed_at": "2023-05-08T08:55:43Z", + "pushed_at": "2023-05-17T14:51:14Z", "git_url": "git://github.com/leeeha/gdsc-seoultech.github.io.git", "ssh_url": "git@github.com:leeeha/gdsc-seoultech.github.io.git", "clone_url": "https://github.com/leeeha/gdsc-seoultech.github.io.git", "svn_url": "https://github.com/leeeha/gdsc-seoultech.github.io", "homepage": "", - "size": 6544, + "size": 6538, "stargazers_count": 0, "watchers_count": 0, "language": "JavaScript", @@ -921,6 +921,106 @@ "watchers": 0, "default_branch": "main" }, + { + "id": 647340972, + "node_id": "R_kgDOJpWjrA", + "name": "Git-Study", + "full_name": "leeeha/Git-Study", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/Git-Study", + "description": null, + "fork": true, + "url": "https://api.github.com/repos/leeeha/Git-Study", + "forks_url": "https://api.github.com/repos/leeeha/Git-Study/forks", + "keys_url": "https://api.github.com/repos/leeeha/Git-Study/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/Git-Study/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/Git-Study/teams", + "hooks_url": "https://api.github.com/repos/leeeha/Git-Study/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/Git-Study/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/Git-Study/events", + "assignees_url": "https://api.github.com/repos/leeeha/Git-Study/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/Git-Study/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/Git-Study/tags", + "blobs_url": "https://api.github.com/repos/leeeha/Git-Study/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/Git-Study/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/Git-Study/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/Git-Study/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/Git-Study/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/Git-Study/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/Git-Study/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/Git-Study/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/Git-Study/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/Git-Study/subscription", + "commits_url": "https://api.github.com/repos/leeeha/Git-Study/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/Git-Study/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/Git-Study/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/Git-Study/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/Git-Study/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/Git-Study/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/Git-Study/merges", + "archive_url": "https://api.github.com/repos/leeeha/Git-Study/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/Git-Study/downloads", + "issues_url": "https://api.github.com/repos/leeeha/Git-Study/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/Git-Study/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/Git-Study/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/Git-Study/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/Git-Study/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/Git-Study/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/Git-Study/deployments", + "created_at": "2023-05-30T15:10:00Z", + "updated_at": "2023-05-30T15:10:00Z", + "pushed_at": "2023-05-30T15:19:01Z", + "git_url": "git://github.com/leeeha/Git-Study.git", + "ssh_url": "git@github.com:leeeha/Git-Study.git", + "clone_url": "https://github.com/leeeha/Git-Study.git", + "svn_url": "https://github.com/leeeha/Git-Study", + "homepage": null, + "size": 1, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": false, + "has_projects": true, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main" + }, { "id": 591167145, "node_id": "R_kgDOIzx-qQ", @@ -1529,5 +1629,1438 @@ "open_issues": 0, "watchers": 0, "default_branch": "main" + }, + { + "id": 564157527, + "node_id": "R_kgDOIaBcVw", + "name": "kotlin-lotto", + "full_name": "leeeha/kotlin-lotto", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/kotlin-lotto", + "description": "로또 미션을 진행하는 저장소", + "fork": true, + "url": "https://api.github.com/repos/leeeha/kotlin-lotto", + "forks_url": "https://api.github.com/repos/leeeha/kotlin-lotto/forks", + "keys_url": "https://api.github.com/repos/leeeha/kotlin-lotto/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/kotlin-lotto/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/kotlin-lotto/teams", + "hooks_url": "https://api.github.com/repos/leeeha/kotlin-lotto/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/kotlin-lotto/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/kotlin-lotto/events", + "assignees_url": "https://api.github.com/repos/leeeha/kotlin-lotto/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/kotlin-lotto/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/kotlin-lotto/tags", + "blobs_url": "https://api.github.com/repos/leeeha/kotlin-lotto/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/kotlin-lotto/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/kotlin-lotto/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/kotlin-lotto/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/kotlin-lotto/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/kotlin-lotto/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/kotlin-lotto/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/kotlin-lotto/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/kotlin-lotto/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/kotlin-lotto/subscription", + "commits_url": "https://api.github.com/repos/leeeha/kotlin-lotto/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/kotlin-lotto/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/kotlin-lotto/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/kotlin-lotto/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/kotlin-lotto/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/kotlin-lotto/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/kotlin-lotto/merges", + "archive_url": "https://api.github.com/repos/leeeha/kotlin-lotto/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/kotlin-lotto/downloads", + "issues_url": "https://api.github.com/repos/leeeha/kotlin-lotto/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/kotlin-lotto/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/kotlin-lotto/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/kotlin-lotto/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/kotlin-lotto/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/kotlin-lotto/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/kotlin-lotto/deployments", + "created_at": "2022-11-10T05:28:58Z", + "updated_at": "2022-11-09T13:37:48Z", + "pushed_at": "2022-11-15T13:00:39Z", + "git_url": "git://github.com/leeeha/kotlin-lotto.git", + "ssh_url": "git@github.com:leeeha/kotlin-lotto.git", + "clone_url": "https://github.com/leeeha/kotlin-lotto.git", + "svn_url": "https://github.com/leeeha/kotlin-lotto", + "homepage": null, + "size": 116, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": false, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main" + }, + { + "id": 557871429, + "node_id": "R_kgDOIUBxRQ", + "name": "kotlin-onboarding", + "full_name": "leeeha/kotlin-onboarding", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/kotlin-onboarding", + "description": "온보딩 미션을 진행하는 저장소", + "fork": true, + "url": "https://api.github.com/repos/leeeha/kotlin-onboarding", + "forks_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/forks", + "keys_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/teams", + "hooks_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/events", + "assignees_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/tags", + "blobs_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/subscription", + "commits_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/merges", + "archive_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/downloads", + "issues_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/kotlin-onboarding/deployments", + "created_at": "2022-10-26T13:14:05Z", + "updated_at": "2022-10-26T12:25:19Z", + "pushed_at": "2022-11-01T11:57:10Z", + "git_url": "git://github.com/leeeha/kotlin-onboarding.git", + "ssh_url": "git@github.com:leeeha/kotlin-onboarding.git", + "clone_url": "https://github.com/leeeha/kotlin-onboarding.git", + "svn_url": "https://github.com/leeeha/kotlin-onboarding", + "homepage": "", + "size": 67, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": false, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main" + }, + { + "id": 444828544, + "node_id": "R_kgDOGoOLgA", + "name": "KotlinDemoApp", + "full_name": "leeeha/KotlinDemoApp", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/KotlinDemoApp", + "description": "간단한 심리테스트 앱 (코틀린 네비게이션)", + "fork": false, + "url": "https://api.github.com/repos/leeeha/KotlinDemoApp", + "forks_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/forks", + "keys_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/teams", + "hooks_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/events", + "assignees_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/tags", + "blobs_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/subscription", + "commits_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/merges", + "archive_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/downloads", + "issues_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/KotlinDemoApp/deployments", + "created_at": "2022-01-05T14:12:37Z", + "updated_at": "2022-01-09T10:07:35Z", + "pushed_at": "2022-01-05T17:38:15Z", + "git_url": "git://github.com/leeeha/KotlinDemoApp.git", + "ssh_url": "git@github.com:leeeha/KotlinDemoApp.git", + "clone_url": "https://github.com/leeeha/KotlinDemoApp.git", + "svn_url": "https://github.com/leeeha/KotlinDemoApp", + "homepage": "", + "size": 207, + "stargazers_count": 0, + "watchers_count": 0, + "language": "Kotlin", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master" + }, + { + "id": 471736342, + "node_id": "R_kgDOHB4gFg", + "name": "leeeha", + "full_name": "leeeha/leeeha", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/leeeha", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/leeeha/leeeha", + "forks_url": "https://api.github.com/repos/leeeha/leeeha/forks", + "keys_url": "https://api.github.com/repos/leeeha/leeeha/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/leeeha/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/leeeha/teams", + "hooks_url": "https://api.github.com/repos/leeeha/leeeha/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/leeeha/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/leeeha/events", + "assignees_url": "https://api.github.com/repos/leeeha/leeeha/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/leeeha/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/leeeha/tags", + "blobs_url": "https://api.github.com/repos/leeeha/leeeha/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/leeeha/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/leeeha/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/leeeha/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/leeeha/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/leeeha/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/leeeha/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/leeeha/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/leeeha/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/leeeha/subscription", + "commits_url": "https://api.github.com/repos/leeeha/leeeha/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/leeeha/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/leeeha/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/leeeha/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/leeeha/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/leeeha/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/leeeha/merges", + "archive_url": "https://api.github.com/repos/leeeha/leeeha/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/leeeha/downloads", + "issues_url": "https://api.github.com/repos/leeeha/leeeha/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/leeeha/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/leeeha/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/leeeha/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/leeeha/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/leeeha/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/leeeha/deployments", + "created_at": "2022-03-19T15:31:57Z", + "updated_at": "2022-06-16T12:08:57Z", + "pushed_at": "2023-05-03T02:42:42Z", + "git_url": "git://github.com/leeeha/leeeha.git", + "ssh_url": "git@github.com:leeeha/leeeha.git", + "clone_url": "https://github.com/leeeha/leeeha.git", + "svn_url": "https://github.com/leeeha/leeeha", + "homepage": null, + "size": 69, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main" + }, + { + "id": 509273422, + "node_id": "R_kgDOHlrlTg", + "name": "MediMedi_Android", + "full_name": "leeeha/MediMedi_Android", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/MediMedi_Android", + "description": "🔥 2022 Google Solution Challenge", + "fork": true, + "url": "https://api.github.com/repos/leeeha/MediMedi_Android", + "forks_url": "https://api.github.com/repos/leeeha/MediMedi_Android/forks", + "keys_url": "https://api.github.com/repos/leeeha/MediMedi_Android/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/MediMedi_Android/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/MediMedi_Android/teams", + "hooks_url": "https://api.github.com/repos/leeeha/MediMedi_Android/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/MediMedi_Android/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/MediMedi_Android/events", + "assignees_url": "https://api.github.com/repos/leeeha/MediMedi_Android/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/MediMedi_Android/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/MediMedi_Android/tags", + "blobs_url": "https://api.github.com/repos/leeeha/MediMedi_Android/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/MediMedi_Android/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/MediMedi_Android/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/MediMedi_Android/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/MediMedi_Android/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/MediMedi_Android/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/MediMedi_Android/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/MediMedi_Android/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/MediMedi_Android/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/MediMedi_Android/subscription", + "commits_url": "https://api.github.com/repos/leeeha/MediMedi_Android/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/MediMedi_Android/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/MediMedi_Android/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/MediMedi_Android/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/MediMedi_Android/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/MediMedi_Android/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/MediMedi_Android/merges", + "archive_url": "https://api.github.com/repos/leeeha/MediMedi_Android/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/MediMedi_Android/downloads", + "issues_url": "https://api.github.com/repos/leeeha/MediMedi_Android/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/MediMedi_Android/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/MediMedi_Android/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/MediMedi_Android/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/MediMedi_Android/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/MediMedi_Android/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/MediMedi_Android/deployments", + "created_at": "2022-07-01T00:36:01Z", + "updated_at": "2023-03-11T03:27:12Z", + "pushed_at": "2022-07-07T08:35:00Z", + "git_url": "git://github.com/leeeha/MediMedi_Android.git", + "ssh_url": "git@github.com:leeeha/MediMedi_Android.git", + "clone_url": "https://github.com/leeeha/MediMedi_Android.git", + "svn_url": "https://github.com/leeeha/MediMedi_Android", + "homepage": "", + "size": 2927, + "stargazers_count": 0, + "watchers_count": 0, + "language": "Kotlin", + "has_issues": false, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "android", + "gdsc", + "google", + "solution-challenge-2022" + ], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master" + }, + { + "id": 475295524, + "node_id": "R_kgDOHFRvJA", + "name": "MediMedi_Spring", + "full_name": "leeeha/MediMedi_Spring", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/MediMedi_Spring", + "description": "MediMedi server - 수빈, (하은, 윤재, 민찬)", + "fork": true, + "url": "https://api.github.com/repos/leeeha/MediMedi_Spring", + "forks_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/forks", + "keys_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/teams", + "hooks_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/events", + "assignees_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/tags", + "blobs_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/subscription", + "commits_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/merges", + "archive_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/downloads", + "issues_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/MediMedi_Spring/deployments", + "created_at": "2022-03-29T05:38:21Z", + "updated_at": "2022-03-29T05:34:00Z", + "pushed_at": "2022-03-29T05:39:31Z", + "git_url": "git://github.com/leeeha/MediMedi_Spring.git", + "ssh_url": "git@github.com:leeeha/MediMedi_Spring.git", + "clone_url": "https://github.com/leeeha/MediMedi_Spring.git", + "svn_url": "https://github.com/leeeha/MediMedi_Spring", + "homepage": null, + "size": 98, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": false, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main" + }, + { + "id": 428286234, + "node_id": "R_kgDOGYchGg", + "name": "MobileProgramming", + "full_name": "leeeha/MobileProgramming", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/MobileProgramming", + "description": "🚀 모바일 프로그래밍 기본 예제 실습", + "fork": false, + "url": "https://api.github.com/repos/leeeha/MobileProgramming", + "forks_url": "https://api.github.com/repos/leeeha/MobileProgramming/forks", + "keys_url": "https://api.github.com/repos/leeeha/MobileProgramming/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/MobileProgramming/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/MobileProgramming/teams", + "hooks_url": "https://api.github.com/repos/leeeha/MobileProgramming/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/MobileProgramming/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/MobileProgramming/events", + "assignees_url": "https://api.github.com/repos/leeeha/MobileProgramming/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/MobileProgramming/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/MobileProgramming/tags", + "blobs_url": "https://api.github.com/repos/leeeha/MobileProgramming/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/MobileProgramming/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/MobileProgramming/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/MobileProgramming/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/MobileProgramming/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/MobileProgramming/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/MobileProgramming/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/MobileProgramming/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/MobileProgramming/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/MobileProgramming/subscription", + "commits_url": "https://api.github.com/repos/leeeha/MobileProgramming/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/MobileProgramming/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/MobileProgramming/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/MobileProgramming/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/MobileProgramming/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/MobileProgramming/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/MobileProgramming/merges", + "archive_url": "https://api.github.com/repos/leeeha/MobileProgramming/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/MobileProgramming/downloads", + "issues_url": "https://api.github.com/repos/leeeha/MobileProgramming/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/MobileProgramming/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/MobileProgramming/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/MobileProgramming/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/MobileProgramming/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/MobileProgramming/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/MobileProgramming/deployments", + "created_at": "2021-11-15T14:00:01Z", + "updated_at": "2022-07-15T12:32:27Z", + "pushed_at": "2021-12-03T06:35:09Z", + "git_url": "git://github.com/leeeha/MobileProgramming.git", + "ssh_url": "git@github.com:leeeha/MobileProgramming.git", + "clone_url": "https://github.com/leeeha/MobileProgramming.git", + "svn_url": "https://github.com/leeeha/MobileProgramming", + "homepage": "", + "size": 1367, + "stargazers_count": 0, + "watchers_count": 0, + "language": "Java", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "android", + "java" + ], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master" + }, + { + "id": 522182048, + "node_id": "R_kgDOHx_doA", + "name": "momentum", + "full_name": "leeeha/momentum", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/momentum", + "description": "🌸 바닐라 JS로 크롬 앱 만들기", + "fork": false, + "url": "https://api.github.com/repos/leeeha/momentum", + "forks_url": "https://api.github.com/repos/leeeha/momentum/forks", + "keys_url": "https://api.github.com/repos/leeeha/momentum/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/momentum/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/momentum/teams", + "hooks_url": "https://api.github.com/repos/leeeha/momentum/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/momentum/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/momentum/events", + "assignees_url": "https://api.github.com/repos/leeeha/momentum/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/momentum/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/momentum/tags", + "blobs_url": "https://api.github.com/repos/leeeha/momentum/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/momentum/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/momentum/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/momentum/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/momentum/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/momentum/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/momentum/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/momentum/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/momentum/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/momentum/subscription", + "commits_url": "https://api.github.com/repos/leeeha/momentum/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/momentum/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/momentum/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/momentum/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/momentum/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/momentum/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/momentum/merges", + "archive_url": "https://api.github.com/repos/leeeha/momentum/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/momentum/downloads", + "issues_url": "https://api.github.com/repos/leeeha/momentum/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/momentum/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/momentum/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/momentum/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/momentum/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/momentum/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/momentum/deployments", + "created_at": "2022-08-07T10:31:43Z", + "updated_at": "2022-08-19T09:15:04Z", + "pushed_at": "2022-09-27T11:12:37Z", + "git_url": "git://github.com/leeeha/momentum.git", + "ssh_url": "git@github.com:leeeha/momentum.git", + "clone_url": "https://github.com/leeeha/momentum.git", + "svn_url": "https://github.com/leeeha/momentum", + "homepage": "", + "size": 1374, + "stargazers_count": 0, + "watchers_count": 0, + "language": "JavaScript", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "nomad-coders", + "vanilla-js", + "web" + ], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master" + }, + { + "id": 506166605, + "node_id": "R_kgDOHit9TQ", + "name": "my-first-web-site", + "full_name": "leeeha/my-first-web-site", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/my-first-web-site", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/leeeha/my-first-web-site", + "forks_url": "https://api.github.com/repos/leeeha/my-first-web-site/forks", + "keys_url": "https://api.github.com/repos/leeeha/my-first-web-site/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/my-first-web-site/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/my-first-web-site/teams", + "hooks_url": "https://api.github.com/repos/leeeha/my-first-web-site/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/my-first-web-site/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/my-first-web-site/events", + "assignees_url": "https://api.github.com/repos/leeeha/my-first-web-site/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/my-first-web-site/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/my-first-web-site/tags", + "blobs_url": "https://api.github.com/repos/leeeha/my-first-web-site/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/my-first-web-site/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/my-first-web-site/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/my-first-web-site/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/my-first-web-site/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/my-first-web-site/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/my-first-web-site/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/my-first-web-site/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/my-first-web-site/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/my-first-web-site/subscription", + "commits_url": "https://api.github.com/repos/leeeha/my-first-web-site/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/my-first-web-site/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/my-first-web-site/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/my-first-web-site/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/my-first-web-site/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/my-first-web-site/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/my-first-web-site/merges", + "archive_url": "https://api.github.com/repos/leeeha/my-first-web-site/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/my-first-web-site/downloads", + "issues_url": "https://api.github.com/repos/leeeha/my-first-web-site/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/my-first-web-site/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/my-first-web-site/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/my-first-web-site/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/my-first-web-site/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/my-first-web-site/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/my-first-web-site/deployments", + "created_at": "2022-06-22T08:44:11Z", + "updated_at": "2022-06-22T08:49:25Z", + "pushed_at": "2022-06-25T13:13:06Z", + "git_url": "git://github.com/leeeha/my-first-web-site.git", + "ssh_url": "git@github.com:leeeha/my-first-web-site.git", + "clone_url": "https://github.com/leeeha/my-first-web-site.git", + "svn_url": "https://github.com/leeeha/my-first-web-site", + "homepage": null, + "size": 1486, + "stargazers_count": 0, + "watchers_count": 0, + "language": "HTML", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main" + }, + { + "id": 447961516, + "node_id": "R_kgDOGrNZrA", + "name": "OpenCV-Basic-Python", + "full_name": "leeeha/OpenCV-Basic-Python", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/OpenCV-Basic-Python", + "description": "📸 OpenCV Basic Tutorial with Python", + "fork": false, + "url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python", + "forks_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/forks", + "keys_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/teams", + "hooks_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/events", + "assignees_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/tags", + "blobs_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/subscription", + "commits_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/merges", + "archive_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/downloads", + "issues_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/OpenCV-Basic-Python/deployments", + "created_at": "2022-01-14T12:33:40Z", + "updated_at": "2022-07-15T12:31:37Z", + "pushed_at": "2022-02-19T03:37:07Z", + "git_url": "git://github.com/leeeha/OpenCV-Basic-Python.git", + "ssh_url": "git@github.com:leeeha/OpenCV-Basic-Python.git", + "clone_url": "https://github.com/leeeha/OpenCV-Basic-Python.git", + "svn_url": "https://github.com/leeeha/OpenCV-Basic-Python", + "homepage": "", + "size": 54602, + "stargazers_count": 0, + "watchers_count": 0, + "language": "Python", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "opencv", + "python", + "solution-challenge-2022" + ], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "master" + }, + { + "id": 534069231, + "node_id": "R_kgDOH9U_7w", + "name": "OSS_Practice", + "full_name": "leeeha/OSS_Practice", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/OSS_Practice", + "description": "오픈소스 소프트웨어 실습과제 레포", + "fork": false, + "url": "https://api.github.com/repos/leeeha/OSS_Practice", + "forks_url": "https://api.github.com/repos/leeeha/OSS_Practice/forks", + "keys_url": "https://api.github.com/repos/leeeha/OSS_Practice/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/OSS_Practice/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/OSS_Practice/teams", + "hooks_url": "https://api.github.com/repos/leeeha/OSS_Practice/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/OSS_Practice/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/OSS_Practice/events", + "assignees_url": "https://api.github.com/repos/leeeha/OSS_Practice/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/OSS_Practice/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/OSS_Practice/tags", + "blobs_url": "https://api.github.com/repos/leeeha/OSS_Practice/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/OSS_Practice/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/OSS_Practice/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/OSS_Practice/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/OSS_Practice/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/OSS_Practice/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/OSS_Practice/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/OSS_Practice/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/OSS_Practice/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/OSS_Practice/subscription", + "commits_url": "https://api.github.com/repos/leeeha/OSS_Practice/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/OSS_Practice/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/OSS_Practice/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/OSS_Practice/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/OSS_Practice/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/OSS_Practice/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/OSS_Practice/merges", + "archive_url": "https://api.github.com/repos/leeeha/OSS_Practice/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/OSS_Practice/downloads", + "issues_url": "https://api.github.com/repos/leeeha/OSS_Practice/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/OSS_Practice/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/OSS_Practice/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/OSS_Practice/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/OSS_Practice/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/OSS_Practice/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/OSS_Practice/deployments", + "created_at": "2022-09-08T05:51:37Z", + "updated_at": "2022-09-29T00:27:19Z", + "pushed_at": "2022-10-01T08:11:39Z", + "git_url": "git://github.com/leeeha/OSS_Practice.git", + "ssh_url": "git@github.com:leeeha/OSS_Practice.git", + "clone_url": "https://github.com/leeeha/OSS_Practice.git", + "svn_url": "https://github.com/leeeha/OSS_Practice", + "homepage": "", + "size": 8, + "stargazers_count": 0, + "watchers_count": 0, + "language": null, + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "oss", + "python" + ], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main" + }, + { + "id": 563793862, + "node_id": "R_kgDOIZrPxg", + "name": "OSS_Project", + "full_name": "leeeha/OSS_Project", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/OSS_Project", + "description": "오픈소스 소프트웨어 텀프로젝트", + "fork": false, + "url": "https://api.github.com/repos/leeeha/OSS_Project", + "forks_url": "https://api.github.com/repos/leeeha/OSS_Project/forks", + "keys_url": "https://api.github.com/repos/leeeha/OSS_Project/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/OSS_Project/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/OSS_Project/teams", + "hooks_url": "https://api.github.com/repos/leeeha/OSS_Project/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/OSS_Project/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/OSS_Project/events", + "assignees_url": "https://api.github.com/repos/leeeha/OSS_Project/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/OSS_Project/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/OSS_Project/tags", + "blobs_url": "https://api.github.com/repos/leeeha/OSS_Project/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/OSS_Project/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/OSS_Project/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/OSS_Project/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/OSS_Project/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/OSS_Project/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/OSS_Project/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/OSS_Project/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/OSS_Project/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/OSS_Project/subscription", + "commits_url": "https://api.github.com/repos/leeeha/OSS_Project/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/OSS_Project/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/OSS_Project/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/OSS_Project/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/OSS_Project/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/OSS_Project/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/OSS_Project/merges", + "archive_url": "https://api.github.com/repos/leeeha/OSS_Project/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/OSS_Project/downloads", + "issues_url": "https://api.github.com/repos/leeeha/OSS_Project/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/OSS_Project/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/OSS_Project/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/OSS_Project/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/OSS_Project/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/OSS_Project/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/OSS_Project/deployments", + "created_at": "2022-11-09T10:55:00Z", + "updated_at": "2022-12-05T16:40:33Z", + "pushed_at": "2022-12-10T06:02:15Z", + "git_url": "git://github.com/leeeha/OSS_Project.git", + "ssh_url": "git@github.com:leeeha/OSS_Project.git", + "clone_url": "https://github.com/leeeha/OSS_Project.git", + "svn_url": "https://github.com/leeeha/OSS_Project", + "homepage": "", + "size": 327, + "stargazers_count": 0, + "watchers_count": 0, + "language": "Python", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": { + "key": "mit", + "name": "MIT License", + "spdx_id": "MIT", + "url": "https://api.github.com/licenses/mit", + "node_id": "MDc6TGljZW5zZTEz" + }, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main" + }, + { + "id": 507490554, + "node_id": "R_kgDOHj-w-g", + "name": "paintJS", + "full_name": "leeeha/paintJS", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/paintJS", + "description": "🎨 Painting board made with VanillaJS", + "fork": false, + "url": "https://api.github.com/repos/leeeha/paintJS", + "forks_url": "https://api.github.com/repos/leeeha/paintJS/forks", + "keys_url": "https://api.github.com/repos/leeeha/paintJS/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/paintJS/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/paintJS/teams", + "hooks_url": "https://api.github.com/repos/leeeha/paintJS/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/paintJS/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/paintJS/events", + "assignees_url": "https://api.github.com/repos/leeeha/paintJS/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/paintJS/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/paintJS/tags", + "blobs_url": "https://api.github.com/repos/leeeha/paintJS/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/paintJS/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/paintJS/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/paintJS/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/paintJS/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/paintJS/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/paintJS/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/paintJS/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/paintJS/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/paintJS/subscription", + "commits_url": "https://api.github.com/repos/leeeha/paintJS/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/paintJS/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/paintJS/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/paintJS/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/paintJS/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/paintJS/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/paintJS/merges", + "archive_url": "https://api.github.com/repos/leeeha/paintJS/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/paintJS/downloads", + "issues_url": "https://api.github.com/repos/leeeha/paintJS/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/paintJS/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/paintJS/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/paintJS/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/paintJS/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/paintJS/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/paintJS/deployments", + "created_at": "2022-06-26T05:58:30Z", + "updated_at": "2022-07-15T12:16:20Z", + "pushed_at": "2022-10-13T04:56:43Z", + "git_url": "git://github.com/leeeha/paintJS.git", + "ssh_url": "git@github.com:leeeha/paintJS.git", + "clone_url": "https://github.com/leeeha/paintJS.git", + "svn_url": "https://github.com/leeeha/paintJS", + "homepage": "", + "size": 11, + "stargazers_count": 0, + "watchers_count": 0, + "language": "JavaScript", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "canvas", + "nomad-coders", + "vanilla-javascript" + ], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main" + }, + { + "id": 408058749, + "node_id": "MDEwOlJlcG9zaXRvcnk0MDgwNTg3NDk=", + "name": "ProblemSolving", + "full_name": "leeeha/ProblemSolving", + "private": false, + "owner": { + "login": "leeeha", + "id": 68090939, + "node_id": "MDQ6VXNlcjY4MDkwOTM5", + "avatar_url": "https://avatars.githubusercontent.com/u/68090939?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/leeeha", + "html_url": "https://github.com/leeeha", + "followers_url": "https://api.github.com/users/leeeha/followers", + "following_url": "https://api.github.com/users/leeeha/following{/other_user}", + "gists_url": "https://api.github.com/users/leeeha/gists{/gist_id}", + "starred_url": "https://api.github.com/users/leeeha/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/leeeha/subscriptions", + "organizations_url": "https://api.github.com/users/leeeha/orgs", + "repos_url": "https://api.github.com/users/leeeha/repos", + "events_url": "https://api.github.com/users/leeeha/events{/privacy}", + "received_events_url": "https://api.github.com/users/leeeha/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/leeeha/ProblemSolving", + "description": "👩‍💻 알고리즘 문제풀이", + "fork": false, + "url": "https://api.github.com/repos/leeeha/ProblemSolving", + "forks_url": "https://api.github.com/repos/leeeha/ProblemSolving/forks", + "keys_url": "https://api.github.com/repos/leeeha/ProblemSolving/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/leeeha/ProblemSolving/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/leeeha/ProblemSolving/teams", + "hooks_url": "https://api.github.com/repos/leeeha/ProblemSolving/hooks", + "issue_events_url": "https://api.github.com/repos/leeeha/ProblemSolving/issues/events{/number}", + "events_url": "https://api.github.com/repos/leeeha/ProblemSolving/events", + "assignees_url": "https://api.github.com/repos/leeeha/ProblemSolving/assignees{/user}", + "branches_url": "https://api.github.com/repos/leeeha/ProblemSolving/branches{/branch}", + "tags_url": "https://api.github.com/repos/leeeha/ProblemSolving/tags", + "blobs_url": "https://api.github.com/repos/leeeha/ProblemSolving/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/leeeha/ProblemSolving/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/leeeha/ProblemSolving/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/leeeha/ProblemSolving/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/leeeha/ProblemSolving/statuses/{sha}", + "languages_url": "https://api.github.com/repos/leeeha/ProblemSolving/languages", + "stargazers_url": "https://api.github.com/repos/leeeha/ProblemSolving/stargazers", + "contributors_url": "https://api.github.com/repos/leeeha/ProblemSolving/contributors", + "subscribers_url": "https://api.github.com/repos/leeeha/ProblemSolving/subscribers", + "subscription_url": "https://api.github.com/repos/leeeha/ProblemSolving/subscription", + "commits_url": "https://api.github.com/repos/leeeha/ProblemSolving/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/leeeha/ProblemSolving/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/leeeha/ProblemSolving/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/leeeha/ProblemSolving/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/leeeha/ProblemSolving/contents/{+path}", + "compare_url": "https://api.github.com/repos/leeeha/ProblemSolving/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/leeeha/ProblemSolving/merges", + "archive_url": "https://api.github.com/repos/leeeha/ProblemSolving/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/leeeha/ProblemSolving/downloads", + "issues_url": "https://api.github.com/repos/leeeha/ProblemSolving/issues{/number}", + "pulls_url": "https://api.github.com/repos/leeeha/ProblemSolving/pulls{/number}", + "milestones_url": "https://api.github.com/repos/leeeha/ProblemSolving/milestones{/number}", + "notifications_url": "https://api.github.com/repos/leeeha/ProblemSolving/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/leeeha/ProblemSolving/labels{/name}", + "releases_url": "https://api.github.com/repos/leeeha/ProblemSolving/releases{/id}", + "deployments_url": "https://api.github.com/repos/leeeha/ProblemSolving/deployments", + "created_at": "2021-09-19T07:13:11Z", + "updated_at": "2022-07-15T12:34:26Z", + "pushed_at": "2023-06-01T08:37:05Z", + "git_url": "git://github.com/leeeha/ProblemSolving.git", + "ssh_url": "git@github.com:leeeha/ProblemSolving.git", + "clone_url": "https://github.com/leeeha/ProblemSolving.git", + "svn_url": "https://github.com/leeeha/ProblemSolving", + "homepage": "", + "size": 230, + "stargazers_count": 0, + "watchers_count": 0, + "language": "C++", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": null, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "algorithm", + "cpp", + "problem-solving" + ], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main" } ] \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/GoSoptApplication.kt b/app/src/main/java/org/android/go/sopt/GoSoptApplication.kt index c1894bd..a47b4b5 100644 --- a/app/src/main/java/org/android/go/sopt/GoSoptApplication.kt +++ b/app/src/main/java/org/android/go/sopt/GoSoptApplication.kt @@ -21,6 +21,8 @@ class GoSoptApplication : Application() { }.getOrNull() } + // assets은 context 참조가 필요하기 때문에 + // 뷰모델이 아니라 application 부분에서 함수를 정의했다. private fun loadAsset(fileName: String): String { return assets.open(fileName).use { inputStream -> val size = inputStream.available() @@ -53,8 +55,6 @@ class GoSoptApplication : Application() { } } - // 클래스가 처음 로딩될 때 초기화 되는 companion object - // 프로그램과 생명주기를 같이 하며, 한번만 생성된다. (싱글톤) companion object { lateinit var prefs: SharedPreferences var mockJsonString: String? = null diff --git a/app/src/main/java/org/android/go/sopt/presentation/login/LoginActivity.kt b/app/src/main/java/org/android/go/sopt/presentation/login/LoginActivity.kt index eb9404c..3b7f171 100644 --- a/app/src/main/java/org/android/go/sopt/presentation/login/LoginActivity.kt +++ b/app/src/main/java/org/android/go/sopt/presentation/login/LoginActivity.kt @@ -9,6 +9,8 @@ import org.android.go.sopt.R import org.android.go.sopt.databinding.ActivityLoginBinding import org.android.go.sopt.presentation.main.MainActivity import org.android.go.sopt.presentation.signup.SignUpActivity +import org.android.go.sopt.util.LoadingDialogFragment +import org.android.go.sopt.util.LoadingDialogFragment.Companion.TAG_LOADING_DIALOG import org.android.go.sopt.util.binding.BindingActivity import org.android.go.sopt.util.code.CODE_INCORRECT_INPUT import org.android.go.sopt.util.code.CODE_INVALID_INPUT @@ -19,6 +21,7 @@ import org.android.go.sopt.util.state.RemoteUiState.* class LoginActivity : BindingActivity(R.layout.activity_login) { private val viewModel by viewModels() + private val loadingDialog by lazy { LoadingDialogFragment() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -32,8 +35,13 @@ class LoginActivity : BindingActivity(R.layout.activity_lo private fun initLoginStateObserver() { viewModel.loginState.observe(this) { state -> when (state) { - is Success -> navigateToMainScreen() + is Loading -> loadingDialog.show(supportFragmentManager, TAG_LOADING_DIALOG) + is Success -> { + loadingDialog.dismiss() + navigateToMainScreen() + } is Failure -> { + loadingDialog.dismiss() when (state.code) { CODE_INVALID_INPUT -> showSnackbar( binding.root, @@ -85,8 +93,8 @@ class LoginActivity : BindingActivity(R.layout.activity_lo } private fun clearEditText() { - binding.etId.text.clear() - binding.etPw.text.clear() + binding.etId.text?.clear() + binding.etPw.text?.clear() } private fun focusOutEditText(button: View?) { diff --git a/app/src/main/java/org/android/go/sopt/presentation/login/LoginViewModel.kt b/app/src/main/java/org/android/go/sopt/presentation/login/LoginViewModel.kt index 3111de3..0687a30 100644 --- a/app/src/main/java/org/android/go/sopt/presentation/login/LoginViewModel.kt +++ b/app/src/main/java/org/android/go/sopt/presentation/login/LoginViewModel.kt @@ -89,6 +89,8 @@ class LoginViewModel : ViewModel() { ) viewModelScope.launch { + _loginState.value = Loading + postLoginResult(requestPostLoginDto) .onSuccess { response -> preferenceManager.loginState = true @@ -102,7 +104,11 @@ class LoginViewModel : ViewModel() { else -> _loginState.value = Error } Timber.e("POST LOGIN FAIL ${t.code()} : ${t.message()}") + return@onFailure } + + _loginState.value = Error + Timber.e("POST LOGIN FAIL : ${t.message}") } } } diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/gallery/GalleryFragment.kt b/app/src/main/java/org/android/go/sopt/presentation/main/gallery/GalleryFragment.kt index 8c2698e..03acc48 100644 --- a/app/src/main/java/org/android/go/sopt/presentation/main/gallery/GalleryFragment.kt +++ b/app/src/main/java/org/android/go/sopt/presentation/main/gallery/GalleryFragment.kt @@ -8,28 +8,42 @@ import org.android.go.sopt.R import org.android.go.sopt.util.binding.BindingFragment import org.android.go.sopt.databinding.FragmentGalleryBinding import org.android.go.sopt.presentation.main.gallery.adapter.FollowerAdapter +import org.android.go.sopt.util.LoadingDialogFragment +import org.android.go.sopt.util.LoadingDialogFragment.Companion.TAG_LOADING_DIALOG import org.android.go.sopt.util.extension.showSnackbar import org.android.go.sopt.util.state.RemoteUiState.* /** ReqRes API Retrofit + ListAdapter */ class GalleryFragment : BindingFragment(R.layout.fragment_gallery) { private val viewModel by viewModels() - private var followerAdapter: FollowerAdapter? = null + + private var _followerAdapter: FollowerAdapter? = null + private val followerAdapter + get() = requireNotNull(_followerAdapter) { getString(R.string.adapter_not_initialized_error_msg) } + + private var _loadingDialog: LoadingDialogFragment? = null + private val loadingDialog + get() = requireNotNull(_loadingDialog) { getString(R.string.loading_dialog_not_initialized_error_msg) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.vm = viewModel initFollowerAdapter() + initLoadingDialogFragment() initRecyclerViewLayoutManager() initFollowerListStateObserver() } private fun initFollowerAdapter() { - followerAdapter = FollowerAdapter() + _followerAdapter = FollowerAdapter() binding.rvGallery.adapter = followerAdapter } + private fun initLoadingDialogFragment() { + _loadingDialog = LoadingDialogFragment() + } + private fun initRecyclerViewLayoutManager() { binding.rvGallery.layoutManager = GridLayoutManager(requireContext(), 2) } @@ -37,15 +51,25 @@ class GalleryFragment : BindingFragment(R.layout.fragmen private fun initFollowerListStateObserver() { viewModel.getFollowerListState.observe(viewLifecycleOwner) { state -> when (state) { - is Success -> followerAdapter?.submitList(viewModel.followerList) - is Failure -> requireContext().showSnackbar( - binding.root, - getString(R.string.gallery_follower_list_null_msg) - ) - is Error -> requireContext().showSnackbar( - binding.root, - getString(R.string.network_error_msg) - ) + is Loading -> loadingDialog.show(parentFragmentManager, TAG_LOADING_DIALOG) + is Success -> { + loadingDialog.dismiss() + followerAdapter.submitList(viewModel.followerList) + } + is Failure -> { + loadingDialog.dismiss() + requireContext().showSnackbar( + binding.root, + getString(R.string.gallery_empty_follower_list_error_msg) + ) + } + is Error -> { + loadingDialog.dismiss() + requireContext().showSnackbar( + binding.root, + getString(R.string.network_error_msg) + ) + } } } } @@ -54,9 +78,10 @@ class GalleryFragment : BindingFragment(R.layout.fragmen binding.rvGallery.scrollToPosition(0) } - // 뷰에 종속되는 어댑터에도 null을 할당하여 메모리 누수 방지 + // 뷰에 종속되는 요소들에 명시적으로 null을 할당하여 메모리 누수 방지 override fun onDestroyView() { super.onDestroyView() - followerAdapter = null + _followerAdapter = null + _loadingDialog = null } } diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/gallery/GalleryViewModel.kt b/app/src/main/java/org/android/go/sopt/presentation/main/gallery/GalleryViewModel.kt index b8f7110..bfe2ecd 100644 --- a/app/src/main/java/org/android/go/sopt/presentation/main/gallery/GalleryViewModel.kt +++ b/app/src/main/java/org/android/go/sopt/presentation/main/gallery/GalleryViewModel.kt @@ -9,7 +9,6 @@ import org.android.go.sopt.data.api.ReqResFactory import org.android.go.sopt.data.entity.Follower import org.android.go.sopt.util.state.RemoteUiState import org.android.go.sopt.util.state.RemoteUiState.* -import retrofit2.HttpException import timber.log.Timber class GalleryViewModel : ViewModel() { @@ -27,10 +26,13 @@ class GalleryViewModel : ViewModel() { private fun getFollowerList() { viewModelScope.launch { + _getFollowerListState.value = Loading + getFollowerListResult(PAGE, PER_PAGE) .onSuccess { response -> if (response.isEmpty()) { _getFollowerListState.value = Failure(null) + Timber.e("GET FOLLOWER LIST FAIL : EMPTY LIST") return@onSuccess } @@ -39,10 +41,8 @@ class GalleryViewModel : ViewModel() { Timber.d("GET FOLLOWER LIST SUCCESS : $response") } .onFailure { t -> - if (t is HttpException) { - _getFollowerListState.value = Error - Timber.e("GET FOLLOWER LIST FAIL : ${t.message}") - } + _getFollowerListState.value = Error + Timber.e("GET FOLLOWER LIST FAIL : ${t.message}") } } } @@ -55,6 +55,6 @@ class GalleryViewModel : ViewModel() { companion object { private const val PAGE = 1 - private const val PER_PAGE = 10 + private const val PER_PAGE = 12 } } \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeFragment.kt b/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeFragment.kt index 74747a7..18cd6a8 100644 --- a/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeFragment.kt +++ b/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeFragment.kt @@ -8,16 +8,18 @@ import org.android.go.sopt.databinding.FragmentHomeBinding import org.android.go.sopt.data.entity.MultiViewItem import org.android.go.sopt.data.entity.MultiViewItem.Header import org.android.go.sopt.presentation.main.home.adapter.MultiViewAdapter +import org.android.go.sopt.util.LoadingDialogFragment +import org.android.go.sopt.util.LoadingDialogFragment.Companion.TAG_LOADING_DIALOG import org.android.go.sopt.util.binding.BindingFragment import org.android.go.sopt.util.extension.showSnackbar -import org.android.go.sopt.util.state.LocalUiState.Failure -import org.android.go.sopt.util.state.LocalUiState.Success +import org.android.go.sopt.util.state.LocalUiState.* /** MockRepoList + MultiView Adapter */ class HomeFragment : BindingFragment(R.layout.fragment_home) { private val viewModel by viewModels() private lateinit var multiViewItems: MutableList private var multiViewAdapter: MultiViewAdapter? = null + private val loadingDialog by lazy { LoadingDialogFragment() } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -30,26 +32,28 @@ class HomeFragment : BindingFragment(R.layout.fragment_home private fun initMultiViewItems() { multiViewItems = mutableListOf() - multiViewItems.add(Header(getString(R.string.header_text))) + multiViewItems.add(Header(getString(R.string.home_repo_header_text))) } private fun initRepoListStateObserver() { viewModel.getRepoListState.observe(viewLifecycleOwner) { state -> when (state) { - is Success -> addRepoList() - is Failure -> requireContext().showSnackbar( - binding.root, - getString(R.string.home_get_repo_list_fail_msg) - ) + is Loading -> loadingDialog.show(parentFragmentManager, TAG_LOADING_DIALOG) + is Success -> { + loadingDialog.dismiss() + addRepoList() + } + is Failure -> { + loadingDialog.dismiss() + requireContext().showSnackbar( + binding.root, + getString(R.string.home_empty_repo_list_error_msg) + ) + } } } } - private fun initMultiViewAdapter() { - multiViewAdapter = MultiViewAdapter(multiViewItems) - binding.rvHome.adapter = multiViewAdapter - } - private fun addRepoList() { viewModel.repoList?.let { repoList -> for (element in repoList) { @@ -58,6 +62,11 @@ class HomeFragment : BindingFragment(R.layout.fragment_home } } + private fun initMultiViewAdapter() { + multiViewAdapter = MultiViewAdapter(multiViewItems) + binding.rvHome.adapter = multiViewAdapter + } + fun scrollToTop() { binding.rvHome.scrollToPosition(0) } diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeViewModel.kt b/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeViewModel.kt index 831a521..89b8a1a 100644 --- a/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeViewModel.kt +++ b/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeViewModel.kt @@ -3,7 +3,6 @@ package org.android.go.sopt.presentation.main.home import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import org.android.go.sopt.GoSoptApplication import org.android.go.sopt.data.model.local.MockRepoDto @@ -26,6 +25,8 @@ class HomeViewModel : ViewModel() { } private fun getRepoList() { + _getRepoListState.value = Loading + getRepoListResult() .onSuccess { response -> if (response.isEmpty()) { diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/mypage/LogoutDialogFragment.kt b/app/src/main/java/org/android/go/sopt/presentation/main/mypage/LogoutDialogFragment.kt new file mode 100644 index 0000000..00350d0 --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/presentation/main/mypage/LogoutDialogFragment.kt @@ -0,0 +1,42 @@ +package org.android.go.sopt.presentation.main.mypage + +import android.content.Intent +import android.os.Bundle +import android.view.View +import androidx.fragment.app.viewModels +import org.android.go.sopt.R +import org.android.go.sopt.databinding.FragmentLogoutDialogBinding +import org.android.go.sopt.presentation.login.LoginActivity +import org.android.go.sopt.util.binding.BindingDialogFragment + +class LogoutDialogFragment: BindingDialogFragment(R.layout.fragment_logout_dialog) { + private val viewModel by viewModels() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.vm = viewModel + + initCancelButtonClickListener() + initConfirmButtonClickListener() + } + + private fun initCancelButtonClickListener() { + binding.btnCancel.setOnClickListener { + dismiss() + } + } + + private fun initConfirmButtonClickListener() { + binding.btnConfirm.setOnClickListener { + viewModel.logout() + navigateToLoginScreen() + } + } + + private fun navigateToLoginScreen() { + Intent(requireContext(), LoginActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity(this) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/mypage/MyPageFragment.kt b/app/src/main/java/org/android/go/sopt/presentation/main/mypage/MyPageFragment.kt index 8c3222c..03970ef 100644 --- a/app/src/main/java/org/android/go/sopt/presentation/main/mypage/MyPageFragment.kt +++ b/app/src/main/java/org/android/go/sopt/presentation/main/mypage/MyPageFragment.kt @@ -1,54 +1,28 @@ package org.android.go.sopt.presentation.main.mypage -import android.content.Intent import android.os.Bundle import android.view.View -import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.viewModels import org.android.go.sopt.R -import org.android.go.sopt.util.binding.BindingFragment import org.android.go.sopt.databinding.FragmentMyPageBinding -import org.android.go.sopt.presentation.login.LoginActivity -import org.android.go.sopt.util.PreferenceManager +import org.android.go.sopt.util.binding.BindingFragment class MyPageFragment : BindingFragment(R.layout.fragment_my_page) { - private val preferenceManager = PreferenceManager() + private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initUserProfile() + binding.vm = viewModel initLogoutButtonClickListener() } - private fun initUserProfile() { - val signedUpUser = preferenceManager.signedUpUser - if (signedUpUser != null) { - binding.tvName.append(signedUpUser.name) - binding.tvHobby.append(signedUpUser.hobby) - } - } - private fun initLogoutButtonClickListener() { binding.btnLogout.setOnClickListener { - showAlertDialog() + LogoutDialogFragment().show(parentFragmentManager, TAG_LOGOUT_DIALOG) } } - private fun showAlertDialog() { - val builder = AlertDialog.Builder(requireContext()) - builder.setMessage(R.string.dialog_logout_msg) - .setPositiveButton(R.string.dialog_yes) { dialog, id -> - preferenceManager.loginState = false - navigateToLoginScreen() - } - .setNegativeButton(R.string.dialog_no, null) - .create() - builder.show() - } - - private fun navigateToLoginScreen() { - Intent(requireContext(), LoginActivity::class.java).apply { - addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) - startActivity(this) - } + companion object { + private const val TAG_LOGOUT_DIALOG = "LOGOUT_DIALOG" } } \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/mypage/MyPageViewModel.kt b/app/src/main/java/org/android/go/sopt/presentation/main/mypage/MyPageViewModel.kt new file mode 100644 index 0000000..75e3709 --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/presentation/main/mypage/MyPageViewModel.kt @@ -0,0 +1,25 @@ +package org.android.go.sopt.presentation.main.mypage + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import org.android.go.sopt.data.entity.User +import org.android.go.sopt.util.PreferenceManager + +class MyPageViewModel : ViewModel() { + private val preferenceManager = PreferenceManager() + private val _signedUpUser = MutableLiveData() + val signedUpUser: User? + get() = _signedUpUser.value + + init { + getSignedUpUser() + } + + private fun getSignedUpUser() { + _signedUpUser.value = preferenceManager.signedUpUser + } + + fun logout() { + preferenceManager.loginState = false + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpActivity.kt b/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpActivity.kt index f946e81..d794210 100644 --- a/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpActivity.kt +++ b/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpActivity.kt @@ -2,53 +2,51 @@ package org.android.go.sopt.presentation.signup import android.content.Intent import android.os.Bundle -import android.view.View import androidx.activity.viewModels -import androidx.core.widget.addTextChangedListener import org.android.go.sopt.R import org.android.go.sopt.util.binding.BindingActivity import org.android.go.sopt.databinding.ActivitySignUpBinding import org.android.go.sopt.presentation.login.LoginActivity +import org.android.go.sopt.util.LoadingDialogFragment +import org.android.go.sopt.util.LoadingDialogFragment.Companion.TAG_LOADING_DIALOG import org.android.go.sopt.util.code.CODE_DUPLICATED_ID -import org.android.go.sopt.util.code.CODE_INCORRECT_INPUT -import org.android.go.sopt.util.code.CODE_INVALID_INPUT import org.android.go.sopt.util.extension.hideKeyboard import org.android.go.sopt.util.extension.showSnackbar import org.android.go.sopt.util.state.RemoteUiState.* class SignUpActivity : BindingActivity(R.layout.activity_sign_up) { private val viewModel by viewModels() + private val loadingDialog by lazy { LoadingDialogFragment() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.vm = viewModel initRootLayoutClickListener() - initEditTextChangedListeners() initSignUpStateObserver() } private fun initSignUpStateObserver() { viewModel.signUpState.observe(this) { state -> when (state) { - is Success -> navigateToLoginScreen() + is Loading -> loadingDialog.show(supportFragmentManager, TAG_LOADING_DIALOG) + is Success -> { + loadingDialog.dismiss() + navigateToLoginScreen() + } is Failure -> { + loadingDialog.dismiss() when (state.code) { - CODE_INVALID_INPUT -> showSnackbar( - binding.root, - getString(R.string.invalid_input_error_msg) - ) - CODE_INCORRECT_INPUT -> showSnackbar( - binding.root, - getString(R.string.incorrect_input_error_msg) - ) CODE_DUPLICATED_ID -> showSnackbar( binding.root, getString(R.string.id_duplicate_error_msg) ) } } - is Error -> showSnackbar(binding.root, getString(R.string.network_error_msg)) + is Error -> { + loadingDialog.dismiss() + showSnackbar(binding.root, getString(R.string.network_error_msg)) + } } } } @@ -63,40 +61,16 @@ class SignUpActivity : BindingActivity(R.layout.activity_ private fun initRootLayoutClickListener() { binding.root.setOnClickListener { hideKeyboard() + focusOutEditText() } } - private fun initEditTextChangedListeners() { - binding.etId.addTextChangedListener { - if (!viewModel.isValidId()) { - binding.tvIdLimitError.visibility = View.VISIBLE - } else { - binding.tvIdLimitError.visibility = View.INVISIBLE - } - } - - binding.etPw.addTextChangedListener { - if (!viewModel.isValidPw()) { - binding.tvPwLimitError.visibility = View.VISIBLE - } else { - binding.tvPwLimitError.visibility = View.INVISIBLE - } - } - - binding.etName.addTextChangedListener { - if (viewModel.name.isEmpty()) { - binding.tvNameEmptyError.visibility = View.VISIBLE - } else { - binding.tvNameEmptyError.visibility = View.INVISIBLE - } - } - - binding.etHobby.addTextChangedListener { - if (viewModel.hobby.isEmpty()) { - binding.tvHobbyEmptyError.visibility = View.VISIBLE - } else { - binding.tvHobbyEmptyError.visibility = View.INVISIBLE - } + private fun focusOutEditText() { + with(binding) { + etId.clearFocus() + etPw.clearFocus() + etName.clearFocus() + etHobby.clearFocus() } } } \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpViewModel.kt b/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpViewModel.kt index 31536f6..9bc93d3 100644 --- a/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpViewModel.kt +++ b/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpViewModel.kt @@ -1,32 +1,27 @@ package org.android.go.sopt.presentation.signup -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope +import androidx.lifecycle.* import kotlinx.coroutines.launch import org.android.go.sopt.data.api.AuthFactory.ServicePool.authService +import org.android.go.sopt.data.entity.User import org.android.go.sopt.data.model.remote.request.RequestPostSignUpDto import org.android.go.sopt.data.model.remote.response.ResponsePostSignUpDto import org.android.go.sopt.data.model.remote.response.base.BaseResponse -import org.android.go.sopt.data.entity.User import org.android.go.sopt.util.PreferenceManager import org.android.go.sopt.util.code.CODE_DUPLICATED_ID -import org.android.go.sopt.util.code.CODE_INCORRECT_INPUT -import org.android.go.sopt.util.code.CODE_INVALID_INPUT import org.android.go.sopt.util.state.RemoteUiState import org.android.go.sopt.util.state.RemoteUiState.* import retrofit2.HttpException import timber.log.Timber +import java.util.regex.Pattern class SignUpViewModel : ViewModel() { - private val preferenceManager = PreferenceManager() - private val _signUpState = MutableLiveData() val signUpState: LiveData get() = _signUpState - // 양방향 데이터 바인딩을 위해 LiveData를 public으로 설정 + // EditText에 입력된 값을 LiveData로 가져오는 양방향 데이터 바인딩을 위해 + // LiveData를 public으로 설정 val _id = MutableLiveData("") private val id: String get() = _id.value?.trim() ?: "" @@ -34,29 +29,20 @@ class SignUpViewModel : ViewModel() { private val pw: String get() = _pw.value?.trim() ?: "" val _name = MutableLiveData("") - val name: String get() = _name.value?.trim() ?: "" + private val name: String get() = _name.value?.trim() ?: "" val _hobby = MutableLiveData("") - val hobby: String get() = _hobby.value?.trim() ?: "" + private val hobby: String get() = _hobby.value?.trim() ?: "" - private fun isValidInput(): Boolean { - return isValidId() && isValidPw() && name.isNotBlank() && hobby.isNotBlank() - } + // 유효한 입력일 때만 버튼이 활성화 되도록 (데이터 바인딩) + val isValidId: LiveData = _id.map { id -> validateId(id) } + val isValidPw: LiveData = _pw.map { pw -> validatePw(pw) } - fun isValidId(): Boolean { - return id.isNotBlank() && id.length in MIN_ID_LENGTH..MAX_ID_LENGTH - } + private fun validateId(id: String) = Pattern.matches(ID_REGEX, id) - fun isValidPw(): Boolean { - return pw.isNotBlank() && pw.length in MIN_PW_LENGTH..MAX_PW_LENGTH - } + private fun validatePw(pw: String) = Pattern.matches(PW_REGEX, pw) fun signUp() { - if (!isValidInput()) { - _signUpState.value = Failure(CODE_INVALID_INPUT) - return - } - val requestPostSignUpDto = RequestPostSignUpDto( id = id, password = pw, @@ -74,18 +60,21 @@ class SignUpViewModel : ViewModel() { .onFailure { t -> if (t is HttpException) { when (t.code()) { - CODE_INCORRECT_INPUT -> _signUpState.value = - Failure(CODE_INCORRECT_INPUT) CODE_DUPLICATED_ID -> _signUpState.value = Failure(CODE_DUPLICATED_ID) else -> _signUpState.value = Error } Timber.e("POST SIGNUP FAIL ${t.code()} : ${t.message()}") + return@onFailure } + + _signUpState.value = Error + Timber.e("POST SIGNUP FAIL : ${t.message}") } } } private fun saveSignedUpUserToPrefs() { + val preferenceManager = PreferenceManager() preferenceManager.signedUpUser = User( id = id, pw = pw, @@ -94,9 +83,8 @@ class SignUpViewModel : ViewModel() { ) } - private suspend fun postSignUp( - requestPostSignUpDto: RequestPostSignUpDto - ): BaseResponse = authService.postSignUp(requestPostSignUpDto) + private suspend fun postSignUp(requestPostSignUpDto: RequestPostSignUpDto): BaseResponse = + authService.postSignUp(requestPostSignUpDto) private suspend fun postSignUpResult(requestPostSignUpDto: RequestPostSignUpDto): Result = runCatching { @@ -106,7 +94,16 @@ class SignUpViewModel : ViewModel() { companion object { const val MIN_ID_LENGTH = 6 const val MAX_ID_LENGTH = 10 - const val MIN_PW_LENGTH = 8 + const val MIN_PW_LENGTH = 6 const val MAX_PW_LENGTH = 12 + + // 영문과 숫자를 적어도 하나씩 포함하는 6~10자리 문자열 + private const val ID_REGEX = + """^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{$MIN_ID_LENGTH,$MAX_ID_LENGTH}$""" + + // 영문, 숫자, 특수문자를 적어도 하나씩 포함하는 6~12자리 문자열 + // 허용되는 특수 문자: !, @, #, $, %, ^, +, -, = + private const val PW_REGEX = + """^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^+\-=])[A-Za-z\d!@#$%^+\-=]{$MIN_PW_LENGTH,$MAX_PW_LENGTH}$""" } } \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/util/LoadingDialogFragment.kt b/app/src/main/java/org/android/go/sopt/util/LoadingDialogFragment.kt new file mode 100644 index 0000000..4e37191 --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/util/LoadingDialogFragment.kt @@ -0,0 +1,24 @@ +package org.android.go.sopt.util + +import android.os.Bundle +import android.view.View +import org.android.go.sopt.R +import org.android.go.sopt.databinding.FragmentLoadingDialogBinding +import org.android.go.sopt.util.binding.BindingDialogFragment + +class LoadingDialogFragment : + BindingDialogFragment(R.layout.fragment_loading_dialog) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + dialog?.setCanceledOnTouchOutside(false) + } + + override fun dismiss() { + if(isAdded) super.dismiss() + } + + companion object { + const val TAG_LOADING_DIALOG = "LOADING_DIALOG" + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/util/PreferenceManager.kt b/app/src/main/java/org/android/go/sopt/util/PreferenceManager.kt index 249f85f..5fb2550 100644 --- a/app/src/main/java/org/android/go/sopt/util/PreferenceManager.kt +++ b/app/src/main/java/org/android/go/sopt/util/PreferenceManager.kt @@ -14,8 +14,8 @@ class PreferenceManager { var signedUpUser: User? set(value) = prefs.edit { - val user = Gson().toJson(value) - putString(KEY_SIGNED_UP_USER, user) + val json = Gson().toJson(value) + putString(KEY_SIGNED_UP_USER, json) } get() { val json = prefs.getString(KEY_SIGNED_UP_USER, "") diff --git a/app/src/main/java/org/android/go/sopt/util/binding/BindingAdapter.kt b/app/src/main/java/org/android/go/sopt/util/binding/BindingAdapter.kt index 9f4e18e..9342300 100644 --- a/app/src/main/java/org/android/go/sopt/util/binding/BindingAdapter.kt +++ b/app/src/main/java/org/android/go/sopt/util/binding/BindingAdapter.kt @@ -5,6 +5,7 @@ import androidx.databinding.BindingAdapter import coil.load import coil.transform.CircleCropTransformation import coil.transform.RoundedCornersTransformation +import com.google.android.material.textfield.TextInputLayout import org.android.go.sopt.R object BindingAdapter { @@ -29,4 +30,10 @@ object BindingAdapter { transformations(CircleCropTransformation()) } } + + @JvmStatic + @BindingAdapter("setErrorText") + fun TextInputLayout.setErrorText(errorText: String?){ + error = errorText + } } \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/util/binding/BindingDialogFragment.kt b/app/src/main/java/org/android/go/sopt/util/binding/BindingDialogFragment.kt new file mode 100644 index 0000000..8aab646 --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/util/binding/BindingDialogFragment.kt @@ -0,0 +1,49 @@ +package org.android.go.sopt.util.binding + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import androidx.annotation.LayoutRes +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding +import androidx.fragment.app.DialogFragment +import org.android.go.sopt.R + +abstract class BindingDialogFragment( + @LayoutRes val layoutRes: Int +) : DialogFragment() { + private var _binding: T? = null + protected val binding get() = requireNotNull(_binding) { getString(R.string.binding_not_initialized_error_msg) } + + override fun onStart() { + super.onStart() + dialog?.window?.apply { + setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT, + ) + setBackgroundDrawableResource(android.R.color.transparent) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { + _binding = DataBindingUtil.inflate(inflater, layoutRes, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.lifecycleOwner = viewLifecycleOwner + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/util/binding/BindingFragment.kt b/app/src/main/java/org/android/go/sopt/util/binding/BindingFragment.kt index 2f4c78d..643e4e5 100644 --- a/app/src/main/java/org/android/go/sopt/util/binding/BindingFragment.kt +++ b/app/src/main/java/org/android/go/sopt/util/binding/BindingFragment.kt @@ -14,7 +14,8 @@ abstract class BindingFragment( @LayoutRes val layoutRes: Int ) : Fragment() { private var _binding: T? = null - protected val binding get() = _binding ?: error(getString(R.string.binding_error_msg)) + protected val binding + get() = requireNotNull(_binding) { getString(R.string.binding_not_initialized_error_msg) } override fun onCreateView( inflater: LayoutInflater, diff --git a/app/src/main/java/org/android/go/sopt/util/state/LocalUiState.kt b/app/src/main/java/org/android/go/sopt/util/state/LocalUiState.kt index 0e9ec88..7c1456b 100644 --- a/app/src/main/java/org/android/go/sopt/util/state/LocalUiState.kt +++ b/app/src/main/java/org/android/go/sopt/util/state/LocalUiState.kt @@ -1,6 +1,7 @@ package org.android.go.sopt.util.state sealed class LocalUiState { + object Loading : LocalUiState() object Success : LocalUiState() data class Failure(val code: Int?) : LocalUiState() } \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/util/state/RemoteUiState.kt b/app/src/main/java/org/android/go/sopt/util/state/RemoteUiState.kt index 8af083d..f443b2d 100644 --- a/app/src/main/java/org/android/go/sopt/util/state/RemoteUiState.kt +++ b/app/src/main/java/org/android/go/sopt/util/state/RemoteUiState.kt @@ -1,6 +1,7 @@ package org.android.go.sopt.util.state sealed class RemoteUiState { + object Loading : RemoteUiState() object Success : RemoteUiState() data class Failure(val code: Int?) : RemoteUiState() object Error : RemoteUiState() diff --git a/app/src/main/res/drawable/shape_white_fill_20_rect.xml b/app/src/main/res/drawable/shape_white_fill_20_rect.xml new file mode 100644 index 0000000..b47e328 --- /dev/null +++ b/app/src/main/res/drawable/shape_white_fill_20_rect.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 2ce33a5..c014427 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -37,20 +37,28 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_title" /> - + app:layout_constraintTop_toBottomOf="@id/tv_id"> + + + + + app:layout_constraintTop_toBottomOf="@id/til_id" /> - + app:layout_constraintTop_toBottomOf="@id/tv_pw"> + + + +