Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions moti/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,16 @@
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-feature android:name="android.hardware.telephony" android:required="false"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />



<application
android:hardwareAccelerated="true"
android:allowBackup="true"
Expand Down Expand Up @@ -67,6 +77,7 @@
android:exported="false" />
<receiver android:name=".alarm.AlarmReceiver" />
<activity android:name=".ui.alarm.alarmCategory"/>
<activity android:name=".ui.afterAction.AfterAction"/>

<activity android:name=".ui.alarm.FullScreenAlarmActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
Expand Down
104 changes: 89 additions & 15 deletions moti/app/src/main/java/com/example/moti/alarm/AlarmShooter.kt
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package com.example.moti.alarm

import android.Manifest
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.location.Location
import android.media.RingtoneManager
import android.media.AudioManager
import android.os.Build
import android.os.PowerManager
import android.provider.Settings
import android.telephony.SmsManager
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import com.example.moti.R
import com.example.moti.data.Alarmtone
import com.example.moti.data.MotiDatabase
Expand All @@ -37,11 +42,14 @@ class AlarmShooter(private val context: Context) {

if (allAlarms != null) {
for (alarm in allAlarms) {
// 반볡 ꡬ뢄 및 μš”μΌ 확인 둜직 μΆ”κ°€ κ°€λŠ₯


// 반볡 ꡬ뢄 및 μš”μΌ 확인 둜직
Log.e("SLEEP", alarm.isSleep.toString())
if(alarm.isSleep){
if (alarm.isSleep) {
continue
}

val alarmLocation = Location("").apply {
latitude = alarm.location.x
longitude = alarm.location.y
Expand All @@ -52,40 +60,52 @@ class AlarmShooter(private val context: Context) {
val today = Week.values()[now.dayOfWeek.ordinal]

Log.e("REPEAT", alarm.isRepeat.toString())
if(!alarm.isRepeat){
//반볡 κΈ°λŠ₯이 μ—†λ‹€λ©΄ μ•žμœΌλ‘œ μšΈλ¦¬μ§€ μ•ŠλŠ”λ‹€!
if (!alarm.isRepeat) {
// 반볡 κΈ°λŠ₯이 μ—†λ‹€λ©΄ μ•žμœΌλ‘œ μšΈλ¦¬μ§€ μ•ŠλŠ”λ‹€!
alarm.isSleep = true
}
else if (alarm.repeatDay != null && !alarm.repeatDay!!.contains(today)) {
//반볡인데 repeatDay에 였늘이 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄ 패슀!!
} else if (alarm.repeatDay != null && !alarm.repeatDay!!.contains(today)) {
// 반볡인데 repeatDay에 였늘이 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄ 패슀!!
continue
}

if (distance <= alarm.radius && alarm.whenArrival || distance >= alarm.radius && !alarm.whenArrival) {
val now = LocalDateTime.now()
val lastNoti = alarm.lastNoti
val intervalMinutes = alarm.interval ?: 1440

if (lastNoti == null || ChronoUnit.MINUTES.between(lastNoti, now) >= intervalMinutes) {

if(alarm.hasBanner){
//λ°°λ„ˆ μ„€μ • on -> λ°°λ„ˆ μ•Œλ¦Ό
if (alarm.hasBanner) {
// λ°°λ„ˆ μ„€μ • on -> λ°°λ„ˆ μ•Œλ¦Ό
sendNotification(alarm)
}
else{
//μ „μ²΄ν™”λ©΄μ•Œλ¦Ό
} else {
// μ „μ²΄ν™”λ©΄μ•Œλ¦Ό
sendFullScreenAlarm(context, alarm)
}

alarm.lastNoti = now
database?.alarmDao()?.update(alarm)
}
}
if (alarm.isSilentMode) {
Log.d("AlarmShooter", "Silent mode is enabled. Performing silent mode action.")
setSilentMode()
}

if (alarm.isOnAppMode) {
Log.d("AlarmShooter", "App mode is enabled. Launching app.")
openApp(alarm.appPackageName)
}

if (alarm.phoneNumber != null && alarm.message != null) {
Log.d("AlarmShooter", "Sending SMS to ${alarm.phoneNumber}")
sendSMS(alarm.phoneNumber!!, alarm.message!!)
}
}
}
}
}
}


private fun sendFullScreenAlarm(context: Context, alarm: Alarm) {
Log.e("aa", "sendFullScreenAlarm22")
acquireWakeLock(context)
Expand Down Expand Up @@ -255,4 +275,58 @@ class AlarmShooter(private val context: Context) {

notificationManager.notify(alarm.alarmId.toInt() + 1024, notification)
}
fun setSilentMode() {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!notificationManager.isNotificationPolicyAccessGranted) {
// κΆŒν•œμ΄ μ—†λŠ” 경우 κΆŒν•œ μ„€μ • ν™”λ©΄μœΌλ‘œ 이동
val intent = Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
return
}
}

try {
audioManager.ringerMode = AudioManager.RINGER_MODE_SILENT
Log.d("AlarmShooter", "Phone set to silent mode")
} catch (e: SecurityException) {
Log.e("AlarmShooter", "Could not change ringer mode", e)
}
}

fun openApp(packageName: String?) {
if (packageName.isNullOrEmpty()) {
Log.e("AlarmShooter", "Package name is null or empty")
return
}

val packageManager = context.packageManager
val launchIntent = packageManager.getLaunchIntentForPackage(packageName)

if (launchIntent != null) {
launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(launchIntent)
Log.d("AlarmShooter", "Launched app: $packageName")
} else {
Log.e("AlarmShooter", "Cannot find app with package name: $packageName")
}
}

fun sendSMS(phoneNumber: String, message: String) {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED) {
try {
val smsManager = SmsManager.getDefault()
smsManager.sendTextMessage(phoneNumber, null, message, null, null)
Log.d("AlarmShooter", "SMS sent to $phoneNumber")
} catch (e: Exception) {
Log.e("AlarmShooter", "Failed to send SMS", e)
}
} else {
Log.e("AlarmShooter", "SMS permission not granted")
}
}

}
3 changes: 1 addition & 2 deletions moti/app/src/main/java/com/example/moti/data/MotiDatabase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,11 @@ import com.example.moti.data.dao.RecentLocationDao
import com.example.moti.data.dao.TagDao
import com.example.moti.data.entity.Alarm
import com.example.moti.data.entity.AlarmAndTag
import com.example.moti.data.entity.Location
import com.example.moti.data.entity.RecentLocation
import com.example.moti.data.entity.Tag

