Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/fix/campus' into campus-bus-qa-1216
Browse files Browse the repository at this point in the history
  • Loading branch information
ThirFir committed Dec 16, 2024
2 parents 1a5512f + acf9252 commit 128c658
Show file tree
Hide file tree
Showing 34 changed files with 612 additions and 351 deletions.
238 changes: 102 additions & 136 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,136 +1,102 @@
# Koreatech_IO_Android
Koreatech Community Project (ver. Android)

## Patch Notes
- 1.0.0 Beta
- 자유게시판, 익명게시판, 채용게시판 릴리즈
- 콜밴쉐어링 서비스
- 주변상점 서비스 릴리즈
- 식단 서비스 릴리즈
- 중고 장터 서비스 릴리즈


- 1.1.0 Beta
- 버스 서비스 릴리즈
- 홈화면 추가


- 2.0.0
- 정식 release


- 2.0.1
- 서비스 중복 호출 방지


- 2.0.2
- 닉네임 같을시 버그 수정


- 2.0.3
- 회원가입 이메일 409 error 처리
- 이메일 koreatech portal로 연결


- 2.1.0
- 비로그인 기반 서비스 추가
- 익명게시판 추가
- 동아리 서비스 추가


- 2.1.1
- 식단표 스크롤 오류 수정


- 2.2.0
- 전체 서비스 디자인 변경
- bottom navigation bar 추가
- 시간표 서비스 추가


- 2.2.1
- 비작성자시 삭제 버튼 노출 수정


- 2.2.2
- 시간표 테두리 변경
- 위젯 자동 업데이트 변경
- 카테고리 유지 안됨 수정

- 2.2.3
- 복덕방 서비스 추가
- 분실물 서비스 추가
- 비밀번호 검사 로직 변경

- 2.2.4
- 버스시간표 수정

- 2.2.5
- 식단표 위젯 추가
- 버스 위젯 추가

- 2.2.6
- 상점 전단지 보기 추가
- 상점 주소 및 배달비 추가
- 동아리 상세 페이지 글자 아래로 밀림 수정
- 전화 버튼 사이즈 조절
- 버스 타이머 수정
- 식단표 순서 조절
- 식단표 2캠패스 출력시 한식 미 출력 수정
- 채용게시판에서 취업게시판으로 변경

- 2.2.7
- 검색 기능추가
- 시간표 학기별 조회 기능 추가
- 에티터 추가
- 버스 시간표 업데이트

- 2.2.8
- 로그인시 중고 장터 접근 안 되는 버그 수정

- 3.0.0
- 서비스 축소
- 주변 상점
- 버스 / 교통
- 식단
- 시간표
- 복덕방
- 메인 화면 변경
- Navigation Drawer 변경

- 3.0.1
- 버그 수정
- 상점 전화 번호 출력 오류 수정
- 상점 주소 출력 오류 수정
- Firebase Event 추가
- 상점 진입 후 상점에 전화하는 시간 이벤트 추가

- 3.0.2
- 상점 기능 추가
- 상점 검색
- 상점 상세화면에서 다른 상점 추천
- 카테고리 한번 더 클릭시 전체 상점 출력
- 상점 전화하기 버튼 디자인 변경

- 3.0.3
- 원룸 도어락 표시 버그 수정
- Target SDK 30 업데이트
- Read & Write Permission 제거

- 3.0.4
- 복덕방 서비스 디자인 개선

- 3.0.7
- Target SDK 31 업데이트
- 버스 서비스 업데이트
- 식당 서비스 업데이트
- Kotlin 도입
- clean architecture 모듈 분리 진행

## Technology stack
- Java 8
- Android SDK
- Firebase
- Retrofit2
- RxJava
- ButterKnife
<img src="koin.png" width=100px height=100px >

# 코인 - 한기대 커뮤니티

