This commit is contained in:
Ваше Имя
2025-09-24 15:48:24 +04:00
parent 7b78d9bfc2
commit 3c9f2eaf15
8 changed files with 132 additions and 48 deletions
+7
View File
@@ -1,6 +1,7 @@
plugins { plugins {
alias(libs.plugins.android.application) alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.android)
id("org.jetbrains.kotlin.kapt")
} }
android { android {
@@ -45,4 +46,10 @@ dependencies {
testImplementation(libs.junit) testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.espresso.core)
// Room
val room_version = "2.8.0"
implementation("androidx.room:room-runtime:$room_version")
kapt("androidx.room:room-compiler:$room_version")
implementation("androidx.room:room-ktx:$room_version")
} }
-3
View File
@@ -2,9 +2,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<application <application
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
@@ -0,0 +1,25 @@
package com.example.myapplication
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context
@Database(entities = [NoteEntity::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun noteDao(): NoteDao
companion object {
@Volatile private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"my_database"
).build().also { INSTANCE = it }
}
}
}
}
@@ -1,57 +1,52 @@
package com.example.myapplication package com.example.myapplication
import android.Manifest
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.os.Bundle import android.os.Bundle
import android.widget.Button import android.widget.Button
import android.widget.ImageView import android.widget.EditText
import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.lifecycleScope
import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.launch
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
private lateinit var btnCamera: Button private lateinit var etInput: EditText
private lateinit var imageView: ImageView private lateinit var btnAdd: Button
private lateinit var recyclerView: RecyclerView
private lateinit var adapter: NoteAdapter
// Новый контракт private lateinit var db: AppDatabase
private val takePicturePreview = registerForActivityResult(
ActivityResultContracts.TakePicturePreview()
) { bitmap: Bitmap? ->
if (bitmap != null) {
imageView.setImageBitmap(bitmap)
} else {
Toast.makeText(this, "Фото не получено", Toast.LENGTH_SHORT).show()
}
}
// Запрос разрешения на камеру
private val requestCameraPermission = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted ->
if (granted) {
takePicturePreview.launch(null)
} else {
Toast.makeText(this, "Разрешение на камеру не выдано", Toast.LENGTH_SHORT).show()
}
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
btnCamera = findViewById(R.id.btnCamera) etInput = findViewById(R.id.etInput)
imageView = findViewById(R.id.imageView) btnAdd = findViewById(R.id.btnAdd)
recyclerView = findViewById(R.id.recyclerView)
btnCamera.setOnClickListener { adapter = NoteAdapter(emptyList())
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) recyclerView.layoutManager = LinearLayoutManager(this)
== PackageManager.PERMISSION_GRANTED recyclerView.adapter = adapter
) {
takePicturePreview.launch(null) db = AppDatabase.getDatabase(this)
} else {
requestCameraPermission.launch(Manifest.permission.CAMERA) // Добавляем заметку
btnAdd.setOnClickListener {
val text = etInput.text.toString()
if (text.isNotEmpty()) {
lifecycleScope.launch {
db.noteDao().insert(NoteEntity(text = text))
}
etInput.text.clear()
}
}
// Подписываемся на изменения
lifecycleScope.launch {
db.noteDao().getAll().collect { notes ->
adapter.update(notes)
} }
} }
} }
@@ -0,0 +1,10 @@
package com.example.myapplication
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "notes")
data class NoteEntity(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val text: String
)
@@ -0,0 +1,29 @@
package com.example.myapplication
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class NoteAdapter(private var notes: List<NoteEntity>) :
RecyclerView.Adapter<NoteAdapter.NoteViewHolder>() {
class NoteViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NoteViewHolder {
val textView = LayoutInflater.from(parent.context)
.inflate(android.R.layout.simple_list_item_1, parent, false) as TextView
return NoteViewHolder(textView)
}
override fun onBindViewHolder(holder: NoteViewHolder, position: Int) {
holder.textView.text = notes[position].text
}
override fun getItemCount() = notes.size
fun update(newNotes: List<NoteEntity>) {
notes = newNotes
notifyDataSetChanged()
}
}
@@ -0,0 +1,15 @@
package com.example.myapplication
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
import kotlinx.coroutines.flow.Flow
@Dao
interface NoteDao {
@Insert
suspend fun insert(note: NoteEntity)
@Query("SELECT * FROM notes")
fun getAll(): Flow<List<NoteEntity>>
}
+12 -6
View File
@@ -4,17 +4,23 @@
android:orientation="vertical" android:orientation="vertical"
android:padding="16dp"> android:padding="16dp">
<EditText
android:id="@+id/etInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Введите заметку" />
<Button <Button
android:id="@+id/btnCamera" android:id="@+id/btnAdd"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Сделать фото" /> android:layout_marginTop="12dp"
android:text="Добавить" />
<ImageView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/imageView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:scaleType="centerCrop" /> android:layout_weight="1" />
</LinearLayout> </LinearLayout>