finalise app
* add NewWordActivity * Connect with the data
This commit is contained in:
parent
5a44ede11f
commit
a78c8d0148
|
@ -10,6 +10,9 @@
|
|||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme">
|
||||
<activity
|
||||
android:name=".NewWordActivity"
|
||||
android:exported="true" />
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true">
|
||||
|
|
|
@ -1,17 +1,61 @@
|
|||
package world.whatever.task_roomdb
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import android.os.Bundle
|
||||
import android.widget.Toast
|
||||
import androidx.activity.viewModels
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
|
||||
private val newWordActivityRequestCode = 1
|
||||
private val wordViewModel: WordViewModel by viewModels {
|
||||
WordViewModelFactory((application as WordsApplication).repository)
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_main)
|
||||
|
||||
val recyclerView = findViewById<RecyclerView>(R.id.recyclerview)
|
||||
val adapter = WordListAdapter()
|
||||
recyclerView.adapter = adapter
|
||||
recyclerView.layoutManager = LinearLayoutManager(this)
|
||||
|
||||
val fab = findViewById<FloatingActionButton>(R.id.fab)
|
||||
fab.setOnClickListener {
|
||||
val intent = Intent(this@MainActivity, NewWordActivity::class.java)
|
||||
startActivityForResult(intent, newWordActivityRequestCode)
|
||||
}
|
||||
|
||||
|
||||
// Add an observer on the LiveData returned by getAlphabetizedWords.
|
||||
// The onChanged() method fires when the observed data changes and the activity is
|
||||
// in the foreground.
|
||||
wordViewModel.allWords.observe(owner = this) { words ->
|
||||
// Update the cached copy of the words in the adapter.
|
||||
words.let { adapter.submitList(it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, intentData: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, intentData)
|
||||
|
||||
if (requestCode == newWordActivityRequestCode && resultCode == Activity.RESULT_OK) {
|
||||
intentData?.getStringExtra(NewWordActivity.EXTRA_REPLY)?.let { reply ->
|
||||
val word = Word(reply)
|
||||
wordViewModel.insert(word)
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(
|
||||
applicationContext,
|
||||
R.string.empty_not_saved,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
package world.whatever.task_roomdb
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import android.os.Bundle
|
||||
import android.text.TextUtils
|
||||
import android.widget.Button
|
||||
import android.widget.EditText
|
||||
class NewWordActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var editWordView: EditText
|
||||
|
||||
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_new_word)
|
||||
editWordView = findViewById(R.id.edit_word)
|
||||
|
||||
val button = findViewById<Button>(R.id.button_save)
|
||||
button.setOnClickListener {
|
||||
val replyIntent = Intent()
|
||||
if (TextUtils.isEmpty(editWordView.text)) {
|
||||
setResult(Activity.RESULT_CANCELED, replyIntent)
|
||||
} else {
|
||||
val word = editWordView.text.toString()
|
||||
replyIntent.putExtra(EXTRA_REPLY, word)
|
||||
setResult(Activity.RESULT_OK, replyIntent)
|
||||
}
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val EXTRA_REPLY = "com.example.android.wordlistsql.REPLY"
|
||||
}
|
||||
}
|
|
@ -5,4 +5,4 @@ import androidx.room.Entity
|
|||
import androidx.room.PrimaryKey
|
||||
|
||||
@Entity(tableName = "word_table")
|
||||
class Word(@PrimaryKey @ColumnInfo(name = "word") val word: String)
|
||||
data class Word(@PrimaryKey @ColumnInfo(name = "word") val word: String)
|
||||
|
|
|
@ -9,6 +9,8 @@ import kotlinx.coroutines.flow.Flow
|
|||
@Dao
|
||||
interface WordDao {
|
||||
|
||||
// The flow always holds/caches latest version of data. Notifies its observers when the
|
||||
// data has changed.
|
||||
@Query("SELECT * FROM word_table ORDER BY word ASC")
|
||||
fun getAlphabetizedWords(): Flow<List<Word>>
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ import androidx.recyclerview.widget.DiffUtil
|
|||
import androidx.recyclerview.widget.ListAdapter
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
|
||||
class WordListAdapter : ListAdapter<Word, WordListAdapter.WordViewHolder>(WordsComparator()) {
|
||||
class WordListAdapter : ListAdapter<Word, WordListAdapter.WordViewHolder>(WORDS_COMPARATOR) {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WordViewHolder {
|
||||
return WordViewHolder.create(parent)
|
||||
|
@ -35,13 +35,15 @@ class WordListAdapter : ListAdapter<Word, WordListAdapter.WordViewHolder>(WordsC
|
|||
}
|
||||
}
|
||||
|
||||
class WordsComparator : DiffUtil.ItemCallback<Word>() {
|
||||
override fun areItemsTheSame(oldItem: Word, newItem: Word): Boolean {
|
||||
return oldItem === newItem
|
||||
}
|
||||
companion object {
|
||||
private val WORDS_COMPARATOR = object : DiffUtil.ItemCallback<Word>() {
|
||||
override fun areItemsTheSame(oldItem: Word, newItem: Word): Boolean {
|
||||
return oldItem === newItem
|
||||
}
|
||||
|
||||
override fun areContentsTheSame(oldItem: Word, newItem: Word): Boolean {
|
||||
return oldItem.word == newItem.word
|
||||
override fun areContentsTheSame(oldItem: Word, newItem: Word): Boolean {
|
||||
return oldItem.word == newItem.word
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,8 +3,6 @@ package world.whatever.task_roomdb
|
|||
import androidx.annotation.WorkerThread
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
// Declares the DAO as a private property in the constructor. Pass in the DAO
|
||||
// instead of the whole database, because you only need access to the DAO
|
||||
class WordRepository(private val wordDao: WordDao) {
|
||||
|
||||
// Room executes all queries on a separate thread.
|
||||
|
|
|
@ -32,7 +32,6 @@ abstract class WordRoomDatabase : RoomDatabase() {
|
|||
wordDao.insert(word)
|
||||
word = Word("World!")
|
||||
wordDao.insert(word)
|
||||
|
||||
word = Word("whatever I was supposed to add here")
|
||||
wordDao.insert(word)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/edit_word"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="@dimen/min_height"
|
||||
android:fontFamily="sans-serif-light"
|
||||
android:hint="@string/hint_word"
|
||||
android:inputType="textAutoComplete"
|
||||
android:layout_margin="@dimen/big_padding"
|
||||
android:textSize="18sp"
|
||||
android:importantForAutofill="no" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button_save"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/design_default_color_primary"
|
||||
android:text="@string/button_save"
|
||||
android:layout_margin="@dimen/big_padding"
|
||||
android:textColor="@color/buttonLabel" />
|
||||
|
||||
</LinearLayout>
|
|
@ -7,4 +7,5 @@
|
|||
<color name="teal_700">#FF018786</color>
|
||||
<color name="black">#FF000000</color>
|
||||
<color name="white">#FFFFFFFF</color>
|
||||
<color name="buttonLabel">#FFFFFF</color>
|
||||
</resources>
|
|
@ -1,4 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="big_padding">16dp</dimen>
|
||||
<dimen name="min_height">48dp</dimen>
|
||||
</resources>
|
|
@ -1,4 +1,7 @@
|
|||
<resources>
|
||||
<string name="app_name">task_roomdb</string>
|
||||
<string name="add_word">add</string>
|
||||
<string name="hint_word">Word...</string>
|
||||
<string name="button_save">Save</string>
|
||||
<string name="empty_not_saved">Word not saved because it is empty.</string>
|
||||
<string name="add_word">Add word</string>
|
||||
</resources>
|
|
@ -6,7 +6,7 @@ buildscript {
|
|||
}
|
||||
dependencies {
|
||||
classpath "com.android.tools.build:gradle:7.0.2"
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31"
|
||||
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
|
Loading…
Reference in New Issue