@Database(entities = [Alarm::class, AlarmAndTag::class, RecentLocation::class, Tag::class],
version = 7)
version = 8)
@TypeConverters(Converters::class)
abstract class MotiDatabase :RoomDatabase(){
abstract fun alarmDao():AlarmDao
Expand Down
26 changes: 22 additions & 4 deletions moti/app/src/main/java/com/example/moti/data/entity/Alarm.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.example.moti.data.entity

import android.graphics.Bitmap
import android.net.Uri
import androidx.room.Embedded
import androidx.room.Entity
Expand Down Expand Up @@ -29,7 +28,14 @@ data class Alarm (
@TypeConverters(AlarmtoneConverter::class)
var alarmtone: Alarmtone?,
var useVibration : Boolean,
var isSleep : Boolean
var isSleep : Boolean,
var isOnAppMode: Boolean, //μ•±μ—΄κΈ° μƒνƒœ μ €μž₯
var isMessageMode: Boolean, //λ©”μ‹œμ§€ μƒνƒœ μ €μž₯
var isSilentMode: Boolean, // 무음 λͺ¨λ“œ μƒνƒœ μ €μž₯
var phoneNumber: String?, // μ „ν™”λ²ˆν˜Έ μ €μž₯
var message: String?, // 문자 λ‚΄μ—­ μ €μž₯
var appPackageName: String? // μ•± νŒ¨ν‚€μ§€λͺ… μ €μž₯

) {
constructor(
title : String,
Expand All @@ -46,7 +52,13 @@ data class Alarm (
image : Uri?,
alarmtone: Alarmtone?,
useVibration : Boolean,
isSleep: Boolean
isSleep: Boolean,
isOnAppMode: Boolean,
isMesaageMode: Boolean,
isSilentMode: Boolean,
phoneNumber: String?,
message: String?,
appPackageName: String?
) : this(
0,
title,
Expand All @@ -63,6 +75,12 @@ data class Alarm (
image,
alarmtone,
useVibration,
isSleep
isSleep,
isOnAppMode,
isMesaageMode,
isSilentMode,
phoneNumber,
message,
appPackageName
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.SeekBar
import android.widget.TextView
import android.widget.Toast
Expand All @@ -44,6 +45,7 @@ import com.example.moti.data.repository.AlarmRepository
import com.example.moti.data.viewModel.RadioButtonViewModel
import com.example.moti.data.viewModel.RadiusViewModel
import com.example.moti.databinding.FragmentAddMemoBinding
import com.example.moti.ui.afterAction.AfterAction
import com.example.moti.ui.alarm.alarmCategory
import com.example.moti.ui.search.ReverseGeocoding
import com.google.android.material.bottomsheet.BottomSheetDialog
Expand Down Expand Up @@ -101,6 +103,14 @@ class AddLocationMemoFragment : BottomSheetDialogFragment(),

private var alarmtone : Alarmtone? = Alarmtone.Default;
private var useVibration : Boolean = true;
private var onAppMode : Boolean = false
private var messageMode : Boolean = false
private var silentMode : Boolean = false
private var phoneNum : String? = null
private var messageText : String? = null
private var appPackage : String? = null
private var contactName: String? = null
private var appName: String? = null

private var repeatChecked = false
private var tagChecked = true
Expand All @@ -118,7 +128,6 @@ class AddLocationMemoFragment : BottomSheetDialogFragment(),
private const val ARG_LNG = "lng"
private const val ARG_id = "id"
private const val REQUEST_CODE_ALARM_CATEGORY = 1
private const val ALARM_CATEGORY_REQUEST_CODE = 1001
fun newInstance(name: String, lat: Double, lng: Double,id:Long?): AddLocationMemoFragment {
val fragment = AddLocationMemoFragment()
val args = Bundle().apply {
Expand All @@ -140,6 +149,24 @@ class AddLocationMemoFragment : BottomSheetDialogFragment(),

private val reverseGeocoding = ReverseGeocoding(this)

private val startForResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
result.data?.let {
phoneNum = it.getStringExtra("contactPhone")
messageMode = it.getBooleanExtra("messageSwitchOn", false)
messageText = it.getStringExtra("messageText")
onAppMode = it.getBooleanExtra("onAppSwitchOn", false)
appPackage = it.getStringExtra("selectedAppPackageName")
silentMode = it.getBooleanExtra("silentSwitchOn", false)
contactName = it.getStringExtra("contactName")
appName = it.getStringExtra("appName")
}
}
}



override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_ALARM_CATEGORY && resultCode == Activity.RESULT_OK) {
Expand Down Expand Up @@ -213,6 +240,7 @@ class AddLocationMemoFragment : BottomSheetDialogFragment(),
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initUi()

binding.inOrOutRadioGroup.setOnCheckedChangeListener { radioGroup, i ->
when(i) {
binding.inRadioBtn.id -> {
Expand Down Expand Up @@ -308,7 +336,13 @@ class AddLocationMemoFragment : BottomSheetDialogFragment(),
image = imageUri,
alarmtone = alarmtone,
useVibration = useVibration,
isSleep = false
isSleep = false,
isOnAppMode = onAppMode,
isMesaageMode = messageMode,
isSilentMode = silentMode,
phoneNumber = phoneNum,
message = messageText,
appPackageName = appPackage
)
if (alarmId != null) {
alarm.alarmId = alarmId as Long
Expand Down Expand Up @@ -353,7 +387,25 @@ class AddLocationMemoFragment : BottomSheetDialogFragment(),
// ν•„μš”ν•œ 경우 μ‚¬μš©
}
})
val afterActionLinearLayout: LinearLayout = view.findViewById(R.id.afterActionLinearLayout)
afterActionLinearLayout.setOnClickListener {
val intent = Intent(activity, AfterAction::class.java)
intent.putExtra("silentSwitchOn", silentMode)
intent.putExtra("contactPhone", phoneNum)
intent.putExtra("messageSwitchOn", messageMode)
intent.putExtra("messageText", messageText)
intent.putExtra("onAppSwitchOn", onAppMode)
intent.putExtra("selectedAppPackageName", appPackage)
intent.putExtra("contactName", contactName)
intent.putExtra("appName", appName)
startForResult.launch(intent)
}




}

private fun initUi() {
radioButtonViewModel.setSelectedOption(1)
binding.locationTitleEditText.setText(name)
Expand Down
Loading