diff --git a/moti/app/src/main/AndroidManifest.xml b/moti/app/src/main/AndroidManifest.xml index ea822d0..1b97353 100644 --- a/moti/app/src/main/AndroidManifest.xml +++ b/moti/app/src/main/AndroidManifest.xml @@ -16,6 +16,16 @@ + + + + + + + + + + = 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) @@ -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") + } + } + } diff --git a/moti/app/src/main/java/com/example/moti/data/MotiDatabase.kt b/moti/app/src/main/java/com/example/moti/data/MotiDatabase.kt index f7e24b4..fa052fb 100644 --- a/moti/app/src/main/java/com/example/moti/data/MotiDatabase.kt +++ b/moti/app/src/main/java/com/example/moti/data/MotiDatabase.kt @@ -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 diff --git a/moti/app/src/main/java/com/example/moti/data/entity/Alarm.kt b/moti/app/src/main/java/com/example/moti/data/entity/Alarm.kt index 17da370..f2aa6e9 100644 --- a/moti/app/src/main/java/com/example/moti/data/entity/Alarm.kt +++ b/moti/app/src/main/java/com/example/moti/data/entity/Alarm.kt @@ -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 @@ -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, @@ -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, @@ -63,6 +75,12 @@ data class Alarm ( image, alarmtone, useVibration, - isSleep + isSleep, + isOnAppMode, + isMesaageMode, + isSilentMode, + phoneNumber, + message, + appPackageName ) } \ No newline at end of file diff --git a/moti/app/src/main/java/com/example/moti/ui/addMemo/AddLocationMemoFragment.kt b/moti/app/src/main/java/com/example/moti/ui/addMemo/AddLocationMemoFragment.kt index 4ec44d8..fd4fc46 100644 --- a/moti/app/src/main/java/com/example/moti/ui/addMemo/AddLocationMemoFragment.kt +++ b/moti/app/src/main/java/com/example/moti/ui/addMemo/AddLocationMemoFragment.kt @@ -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 @@ -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 @@ -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 @@ -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 { @@ -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) { @@ -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 -> { @@ -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 @@ -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) diff --git a/moti/app/src/main/java/com/example/moti/ui/afterAction/AfterAction.kt b/moti/app/src/main/java/com/example/moti/ui/afterAction/AfterAction.kt new file mode 100644 index 0000000..5b46e24 --- /dev/null +++ b/moti/app/src/main/java/com/example/moti/ui/afterAction/AfterAction.kt @@ -0,0 +1,218 @@ +package com.example.moti.ui.afterAction + +import android.Manifest +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager +import android.graphics.drawable.Drawable +import android.os.Bundle +import android.provider.ContactsContract +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ArrayAdapter +import android.widget.EditText +import android.widget.ImageButton +import android.widget.ImageView +import android.widget.TextView +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.SwitchCompat +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import com.example.moti.R + +class AfterAction : AppCompatActivity() { + private lateinit var silentDetailTextView: TextView + private lateinit var silentActionSwitch: SwitchCompat + private lateinit var openAppTextView: TextView + private lateinit var openAppSwitch: SwitchCompat + private lateinit var messageTextView: TextView + private lateinit var messageSwitch: SwitchCompat + private lateinit var messageEditText: EditText + private var contactName: String? = null + private var silentSwitchOn: Boolean = false + private var contactPhone: String? = null + private var messageSwitchOn: Boolean = false + private var messageText: String? = null + private var onAppSwitchOn: Boolean = false + private var selectedAppPackageName: String? = null + private var appName: String? = null + + companion object { + private const val PERMISSION_REQUEST_READ_CONTACTS = 100 + private const val PICK_CONTACT_REQUEST = 1 + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_after_action) + + val btnBack: ImageButton = findViewById(R.id.btnBack) + btnBack.setOnClickListener { + val resultIntent = Intent().apply { + messageText = messageEditText.text.toString() + putExtra("contactPhone", contactPhone) + putExtra("messageSwitchOn", messageSwitchOn) + putExtra("messageText", messageText) + putExtra("onAppSwitchOn", onAppSwitchOn) + putExtra("selectedAppPackageName", selectedAppPackageName) + putExtra("silentSwitchOn", silentSwitchOn) + putExtra("contactName", contactName) + putExtra("appName", appName) + } + setResult(Activity.RESULT_OK, resultIntent) + finish() + } + + // 스위치와 텍스트뷰 초기화 + messageTextView = findViewById(R.id.messageDetailTextView) + messageSwitch = findViewById(R.id.messageAction) + silentDetailTextView = findViewById(R.id.silentDetailTextView) + silentActionSwitch = findViewById(R.id.silentAction) + openAppTextView = findViewById(R.id.openAppDetailTextView) + openAppSwitch = findViewById(R.id.openAppAction) + messageEditText = findViewById(R.id.messageEditText) + + // Intent에서 데이터를 가져옴 + silentSwitchOn = intent.getBooleanExtra("silentSwitchOn", false) + contactPhone = intent.getStringExtra("contactPhone") + messageSwitchOn = intent.getBooleanExtra("messageSwitchOn", false) + messageText = intent.getStringExtra("messageText") + onAppSwitchOn = intent.getBooleanExtra("onAppSwitchOn", false) + selectedAppPackageName = intent.getStringExtra("selectedAppPackageName") + appName = intent.getStringExtra("appName") + contactName = intent.getStringExtra("contactName") + + // 초기 UI 상태 설정 + silentDetailTextView.text = if (silentSwitchOn) "켜짐" else "꺼짐" + silentActionSwitch.isChecked = silentSwitchOn + + messageSwitch.isChecked = messageSwitchOn + messageTextView.text = if (messageSwitchOn) "$contactName, $contactPhone" else "없음" + messageEditText.setText(messageText) + messageEditText.visibility = if (messageSwitchOn) View.VISIBLE else View.GONE + + openAppSwitch.isChecked = onAppSwitchOn + openAppTextView.text = if (onAppSwitchOn) appName else "없음" + + // 스위치 상태 변화 감지 + silentActionSwitch.setOnCheckedChangeListener { _, isChecked -> + silentDetailTextView.text = if (isChecked) "켜짐" else "꺼짐" + silentSwitchOn = isChecked + } + + openAppSwitch.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + showAppList() + onAppSwitchOn = true + } else { + openAppTextView.text = "없음" + onAppSwitchOn = false + } + } + + messageSwitch.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + messageTextView.text = "켜짐" + sendSMS() + messageEditText.visibility = EditText.VISIBLE + messageSwitchOn = true + } else { + messageTextView.text = "없음" + messageEditText.visibility = EditText.GONE + messageEditText.text.clear() + messageSwitchOn = false + messageText = null + } + } + } + + private fun showAppList() { + val pm = packageManager + val apps = pm.getInstalledApplications(PackageManager.GET_META_DATA) + .filter { it.flags and ApplicationInfo.FLAG_SYSTEM == 0 } + + val appNames = apps.map { pm.getApplicationLabel(it).toString() } + val appIcons = apps.map { pm.getApplicationIcon(it) } + val appPackages = apps.map { it.packageName } + + val builder = AlertDialog.Builder(this) + builder.setTitle("앱 선택") + + val appList = appNames.mapIndexed { index, name -> + name to appIcons[index] + } + + val adapter = AppListAdapter(this, appList) + builder.setAdapter(adapter) { _, which -> + val selectedAppName = appNames[which] + selectedAppPackageName = appPackages[which] + appName = appNames[which] + openAppTextView.text = selectedAppName + } + + builder.setNegativeButton("취소", null) + builder.show() + } + + private fun sendSMS() { + val status = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) + if (status == PackageManager.PERMISSION_GRANTED) { + Log.d("test", "permission granted") + val intent = Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI) + startActivityForResult(intent, PICK_CONTACT_REQUEST) + } else { + ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_CONTACTS), PERMISSION_REQUEST_READ_CONTACTS) + Log.d("test", "permission denied") + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == PERMISSION_REQUEST_READ_CONTACTS) { + if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { + sendSMS() + } else { + Log.d("Permission", "Permission denied to read contacts") + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == PICK_CONTACT_REQUEST && resultCode == RESULT_OK) { + data?.data?.let { contactUri -> + val projection = arrayOf(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER) + contentResolver.query(contactUri, projection, null, null, null)?.use { cursor -> + if (cursor.moveToFirst()) { + val nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME) + val numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) + contactName = cursor.getString(nameIndex) + contactPhone = cursor.getString(numberIndex) + Log.d("Contact Info", "Name: $contactName, Phone: $contactPhone") + messageTextView.text = "$contactName, $contactPhone" + } + } + } + } + } +} + +class AppListAdapter(context: Context, private val appList: List>) : + ArrayAdapter>(context, R.layout.app_list_item, appList) { + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view = convertView ?: LayoutInflater.from(context).inflate(R.layout.app_list_item, parent, false) + val appName = view.findViewById(R.id.appName) + val appIcon = view.findViewById(R.id.appIcon) + + val (name, icon) = appList[position] + appName.text = name + appIcon.setImageDrawable(icon) + + return view + } +} diff --git a/moti/app/src/main/java/com/example/moti/ui/main/MainActivity.kt b/moti/app/src/main/java/com/example/moti/ui/main/MainActivity.kt index d381c74..f67d651 100644 --- a/moti/app/src/main/java/com/example/moti/ui/main/MainActivity.kt +++ b/moti/app/src/main/java/com/example/moti/ui/main/MainActivity.kt @@ -1,6 +1,7 @@ package com.example.moti.ui.main import android.Manifest +import android.app.NotificationManager import android.content.Context import android.content.Intent import android.content.pm.PackageManager @@ -30,6 +31,8 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.time.LocalDateTime +import android.provider.Settings + class MainActivity : AppCompatActivity() { @@ -39,6 +42,7 @@ class MainActivity : AppCompatActivity() { private lateinit var combinedVibration: CombinedVibration private var currentFragmentTag: String? = null private var dataSaved = false + private val PERMISSION_REQUEST_CODE = 1 companion object { private const val LOCATION_PERMISSION_REQUEST_CODE = 321 @@ -79,7 +83,33 @@ class MainActivity : AppCompatActivity() { vibrator = getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager vibrationEffect = VibrationEffect.createOneShot(5L, VibrationEffect.DEFAULT_AMPLITUDE) combinedVibration = CombinedVibration.createParallel(vibrationEffect) + checkAndRequestPermissions() + } + private fun checkAndRequestPermissions() { + val requiredPermissions = arrayOf( + Manifest.permission.READ_CONTACTS, + Manifest.permission.SEND_SMS + ) + + val permissionsToRequest = requiredPermissions.filter { + ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED + } + + if (permissionsToRequest.isNotEmpty()) { + ActivityCompat.requestPermissions(this, permissionsToRequest.toTypedArray(), PERMISSION_REQUEST_CODE) + } + + // Notification Policy Access 권한 확인 + val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + 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 + startActivity(intent) + } + } } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // 현재 표시된 프래그먼트의 태그를 저장 @@ -240,7 +270,13 @@ class MainActivity : AppCompatActivity() { image = null, alarmtone= null, useVibration =false, - isSleep = false + isSleep = false, + isOnAppMode = false, + isMesaageMode = false, + isSilentMode = false, + phoneNumber = null, + message = null, + appPackageName = null ) val list: List = listOf() CoroutineScope(Dispatchers.IO).launch { diff --git a/moti/app/src/main/res/layout/activity_after_action.xml b/moti/app/src/main/res/layout/activity_after_action.xml new file mode 100644 index 0000000..07baa1d --- /dev/null +++ b/moti/app/src/main/res/layout/activity_after_action.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/moti/app/src/main/res/layout/activity_main.xml b/moti/app/src/main/res/layout/activity_main.xml index de518f1..66a282e 100644 --- a/moti/app/src/main/res/layout/activity_main.xml +++ b/moti/app/src/main/res/layout/activity_main.xml @@ -30,5 +30,10 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"/> + + \ No newline at end of file diff --git a/moti/app/src/main/res/layout/app_list_item.xml b/moti/app/src/main/res/layout/app_list_item.xml new file mode 100644 index 0000000..647f6e7 --- /dev/null +++ b/moti/app/src/main/res/layout/app_list_item.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/moti/app/src/main/res/layout/dialog_app_chooser.xml b/moti/app/src/main/res/layout/dialog_app_chooser.xml new file mode 100644 index 0000000..82159a7 --- /dev/null +++ b/moti/app/src/main/res/layout/dialog_app_chooser.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/moti/app/src/main/res/layout/fragment_add_memo.xml b/moti/app/src/main/res/layout/fragment_add_memo.xml index 6183642..b3220c2 100644 --- a/moti/app/src/main/res/layout/fragment_add_memo.xml +++ b/moti/app/src/main/res/layout/fragment_add_memo.xml @@ -452,58 +452,7 @@ android:layout_marginStart="20dp" android:layout_marginEnd="20dp"/> - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/moti/app/src/main/res/layout/item_app.xml b/moti/app/src/main/res/layout/item_app.xml new file mode 100644 index 0000000..b563062 --- /dev/null +++ b/moti/app/src/main/res/layout/item_app.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/moti/app/src/main/res/layout/item_app_info.xml b/moti/app/src/main/res/layout/item_app_info.xml new file mode 100644 index 0000000..6c7144d --- /dev/null +++ b/moti/app/src/main/res/layout/item_app_info.xml @@ -0,0 +1,23 @@ + + + + + + + +