diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f88e35f..a65934a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ android:theme="@style/Theme.NoBet" tools:targetApi="31"> diff --git a/app/src/main/java/kr/hs/anu/nobet/presentation/screen/main/MainActivity.kt b/app/src/main/java/kr/hs/anu/nobet/presentation/screen/main/MainActivity.kt new file mode 100644 index 0000000..2b8f746 --- /dev/null +++ b/app/src/main/java/kr/hs/anu/nobet/presentation/screen/main/MainActivity.kt @@ -0,0 +1,119 @@ +package kr.hs.anu.nobet.presentation.screen.main + +import android.graphics.Color +import android.graphics.PorterDuff +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.PopupWindow +import android.widget.Toast +import androidx.activity.enableEdgeToEdge +import androidx.activity.viewModels +import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.toDrawable +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import kr.hs.anu.nobet.R +import kr.hs.anu.nobet.databinding.ActivityMainBinding + +class MainActivity : AppCompatActivity() { + + private val viewModel: MainViewModel by viewModels() + private lateinit var binding: ActivityMainBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + + // 버튼 상태값 읽고 값에 따라 상태 바꾸기 + viewModel.btnState.observe(this) { btnState -> + // 차단 전원 버튼 색 변경 + binding.layoutBlockBtn.setBackgroundResource( + if (btnState) R.drawable.block_btn_on else R.drawable.block_btn_background + ) + + // 차단된 사이트 수 텍스트 색 변경 + val block_txt_color = + ContextCompat.getColor(this, if (btnState) R.color.red else R.color.gray) + binding.tvBlockNum.setTextColor(block_txt_color) + + // 차단 전원 버튼 아이콘 색 변경 + val power_icon_color = + ContextCompat.getColor(this, if (btnState) R.color.white else R.color.black) + binding.ivPower.setColorFilter(power_icon_color, PorterDuff.Mode.SRC_IN) + + // 상담 정보 박스 색 변경 + binding.layoutGamblingPreventInfoBox.setBackgroundResource( + if (btnState) R.drawable.gambling_prevent_info_box_on else R.drawable.gambling_prevent_info_box + ) + + // 방어중 타이틀 텍스트 변경 + binding.tvViewTitle.text = + getString(if (btnState) R.string.on_view_title else R.string.off_view_title) + } + + // 전원 버튼 클릭했을때 상태변화 함수 뷰 모델에서 호출 + binding.layoutBlockBtn.setOnClickListener { + viewModel.toggle() + } + + // 메뉴 + binding.ivMenu.setOnClickListener { + showMenu(it) + } + } + + // 메뉴 커스텀 함수 + private fun showMenu(anchor: View) { + val popupMenu = LayoutInflater.from(anchor.context).inflate(R.layout.popup_menu, null) + + val popupWindow = PopupWindow( + popupMenu, + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + true + ) + + // 다른 영역 클릭시 닫힘 + popupWindow.isOutsideTouchable = true + popupWindow.elevation = 10f + + // popupWindow를 감싸는 배경, 배경이 있어야 다른 영역 클릭시 닫힘 + popupWindow.setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) + + // 기존 뷰 아래에 띄우기 + popupWindow.showAsDropDown(anchor, 0, 30) + + // TODO 이동 처리는 다음 branch 에서 화면 만들고 거기서 이어줄 예정 + popupMenu.findViewById(R.id.menu_login).setOnClickListener { + // TODO 로그인 화면으로 이동 + Toast.makeText(anchor.context, "로그인 클릭됨", Toast.LENGTH_SHORT).show() + popupWindow.dismiss() + } + + popupMenu.findViewById(R.id.menu_block_pass).setOnClickListener { + Toast.makeText(anchor.context, "차단 제외 하기", Toast.LENGTH_SHORT).show() + popupWindow.dismiss() + } + + popupMenu.findViewById(R.id.menu_log).setOnClickListener { + Toast.makeText(anchor.context, "필터링 로그", Toast.LENGTH_SHORT).show() + popupWindow.dismiss() + } + + popupMenu.findViewById(R.id.menu_report).setOnClickListener { + Toast.makeText(anchor.context, "문제 신고", Toast.LENGTH_SHORT).show() + popupWindow.dismiss() + } + } +} diff --git a/app/src/main/java/kr/hs/anu/nobet/presentation/screen/main/MainViewModel.kt b/app/src/main/java/kr/hs/anu/nobet/presentation/screen/main/MainViewModel.kt new file mode 100644 index 0000000..55a5211 --- /dev/null +++ b/app/src/main/java/kr/hs/anu/nobet/presentation/screen/main/MainViewModel.kt @@ -0,0 +1,17 @@ +package kr.hs.anu.nobet.presentation.screen.main + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class MainViewModel : ViewModel() { + + // 버튼 상태 + private val _btnState = MutableLiveData(false) + val btnState: LiveData = _btnState + + // 버튼 상태 관리 + fun toggle() { + _btnState.value = !(_btnState.value ?: false) + } +} diff --git a/app/src/main/java/kr/hs/anu/nobet/presentatoin/screen/main/MainActivity.kt b/app/src/main/java/kr/hs/anu/nobet/presentatoin/screen/main/MainActivity.kt deleted file mode 100644 index b88bdb5..0000000 --- a/app/src/main/java/kr/hs/anu/nobet/presentatoin/screen/main/MainActivity.kt +++ /dev/null @@ -1,25 +0,0 @@ -package kr.hs.anu.nobet.presentatoin.screen.main - -import android.os.Bundle -import androidx.activity.enableEdgeToEdge -import androidx.appcompat.app.AppCompatActivity -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat -import kr.hs.anu.nobet.R -import kr.hs.anu.nobet.databinding.ActivityMainBinding - -class MainActivity : AppCompatActivity() { - private lateinit var binding: ActivityMainBinding - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enableEdgeToEdge() - binding = ActivityMainBinding.inflate(layoutInflater) - setContentView(binding.root) - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> - val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) - insets - } - } -} diff --git a/app/src/main/res/drawable/block_btn_background.xml b/app/src/main/res/drawable/block_btn_background.xml new file mode 100644 index 0000000..2b18622 --- /dev/null +++ b/app/src/main/res/drawable/block_btn_background.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/block_btn_on.xml b/app/src/main/res/drawable/block_btn_on.xml new file mode 100644 index 0000000..abc1a8d --- /dev/null +++ b/app/src/main/res/drawable/block_btn_on.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gambling_prevent_info_box.xml b/app/src/main/res/drawable/gambling_prevent_info_box.xml new file mode 100644 index 0000000..fa75c2f --- /dev/null +++ b/app/src/main/res/drawable/gambling_prevent_info_box.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gambling_prevent_info_box_on.xml b/app/src/main/res/drawable/gambling_prevent_info_box_on.xml new file mode 100644 index 0000000..f405916 --- /dev/null +++ b/app/src/main/res/drawable/gambling_prevent_info_box_on.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/menu_background.xml b/app/src/main/res/drawable/menu_background.xml new file mode 100644 index 0000000..5d45ec4 --- /dev/null +++ b/app/src/main/res/drawable/menu_background.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/menu_box_background.xml b/app/src/main/res/drawable/menu_box_background.xml new file mode 100644 index 0000000..303b8ac --- /dev/null +++ b/app/src/main/res/drawable/menu_box_background.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4820839..061053e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,19 +1,150 @@ - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/popup_menu.xml b/app/src/main/res/layout/popup_menu.xml new file mode 100644 index 0000000..48fe542 --- /dev/null +++ b/app/src/main/res/layout/popup_menu.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a7aaeea..838b5fb 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,4 +5,5 @@ #BEBEBE #2F2F2F #FFFFFF + #0087C0 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f3ac112..94658ee 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,8 @@ NoBet + Gambling Site Blocker + 클릭 한 번으로 안심할 수 있어요 + 안전하게 방어중이에요! + 365일 오전 9시 ~ 오후 10시까지 국번 없이 “1336” + 온라인 상담 바로가기 \ No newline at end of file