[![Kotlin](https://img.shields.io/badge/Kotlin-1.9.22-blue.svg)](https://kotlinlang.org)
[![Java](https://img.shields.io/badge/Java-17-orange.svg)](https://kotlinlang.org)
[![Gradle](https://img.shields.io/badge/gradle-8.6-green.svg)](https://gradle.org/)
[![Android Gradle](https://img.shields.io/badge/AGP-8.4.1-green.svg)](https://gradle.org/)

[![minSdkVersion](https://img.shields.io/badge/minSdkVersion-26-red)](https://developer.android.com/distribute/best-practices/develop/target-sdk)
[![compileSdkVersion](https://img.shields.io/badge/compileSdkVersion-34-red)](https://developer.android.com/distribute/best-practices/develop/target-sdk)
[![targetSdkVersion](https://img.shields.io/badge/targetSdkVersion-34-red)](https://developer.android.com/distribute/best-practices/develop/target-sdk)

코인은 한국기술교육대학교 학생들을 위하여 제공하는 커뮤니티 플랫폼 서비스입니다.

[코인 - 한기대 커뮤니티 : Google Play Store 바로가기](https://play.google.com/store/apps/details?id=in.koreatech.koin&hl=ko)

[✨ BCSD 블로그와 함께 코인 프로젝트 훔쳐보기 ✨](https://blog.bcsdlab.com/introduce)

## 코인 사장님
`코인 - 한기대 커뮤니티` 앱과는 별도로 사장님들에게 직접 가게를 등록할 수 있도록 코인 사장님 앱을 제공하고 있습니다.<br>

[코인 사장님 : Google Play Store 바로가기](https://play.google.com/store/apps/details?id=in.koreatech.business&hl=ko)

## Tech Stack
- Java & Kotlin
- XML & Compose
- Jetpack AAC
- Coroutine Flow
- Multi-Module
- MVVM & MVI
- Orbit
- Retrofit2 & OkHttp3
- Gson & kotlinx.serialization
- Hilt
- Timber
- Kakao share
- Naver Map
- Google Analytics
- Firebase Crashlytics
- Firebase Cloud Message
- Firebase App Distribution



## Git Branch Strategy


```mermaid
---
title: KOIN Git Flow
---
%%{init: { 'logLevel': 'debug', 'theme': 'base', 'gitGraph': {'showBranches': true, 'mainBranchName': 'production'}} }%%
gitGraph
commit tag: "v1.0.0"
branch hotfix/A
checkout production
branch develop
checkout develop
commit
branch feature/A
checkout feature/A
checkout production
checkout hotfix/A
commit
checkout develop
checkout feature/A
commit
checkout production
merge hotfix/A tag: "v1.0.1"
checkout feature/A
commit
checkout develop
branch feature/B
commit
checkout develop
merge hotfix/A
checkout feature/B
commit
checkout feature/A
commit
checkout develop
merge feature/A
branch release/v1.1.0
checkout develop
merge feature/B
branch release/v1.1.0B
checkout release/v1.1.0
commit
commit
checkout release/v1.1.0B
commit
commit
checkout production
merge release/v1.1.0 tag: "v1.1.0"
merge release/v1.1.0B tag: "v1.1.0B"
checkout release/v1.1.0
checkout develop
merge release/v1.1.0
merge release/v1.1.0B
```
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ enum class Experiment(
BENEFIT_STORE("Benefit", ExperimentGroup.A, ExperimentGroup.B),
DINING_SHARE("campus_share_v1", ExperimentGroup.SHARE_ORIGINAL, ExperimentGroup.SHARE_NEW),
MAIN_DINING_SEE_MORE("c_main_dining_v1", ExperimentGroup.MAIN_DINING_ORIGINAL, ExperimentGroup.MAIN_DINING_NEW),
MAIN_ARTICLE_KEYWORD_BANNER("c_keyword_ banner_v1", ExperimentGroup.MAIN_BANNER_ORIGINAL, ExperimentGroup.MAIN_BANNER_NEW);
MAIN_ARTICLE_KEYWORD_BANNER("c_keyword_ banner_v1", ExperimentGroup.MAIN_BANNER_ORIGINAL, ExperimentGroup.MAIN_BANNER_NEW),
BUSINESS_CALL("business_call", ExperimentGroup.CALL_NUMBER, ExperimentGroup.CALL_FLOATING);

init {
require(experimentGroups.isNotEmpty()) { "Experiment should have at least one group" }
Expand All @@ -27,4 +28,7 @@ object ExperimentGroup {

const val MAIN_BANNER_ORIGINAL = "banner_original"
const val MAIN_BANNER_NEW = "banner_new"
}

const val CALL_NUMBER = "call_number"
const val CALL_FLOATING = "call_floating"
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ object EventLogger {
logEvent(action, EventCategory.CLICK, label, value, *extras)
}



/**
* 스크롤 이벤트 로깅
* @param action: 이벤트 발생 도메인(BUSINESS, CAMPUS, USER)
Expand Down Expand Up @@ -71,6 +73,8 @@ object EventLogger {
param(EVENT_LABEL, "$label (debug)")
param(VALUE, value)
}
println("EventLoggerCustom: ${action}, ${category}, $label, $value, ")

} else {
Firebase.analytics.logEvent(action) {
param(EVENT_CATEGORY, category)
Expand All @@ -96,6 +100,7 @@ object EventLogger {
param("${it.key}_debug", it.value)
}
}
println("EventLogger: ${action.value}, ${category.value}, $label, $value, ${extras.joinToString { ", ${it.key}: ${it.value}" }}")
} else {
Firebase.analytics.logEvent(action.value) {
param(EVENT_CATEGORY, category.value)
Expand All @@ -112,14 +117,14 @@ object EventLogger {
enum class EventAction(val value: String) {
BUSINESS("BUSINESS"),
CAMPUS("CAMPUS"),
USER("USER")
USER("USER"),
}

enum class EventCategory(val value: String) {
CLICK("click"),
SCROLL("scroll"),
SWIPE("swipe"), // 하단 뒤로가기(아이폰의 swipe 뒤로가기와 대응)
NOTIFICATION("notification")
NOTIFICATION("notification"),
}

data class EventExtra(val key: String, val value: String)
data class EventExtra(val key: String, val value: String)
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,15 @@ object AnalyticsConstant {

const val CAMPUS_DINING_1 = "CAMPUS_dining_1"
const val CAMPUS_NOTICE_1 = "CAMPUS_notice_1"
const val APP_MAIN_NOTICE_DETAIL = "app_main_notice_detail"
const val POPULAR_NOTICE_BANNER = "popular_notice_banner"
const val TO_MANAGE_KEYWORD = "to_manage_keyword"

const val BUSINESS_CALL_NUMBER = " BUSINESS_call_1"
const val BUSINESS_CALL_FLOATING = "BUSINESS_call_1"
}

const val PREVIOUS_PAGE = "previous_page"
const val CURRENT_PAGE = "current_page"
const val DURATION_TIME = "duration_time"
}
}
Binary file added core/src/main/res/drawable/ic_benefit_icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion core/src/main/res/drawable/rounded_corners_black.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/black" />
<corners android:radius="5dp" />
<corners android:radius="16dp" />
</shape>
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import `in`.koreatech.koin.data.request.user.UserRequest
import `in`.koreatech.koin.data.response.notification.NotificationPermissionInfoResponse
import `in`.koreatech.koin.data.response.store.StoreReviewResponse
import `in`.koreatech.koin.data.response.user.ABTestResponse
import `in`.koreatech.koin.data.response.user.ABTestTokenResponse
import `in`.koreatech.koin.data.response.user.UserInfoEditResponse
import `in`.koreatech.koin.data.response.user.UserResponse
import retrofit2.Response
Expand Down Expand Up @@ -90,6 +91,9 @@ interface UserAuthApi {
@GET(URLConstant.OWNER.OWNER)
suspend fun getOwnerTokenIsValid()

@POST("abtest/assign/token")
suspend fun updateABTestToken(): ABTestTokenResponse

@POST("abtest/assign")
suspend fun postABTestAssign(@Body abTestRequest: ABTestRequest): ABTestResponse

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ fun StoreItemResponse.toStore(): Store = Store(
closeTime = it.closeTime ?: ""
)
}.orEmpty().getOrElse(0) { Store.OpenData(localDayOfWeekName, false, "00:00", "00:00") },
categoryIds = categoryIds
categoryIds = categoryIds,
benefitDetails = benefitDetails ?: benefitDetail?.toStringArray() ?: emptyList(),

)

fun StoreEventItemReponse.toStoreEvent(): StoreEvent = StoreEvent(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,12 @@ class UserRepositoryImpl @Inject constructor(
userRemoteDataSource.verifyPassword(PasswordRequest(hashedPassword))
}

override suspend fun updateABTestToken() {
userRemoteDataSource.updateABTestToken().accessHistoryId.also {
tokenLocalDataSource.saveAccessHistoryId(it)
}
}

override suspend fun postABTestAssign(title: String): ABTest {
userRemoteDataSource.postABTestAssign(ABTestRequest(title)).let {
return ABTest(it.variableName, it.accessHistoryId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ data class StoreItemResponse(
@SerializedName("is_event") val isEvent: Boolean?,
@SerializedName("is_open") val isOpen: Boolean?,
@SerializedName("average_rate") val averageRate : Double,
@SerializedName("review_count") val reviewCount : Int
@SerializedName("review_count") val reviewCount : Int,
@SerializedName("benefit_details") val benefitDetails: List<String>?,
@SerializedName("benefit_detail") val benefitDetail: String?,
) {
data class OpenResponseDTO(
@SerializedName("day_of_week")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package `in`.koreatech.koin.data.response.user

import com.google.gson.annotations.SerializedName

data class ABTestTokenResponse(
@SerializedName("accessHistoryId") val accessHistoryId: String
)
Loading

0 comments on commit 128c658

Please sign in to comment.