Skip to content

Commit

Permalink
[둘리] 1, 2단계 영화 극장 선택 제출합니다. (#4)
Browse files Browse the repository at this point in the history
* 영화 티켓 예매 미션

[해시] 1, 2단계 영화 티켓 예매 제출합니다. (#12)

* docs: 기능 목록 작성

* feat: 영화 예매하는 기능 구현

* test(Minute): Minute 클래스에 대한 테스트 코드 생성

* feat(Reservation): 예매 생성 시 제약사항 구현

* docs: 기능 구현 목록 수정

- Movie의 띄어쓰기 수정

* feat(Reservation, Money): Reservation의 총 예매 금액 계산 구현

* refactor(Minute): Minute 클래스를 value class로 변경

* feat(MovieRepository): 영화 목 저장소 구현

* feat(MovieListActivity): 리스트뷰에 영화 목록 띄우는 기능 구현

* docs(MovieListActivity): 기능 목록 업데이트

* refactor: Activity 파일을 view 패키지로 옮김

* docs: 기능 목록 구현 상태 갱신

* refactor: layout 이름 변경

- activity_main -> activity_movie_list

* feat(activity_reservation): 예약 액티비티의 레이아웃 구현

* feat(MovieListActivity): 영화 목록 화면에서 영화 예매 화면으로 이동 기능 구현

* feat(ReservationActivity): 예약 액티비티에서 받은 영화 데이터를 보여 주는 기능 구현

* fix(ReservationActivity): format 타입에 맞는 값으로 수정

* feat(ReservationCompletedActivity): 예약 완료 화면 레이아웃 구현

* feat(ReservationActivity): 영화 예매 화면에서 예매 완료 화면으로 이동 기능 구현

* docs(README): 기능 목록 업데이트

* style(MovieMockRepository): 목 데이터 오타 수정

* feat(ReservationCompletedActivity): 예매 완료 액티비티에서 받은 예매 데이터를 보여 주는 기능 구현

* refactor(strings): 포맷 문자열들의 아이디명을 변경

* feat(movie_item.xml): 영화 포스터 이미지 설명 추가

* docs: 기능 목록 구현 상태 갱신

* docs: 기능 목록 업데이트

* docs(README): 2단계 기능 목록 작성

* feat(Reservation, Movie): 상영 기간을 사용하도록 도메인 변경

* feat(activity_reservation.xml): 레이아웃에 스피너 추가

* feat(ReservationActivity): 영화 상영 시간 선택 기능 구현

* fix(Reservation, ReservationCompletedActivity): 예매한 상영 날짜, 시간 보여주도록 수정

* docs(README): 기능 목록 업데이트

* feat: 할인 정책 및 할인 조건 구현, 예매 시 할인 정책 적용

* feat(ReservationActivity): 화면 회전 시 상태 데이터 저장 및 복구 구현

* fix: 영화의 상영일의 포맷 변경

- yyyy-MM-dd -> yyyy.MM.dd

* fix: LocalDate 타입을 시간 포멧을 지정하지 않도록 코드를 수정

* fix(ReservationActivity): 주말인 경우 time spinner 설정 및 회전 시 선택 된 시간 유지

* refactor(ReservationActivity): time spinner의 초기값을 0으로 수정

* fix(activity_reservation_completed.xml): 스크롤뷰로 수정

* refactor: 불필요한 도메인 클래스 제거 및 디미터 법칙 준수하도록 변경

* refactor(movie_item.xml): movie_item 뷰 배치 수정

* refactor(activity_reservation.xml): RelativeLayout -> ConstraintLayout으로 변경

* refactor(ReservationActivity): ViewBinding 사용하도록 수정

* refactor(ReservationCompletedActivity): ViewBinding 사용하도록 수정

* refactor(MovieListAdapter, MovieItemViewHolder): ViewHolder를 사용해 뷰 객체 캐싱

* refactor(Movie, ReservationUiModel): Parcelable 사용 및 예약 ui 모델 사용하도록 변경

* refactor(ReservationActivity): getParcelableExtra 코드 별도 메서드로 분리

* refactor(ReservationCompletedActivity): getParcelableExtra 코드 별도 메서드로 분리

* refactor(MovieListAdapter): 어댑터 context 제거 및 클릭 이벤트 외부에서 전달하도록 수정

* refactor(Movie): 상영기간에 해당하는 날짜 구하는 반복문 수정

* refactor(ReservationActivity): 메서드 분리

* refactor(ParcelableExtension): parcelable, serializable 버전 처리 코드 별도 extension으로 분리

* test(ReservationTest): 구체적인 테스트명으로 변경

* rename(DateTimeFormatter): DateTimeFormatter로 이름 변경

* refactor(Movie): 뷰에서 사용하는 MovieUiModel 분리

* refactor(ParcelableExtension): 메서드명 수정

---------

Co-authored-by: ki960213 <[email protected]>

[해시] 3, 4 단계 영화 티켓 예매 제출합니다. (#34)

* refactor(ParcelableExtension): Suppress 어노테이션으로 warning 제거

* fix(MovieUiModel): 연,월이 다를 때 기간이 잘못 계산되는 문제 해결

* refactor: domain 모듈 분리

* docs(README): 기능 목록 업데이트

* docs(README): 좌석 관련 기능 목록 업데이트

* feat(SeatType): 좌석 타입 구현

* feat(Seat): 좌석 기능 구현

* refactor(DiscountPolicy, DiscountCondition): Reservation이 아닌 구체적인 값을 전달해 사용하도록 변경

* refactor(DiscountPolicy): 할인 비율, 할인 금액 각 DiscountPolicy가 갖도록 수정

* feat(ReservationAgency): 예매 가능한지 판단한다

* feat(ReservationAgency): 할인 정책 적용 금액 구하는 기능 및 예매하기 구현

* feat(ReservationActivity): SeatSelectionActivity로 이동 및 ReservationOptions 넘기도록 변경

* refactor(Reservation): 금액 관련 속성 제거 및 좌석을 받도록 수정

* refactor(ReservationUiModel): 좌석 정보 추가

* feat(SeatSelectionActivity): 좌석 선택 화면 구현

* fix(Seat): 좌석 행, 열 수정

* feat(SeatSelectionActivity): 예매 인원에 해당하는 좌석을 선택하고 금액 표시하는 기능 구현

* refactor: ktlintCheck

* feat(SeatSelectionActivity): 예매 확인 다이얼로그 및 ReservationCompletedActivity로 이동 구현

* refactor(SeatSelectionActivity): 문자열 추출

* feat(ReservationCompletedActivity): 예매한 좌석 표시

* refactor: 파일 패키지 이동

* feat: 앱바 뒤로가기 구현

* test(SeatSelectionActivityTest): 좌석 선택 UI 테스트

* feat(MovieMockRepository): mock 데이터 추가

* refactor(MovieListActivity): listview를 recyclerview로 변경

* refactor: mapper 별도 파일로 분리

* feat(MovieListActivity): 영화 목록에 광고 추가 구현

* refactor(MovieListAdapter): bind 코드 ViewHolder로 이동

* refactor(MovieListAdapter): 클릭 이벤트 콜백 전달 및 호출 방식 수정

* test(ReservationActivityTest): ReservationActivity UI 테스트

* feat: 광고 배너 웹페이지 연결

* test(ReservationAgencyTest): 좌석 row column 수정

* feat(SeatSelectionActivity): 좌석 동적으로 생성하도록 변경

* refactor(SeatUiModel): 좌석 UI 모델 추가

* refactor: 패키지 변경

* refactor: ktlintFormat

* refactor(MovieAdViewHolder, MovieItemViewHolder): 뷰홀더에서 하위 뷰 제거

* refactor(MovieListActivity): 광고 게시 간격 상수 분리

* refactor(MovieListAdapter, MovieListViewType): ViewType을 enum class로 관리

* refactor(SeatSelectionActivityTest): 테스트 함수명 수정

* refactor(ReservationActivityTest): 테스트 함수명 수정

* refactor(ReservationActivity): SeatSelectionActivity로 이동하는 코드 메서드 분리

* refactor(ReservationActivity, SeatSelectionActivity): 액티비티 진입에 필요한 Intent 생성 코드 이동

* refactor(ReservationCompletedActivity): 액티비티 진입에 필요한 Intent 생성 코드 이동

* refactor(ReservationActivity): 액티비티 진입에 필요한 Intent 생성 코드 이동

* test(SeatSelectionActivityTest, ReservationActivityTest): newIntent 메서드 사용해서 인텐트 생성하도록 수정

* feat(MovieListFragment): 영화 목록 화면 fragment로 변경

* feat(MovieMainActivity): BottomNavigationView 구현

* feat(ReservationListFragment): 예매 내역 레이아웃 구현

* feat(ReservationListFragment): RecyclerView 구현

* feat(ReservationListFragment): 클릭 시 예매 내역 상세 화면으로 이동 구현

* feat(ReservationListFragment): Data 저장 구현

* refactor(MovieListAdapter): 클릭 이벤트 콜백 하나로 합치기

* feat(AlarmReceiver): 예매 후 상영 전 시간 푸시 알림 구현

* feat(SettingFragment, AlarmController): 푸시 알림 수신 설정 구현

* refactor(AlarmController): 알림 받을 시간 수정

* refactor(AlarmController, AlarmReceiver): 코드 정리 및 메서드 분리

* test(MovieMainActivityTest): 설정 프래그먼트 테스트

* refactor(AndroidManifest): 필요없는 권한 삭제

* refactor(layout): xml formatting

* test(SettingFragmentTest): 설정 프래그먼트 테스트

* test(MovieMainActivityTest): Fragment 선택 테스트

* refactor(reservation_item.xml): isFocusable, isClickable 설정 삭제

* refactor(SettingFragment): property formatting

* refactor(SettingFragment): if문 depth 수정

* refactor(Adapter, ViewHolder): click listener 파라미터 고차함수 -> OnItemClick으로 변경 및 수정

* refactor(MovieListFragment): click listener 분리

* refactor(ReservationListFragment): 변수 분리 가독성 수정

* refactor(ReservationCompletedActivity): 권한 유도 코드 이동

* refactor(AlarmController): context private 수정

* refactor(AlarmReceiver, AlarmController): ALARM_REQUEST_CODE 상수 이동

* refactor(ReservationCompletedActivity): pendingIntent를 리턴하는 함수 생성

* refactor(SeatSelectionActivity): repositoryMock에 직접 접근이 아닌 interface 타입 동작으로 수정

* refactor(SettingFragment): defaultSharedPreferences로 변경

* refactor(Fragments): 레이아웃 id 생성자 사용

* refactor(MovieMainActivity): Fragment 재활용

* refactor(ReservationCompletedActivity): 권한 요청 코드 이동

---------

Co-authored-by: 박재성 <[email protected]>
Co-authored-by: EmilyCh0 <[email protected]>
  • Loading branch information
3 people committed Apr 29, 2023
1 parent 443347f commit 15fac5e
Show file tree
Hide file tree
Showing 91 changed files with 2,985 additions and 34 deletions.
70 changes: 69 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,69 @@
# android-movie-theater
# android-movie-theater

## domain

### Movie
- [x] 제목, 상영기간, 러닝타임, 이미지를 알아야 한다.
- [x] MovieDetail을 소유해야 한다.

### MovieDetail
- [x] 영화의 줄거리를 알아야 한다.

### Reservation
- [x] 영화, 예약된 좌석, 선택한 날짜와 시간, 예매 금액을 알아야 한다.
- [x] 최소, 최대 예매 인원 수를 알아야 한다.

### ReservationAgency
- [x] 영화, 인원 수, 선택된 날짜와 시간을 알아야 한다.
- [x] 예매 가능한지 판단한다.
- [x] 예매한다. (Reservation을 생성한다.)
- [x] 할인 정책이 적용된 총 금액을 계산한다.

### DiscountPolicy
- [x] 할인 조건을 가져야 한다.
- [x] 할인 조건을 만족한다면 특정 금액의 할인 가격을 반환할 수 있다.

### MovieDayDiscountPolicy
- [x] 할인 조건을 만족하면 10% 할인한다.
- [x] 10, 20, 30일에 할인 조건을 만족한다는 할인 조건을 가지고 있다.

### ScreeningTimeDiscountPolicy
- [x] 할인 조건을 만족하면 2000원 할인한다.
- [x] 조조, 야간 할인 조건을 가지고 있다.

### DiscountCondition
- [x] 영화 예매에 대해 할인할 수 있는지 판단할 수 있다.

### DayDiscountCondition
- [x] 상영 날짜로 할인할 수 있는지 판단한다.

### ScreeningTimeDiscountCondition
- [x] 상영 시간으로 할인할 수 있는지 판단한다.

### Seat
- [x] 좌석의 행과 열을 알아야 한다.
- [x] 행은 1~4, 열은 1~5를 만족한다.
- [x] 좌석에 해당하는 금액을 구한다.

### SeatType
- [x] 좌석타입에 해당하는 금액을 가지고 있다.

## View

### MovieListActivity
- [x] 모든 영화의 제목, 상영 기간, 러닝타임, 이미지를 보여준다.
- [x] 영화마다 예매할 수 있는 버튼이 존재한다.

### ReservationActivity
- [x] 영화의 이미지, 제목, 상영 기간, 상영 시간, 러닝타임, 상세정보를 보여준다.
- [x] 상영 기간과 상영 시간은 스피너로 선택할 수 있다.
- [x] 예매 인원을 조절할 수 있는 버튼이 존재한다.
- [x] 클릭하면 예매 정보를 보여주는 화면을 띄우는 예매 완료 버튼이 존재한다.

### ReservationCompletedActivity
- [x] 영화 제목, 상영일, 상영 시간, 예매 인원, 예매 금액을 보여준다.

## Repository

### MovieRepository
- [x] 영화 데이터들을 조회할 수 있다.
7 changes: 7 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("kotlin-parcelize")
}

android {
Expand Down Expand Up @@ -33,13 +34,19 @@ android {
kotlinOptions {
jvmTarget = "11"
}
buildFeatures {
viewBinding = true
}
}

dependencies {
implementation(project(":domain"))
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.appcompat:appcompat:1.6.0")
implementation("com.google.android.material:material:1.7.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.fragment:fragment-ktx:1.4.0")
implementation("androidx.preference:preference:1.2.0")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
Expand Down
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package woowacourse.movie.view

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import woowacourse.movie.R
import woowacourse.movie.view.moviemain.MovieMainActivity

@RunWith(AndroidJUnit4::class)
class MovieMainActivityTest {
@get:Rule
val mActivityTestRule = ActivityScenarioRule(MovieMainActivity::class.java)

@Test
fun 예매내역_버튼을_누르면_예매내역_Fragment_바뀐다() {
onView(withId(R.id.action_reservation_list)).perform(click())
onView(withId(R.id.recyclerview)).check(matches(isDisplayed()))
}

@Test
fun_버튼을_누르면__Fragment_바뀐다() {
onView(withId(R.id.action_home)).perform(click())
onView(withId(R.id.movie_recyclerview)).check(matches(isDisplayed()))
}

@Test
fun 설정_버튼을_누르면_설정_Fragment_바뀐다() {
onView(withId(R.id.action_setting)).perform(click())
onView(withId(R.id.setting_toggle)).check(matches(isDisplayed()))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package woowacourse.movie.view

import androidx.test.core.app.ApplicationProvider
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import woowacourse.movie.R
import woowacourse.movie.view.model.MovieListModel
import java.time.LocalDate

@RunWith(AndroidJUnit4::class)
class ReservationActivityTest {

private val movie = MovieListModel.MovieUiModel(
"해리 포터와 마법사의 돌",
LocalDate.of(2024, 3, 1),
LocalDate.of(2024, 3, 31),
152,
R.drawable.harry_potter1_poster,
"《해리 포터와 마법사의 돌》은 2001년 J. K. 롤링의 동명 소설을 원작으로 하여 만든, 영국과 미국 합작, 판타지 영화이다. 해리포터 시리즈 영화 8부작 중 첫 번째에 해당하는 작품이다. 크리스 콜럼버스가 감독을 맡았다."
)

private val intent = ReservationActivity.newIntent(
ApplicationProvider.getApplicationContext(),
movie
)

@get:Rule
val activityRule = ActivityScenarioRule<ReservationActivity>(intent)

@Test
fun 영화_제목을_표시한다() {
onView(withId(R.id.movie_title)).check(matches(withText("해리 포터와 마법사의 돌")))
}

@Test
fun 처음_표시되는_인원수는_1이다() {
onView(withId(R.id.people_count)).check(matches(withText("1")))
}

@Test
fun 플러스_버튼을___클릭하면_인원수는_2이다() {
onView(withId(R.id.plus_button)).perform(click())
onView(withId(R.id.people_count)).check(matches(withText("2")))
}

@Test
fun 초기_인원_1_경우_마이너스_버튼을_눌러도_인원수는_1이다() {
onView(withId(R.id.minus_button)).perform(click())
onView(withId(R.id.people_count)).check(matches(withText("1")))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package woowacourse.movie.view

import androidx.test.core.app.ApplicationProvider
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isEnabled
import androidx.test.espresso.matcher.ViewMatchers.isNotEnabled
import androidx.test.espresso.matcher.ViewMatchers.isNotSelected
import androidx.test.espresso.matcher.ViewMatchers.isSelected
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import woowacourse.movie.R
import woowacourse.movie.domain.Minute
import woowacourse.movie.domain.Movie
import woowacourse.movie.view.mapper.toUiModel
import woowacourse.movie.view.model.ReservationOptions
import woowacourse.movie.view.seatselection.SeatSelectionActivity
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime

@RunWith(AndroidJUnit4::class)
@LargeTest
class SeatSelectionActivityTest {

private val reservationOptions = ReservationOptions(
"해리 포터와 마법사의 돌",
LocalDateTime.of(LocalDate.of(2024, 3, 1), LocalTime.of(13, 0)),
2
)

private val movie = Movie(
"해리 포터와 마법사의 돌",
LocalDate.of(2024, 3, 1),
LocalDate.of(2024, 3, 31),
Minute(152),
R.drawable.harry_potter1_poster,
"《해리 포터와 마법사의 돌》은 2001년 J. K. 롤링의 동명 소설을 원작으로 하여 만든, 영국과 미국 합작, 판타지 영화이다. 해리포터 시리즈 영화 8부작 중 첫 번째에 해당하는 작품이다. 크리스 콜럼버스가 감독을 맡았다."
)

private val intent = SeatSelectionActivity.newIntent(
ApplicationProvider.getApplicationContext(),
reservationOptions,
movie.toUiModel()
)

@get:Rule
val activityRule = ActivityScenarioRule<SeatSelectionActivity>(intent)

@Test
fun 영화_제목을_표시한다() {
onView(withId(R.id.movie_title_textview))
.check(matches(withText("해리 포터와 마법사의 돌")))
}

@Test
fun__클릭하면_좌석이_선택된다() {
onView(withText("A1")).perform(click()).check(matches(isSelected()))
}

@Test
fun__클릭하면_좌석_선택이_해제된다() {
onView(withText("A1")).perform(click())
onView(withText("A1")).perform(click()).check(matches(isNotSelected()))
}

@Test
fun 인원수에_해당하는_좌석이_모두_선택되지_않았다면_확인_버튼은_비활성화_상태다() {
onView(withText("A1")).perform(click())
onView(withId(R.id.confirm_reservation_button))
.check(matches(isNotEnabled()))
}

@Test
fun 인원수에_해당하는_좌석이_모두_선택되었다면_확인_버튼은_활성화_상태다() {
onView(withText("A1")).perform(click())
onView(withText("A2")).perform(click())
onView(withId(R.id.confirm_reservation_button))
.check(matches(isEnabled()))
}

@Test
fun 인원수에_해당하는_좌석이_모두_선택되었다면_최종_금액이_표시된다() {
onView(withText("A1")).perform(click())
onView(withText("A2")).perform(click())
onView(withId(R.id.reservation_fee_textview)).check(matches(withText("20,000원")))
}

@Test
fun 좌석_선택을_해제하여_인원수에_해당하는_좌석이_모두_선택되지_않았다면_최종_금액은_0원으로_표시된다() {
onView(withText("A1")).perform(click())
onView(withText("A2")).perform(click())
onView(withText("A1")).perform(click())
onView(withId(R.id.reservation_fee_textview)).check(matches(withText("0원")))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package woowacourse.movie.view

import android.content.Context
import android.content.SharedPreferences
import androidx.fragment.app.commit
import androidx.preference.PreferenceManager
import androidx.test.core.app.ActivityScenario
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions
import androidx.test.espresso.assertion.ViewAssertions
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import woowacourse.movie.R
import woowacourse.movie.view.moviemain.MovieMainActivity
import woowacourse.movie.view.moviemain.setting.SettingFragment

@RunWith(AndroidJUnit4::class)
class SettingFragmentTest {
@get:Rule
val mActivityTestRule = ActivityScenarioRule(MovieMainActivity::class.java)

@Before
fun setup() {
ActivityScenario.launch(MovieMainActivity::class.java).onActivity {
it.supportFragmentManager.commit {
replace(R.id.fragment_container_view, SettingFragment())
}
}
}

@Test
fun 설정_Fragment에서_저장된_세팅값이_false_토글도_꺼져있다() {
setSharedPreferences(false)
onView(ViewMatchers.withId(R.id.action_setting)).perform(ViewActions.click())
onView(ViewMatchers.withId(R.id.setting_toggle))
.check(ViewAssertions.matches(ViewMatchers.isNotChecked()))
}

@Test
fun 설정_Fragment에서_저장된_세팅값이_true_토글도_켜져있다() {
setSharedPreferences(true)
onView(ViewMatchers.withId(R.id.action_setting)).perform(ViewActions.click())
onView(ViewMatchers.withId(R.id.setting_toggle))
.check(ViewAssertions.matches(ViewMatchers.isChecked()))
}

private fun setSharedPreferences(isAlarmOn: Boolean) {
val targetContext: Context = InstrumentationRegistry.getInstrumentation().targetContext

val preferencesEditor: SharedPreferences.Editor = PreferenceManager.getDefaultSharedPreferences(targetContext).edit()
preferencesEditor.clear()
preferencesEditor.putBoolean(SettingFragment.IS_ALARM_ON, isAlarmOn)
preferencesEditor.commit()
}
}
Loading

0 comments on commit 15fac5e

Please sign in to comment.