Skip to content

Instantly share code, notes, and snippets.

@amoozeshbebin
Created November 23, 2023 15:45
Show Gist options
  • Save amoozeshbebin/17242ec225e56aa9952e3b0f5a095175 to your computer and use it in GitHub Desktop.
Save amoozeshbebin/17242ec225e56aa9952e3b0f5a095175 to your computer and use it in GitHub Desktop.
Language Booster App
Activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background"
tools:context=".MainActivity">
<TextView
android:id="@+id/languageBooster"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="28dp"
android:fontFamily="@font/advent_pro_bold"
android:text="@string/language_booster"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<soup.neumorphism.NeumorphCardView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:padding="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/languageBooster"
app:neumorph_shadowColorDark="@color/dark_shadow"
app:neumorph_shadowColorLight="@color/light_shadow"
app:neumorph_shapeAppearance="@style/NeumorphismCard">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/main_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent" />
</soup.neumorphism.NeumorphCardView>
<soup.neumorphism.NeumorphFloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:contentDescription="@string/app_name"
android:padding="28dp"
android:src="@drawable/baseline_add_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:neumorph_shadowColorDark="@color/dark_shadow"
app:neumorph_shadowColorLight="@color/light_shadow"
app:neumorph_shadowElevation="5dp"
app:neumorph_shapeAppearance="@style/NeumorphismCard"
tools:ignore="ImageContrastCheck" />
</androidx.constraintlayout.widget.ConstraintLayout>
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
MainActivity.kt:
package com.iliya.dictianorylanguagebooster
import android.annotation.SuppressLint
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.floatingactionbutton.FloatingActionButton
import soup.neumorphism.NeumorphFloatingActionButton
class MainActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private lateinit var fab: NeumorphFloatingActionButton
private lateinit var adapter: RecyclerAdapter
private lateinit var wordDBHelper: WordDBHelper
private val listItems = ArrayList<Word>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init() {
bindViews()
wordDBHelper = WordDBHelper(this)
adapter = RecyclerAdapter(this, listItems,wordDBHelper)
val layoutManager = LinearLayoutManager(this)
recyclerView.layoutManager = layoutManager
recyclerView.adapter = adapter
fab.setOnClickListener {
startActivity(Intent(this, AddWordActivity::class.java))
}
}
fun bindViews() {
recyclerView = findViewById(R.id.main_list)
fab = findViewById(R.id.fab)
}
@SuppressLint("NotifyDataSetChanged")
override fun onResume() {
super.onResume()
listItems.clear()
listItems.addAll(wordDBHelper.getAllWords())
adapter.notifyDataSetChanged()
}
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
RecyclerAdapter.kt:
package com.iliya.dictianorylanguagebooster
import android.content.Context
import android.provider.UserDictionary.Words
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.lifecycle.viewmodel.viewModelFactory
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import soup.neumorphism.NeumorphImageButton
import soup.neumorphism.NeumorphImageView
class RecyclerAdapter(private val contex:Context,private val words: ArrayList<Word>,private val wordDBHelper: WordDBHelper) :
RecyclerView.Adapter<RecyclerAdapter.wordHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): wordHolder {
val inflater = LayoutInflater.from(parent.context)
.inflate(R.layout.recycler_item_layout, parent, false)
return wordHolder(inflater)
}
override fun onBindViewHolder(holder: wordHolder, position: Int) {
val item = words[position]
holder.keyword.text = "${item.keyword}:${item.meaning}"
changestar(holder, item)
if(position == words.size -1 ){
holder.border.visibility =View.GONE
}
holder.star.setOnClickListener{
item.star = !item.star
wordDBHelper.updateWord(item)
changestar(holder, item)
}
Glide
.with(contex)
.load("https://picsum.photos/70?rand="+System.currentTimeMillis())
.centerCrop()
.placeholder(R.drawable.rwerwe)
.into(holder.img);
}
private fun changestar(
holder: wordHolder,
item: Word
) {
holder.star.setImageResource(
if (item.star) R.drawable.baseline_star_24
else R.drawable.baseline_star_border_24
)
}
override fun getItemCount(): Int {
return words.size
}
class wordHolder(v: View) : RecyclerView.ViewHolder(v), View.OnClickListener {
var keyword: TextView = v.findViewById(R.id.text_view)
var star: NeumorphImageButton = v.findViewById(R.id.starbtn)
var img: NeumorphImageView = v.findViewById(R.id.img)
var border: View = v.findViewById(R.id.border)
override fun onClick(v: View?) {
TODO("Not yet implemented")
}
}
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
WordDBHelper.kt:
package com.iliya.dictianorylanguagebooster
import android.annotation.SuppressLint
import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import java.lang.Exception
class WordDBHelper(context: Context) :
SQLiteOpenHelper(context, database_name, null, database_version) {
override fun onCreate(db: SQLiteDatabase?) {
db?.execSQL(SQL_CREATE_QUERY)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
db?.execSQL(SQL_DELETE_QUERY)
onCreate(db)
}
fun insertWord(word: Word): Boolean {
return try {
val db = writableDatabase
val valuse = ContentValues()
valuse.put(DBContract.WordEntity.COLUMN_KEYWORD, word.keyword)
valuse.put(DBContract.WordEntity.COLUMN_MEANING, word.meaning)
valuse.put(DBContract.WordEntity.COLUMN_STAR, if (word.star) 1 else 0)
db.insert(DBContract.WordEntity.TABLE_NAME, null, valuse)
true
} catch (e: Exception) {
false
}
}
@SuppressLint("Range")
fun getAllWords(): ArrayList<Word> {
val words = ArrayList<Word>()
val db = readableDatabase
var cursor: Cursor? = null
try {
cursor = db.rawQuery("SELECT * FROM ${DBContract.WordEntity.TABLE_NAME}", null)
} catch (e: Exception) {
db.execSQL(SQL_CREATE_QUERY)
return ArrayList()
}
var keyword: String
var meaning: String
var stared: Boolean
if (cursor.moveToFirst()) {
while (!cursor.isAfterLast) {
keyword =
cursor.getString(cursor.getColumnIndex(DBContract.WordEntity.COLUMN_KEYWORD))
meaning =
cursor.getString(cursor.getColumnIndex(DBContract.WordEntity.COLUMN_MEANING))
stared =
cursor.getInt(cursor.getColumnIndex(DBContract.WordEntity.COLUMN_STAR)) == 1
words.add(Word(keyword, meaning, stared))
cursor.moveToNext()
}
}
return words
}
fun updateWord(word: Word): Boolean {
return try {
val db = writableDatabase
val valuse = ContentValues()
valuse.put(DBContract.WordEntity.COLUMN_MEANING, word.meaning)
valuse.put(DBContract.WordEntity.COLUMN_STAR, if (word.star) 1 else 0)
val where = "${DBContract.WordEntity.COLUMN_KEYWORD} = ?"
val args = arrayOf(word.keyword)
db.update(DBContract.WordEntity.TABLE_NAME, valuse, where, args)
true
} catch (e: Exception) {
false
}
}
companion object {
const val database_version = 1
const val database_name = "LanguageBooster.db"
private val SQL_CREATE_QUERY = "CREATE TABLE ${DBContract.WordEntity.TABLE_NAME}" +
" (${DBContract.WordEntity.COLUMN_KEYWORD} TEXT PRIMARY KEY," +
" ${DBContract.WordEntity.COLUMN_MEANING} TEXT ," +
" ${DBContract.WordEntity.COLUMN_STAR} NUMERIC)"
private val SQL_DELETE_QUERY = "DROP TABLE IF EXISTS ${DBContract.WordEntity.TABLE_NAME}"
}
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
DBContract.object:
package com.iliya.dictianorylanguagebooster
import android.provider.BaseColumns
object DBContract {
class WordEntity : BaseColumns {
companion object{
val TABLE_NAME = "words"
val COLUMN_KEYWORD = "keyword"
val COLUMN_MEANING = "meaning"
val COLUMN_STAR = "star"
}
}
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
Word.kt:
package com.iliya.dictianorylanguagebooster
data class Word(
var keyword: String,
var meaning: String,
var star: Boolean
)
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
recycler_item_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="8dp"
android:paddingTop="3dp"
android:paddingRight="8dp"
android:paddingBottom="3dp">
<soup.neumorphism.NeumorphCardView
android:id="@+id/imgHolder"
android:layout_width="70dp"
android:layout_height="70dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:neumorph_shadowColorDark="@color/dark_shadow"
app:neumorph_shadowColorLight="@color/light_shadow"
app:neumorph_shadowElevation="4dp"
app:neumorph_shapeAppearance="@style/NeumorphismCard"
app:neumorph_shapeType="flat">
<soup.neumorphism.NeumorphImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</soup.neumorphism.NeumorphCardView>
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="84dp"
android:layout_marginTop="20dp"
android:fontFamily="@font/iransans"
android:text="@string/text_view"
android:textSize="20sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<soup.neumorphism.NeumorphImageButton
android:id="@+id/starbtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:background="@color/background"
android:contentDescription="@string/imagebottom"
android:padding="18dp"
android:src="@drawable/baseline_star_border_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.576"
app:neumorph_shadowColorDark="@color/dark_shadow"
app:neumorph_shadowColorLight="@color/light_shadow"
app:neumorph_shadowElevation="5dp"
app:neumorph_shapeAppearance="@style/NeumorphismCard"
app:neumorph_shapeType="basin"
tools:ignore="ImageContrastCheck" />
<View
android:id="@+id/border"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dark_shadow"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/imgHolder" />
</androidx.constraintlayout.widget.ConstraintLayout>
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
activity_splash_screen.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".splashscreen">
<soup.neumorphism.NeumorphImageButton
android:id="@+id/starbtn"
android:layout_width="94dp"
android:layout_height="97dp"
android:layout_marginTop="240dp"
android:background="@color/background"
android:contentDescription="@string/imagebottom"
android:padding="18dp"
android:src="@drawable/logo2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:neumorph_shadowColorDark="@color/dark_shadow"
app:neumorph_shadowColorLight="@color/light_shadow"
app:neumorph_shadowElevation="5dp"
app:neumorph_shapeAppearance="@style/NeumorphismCard"
app:neumorph_shapeType="basin"
tools:ignore="ImageContrastCheck" />
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="68dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/starbtn" />
</androidx.constraintlayout.widget.ConstraintLayout>
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
splashscreen.kt:
package com.iliya.dictianorylanguagebooster
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.os.Looper
class splashscreen : AppCompatActivity() {
val waitsecount:Long = 500
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splashscreen)
Handler(Looper.getMainLooper()).postDelayed({
val intent = Intent(this,MainActivity::class.java)
startActivity(intent)
finish()
},waitsecount)
}
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
AddWordactivity.kt:
package com.iliya.dictianorylanguagebooster
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
class AddWordActivity : AppCompatActivity() {
private lateinit var keyword:EditText
private lateinit var meaning:EditText
private lateinit var btn_add_word:Button
private lateinit var wordDBHelper:WordDBHelper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_add_word)
init()
}
private fun init(){
bindViews()
wordDBHelper = WordDBHelper(this)
btn_add_word.setOnClickListener {
if(keyword.text.isEmpty()){
Toast.makeText(this,"Please Enter Word",Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if(meaning.text.isEmpty()){
Toast.makeText(this,"Please Enter Meaning",Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
val word = Word(keyword.text.toString(),meaning.text.toString(),false)
val result = wordDBHelper.insertWord(word)
if(result){
Toast.makeText(this,"New Word Added",Toast.LENGTH_SHORT).show()
finish()
}else{
Toast.makeText(this,"Error on adding New Word!!",Toast.LENGTH_SHORT).show()
}
}
}
fun bindViews(){
keyword = findViewById(R.id.edittextword)
meaning = findViewById(R.id.edittextmeaning)
btn_add_word = findViewById(R.id.btn_add_word)
}
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
activity_add_word.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AddWordActivity">
<soup.neumorphism.NeumorphCardView
android:id="@+id/neumorphCardView"
android:layout_width="260dp"
android:layout_height="175dp"
android:layout_marginTop="92dp"
android:padding="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.485"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:neumorph_shadowColorDark="@color/dark_shadow"
app:neumorph_shadowColorLight="@color/light_shadow"
app:neumorph_shapeAppearance="@style/NeumorphismCard">
<EditText
android:id="@+id/edittextword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:autofillHints=""
android:ems="10"
android:hint="@string/word"
android:inputType="text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.384"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
tools:ignore="LabelFor,TouchTargetSizeCheck" />
<EditText
android:id="@+id/edittextmeaning"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="70dp"
android:ems="10"
android:hint="@string/meaning"
android:inputType="text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.41"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
tools:ignore="Autofill,LabelFor,TouchTargetSizeCheck" />
</soup.neumorphism.NeumorphCardView>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="36dp"
android:fontFamily="@font/advent_pro_bold"
android:text="@string/add_new_word_to_your_dictionary"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.496"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<soup.neumorphism.NeumorphButton
android:id="@+id/btn_add_word"
android:layout_width="122dp"
android:layout_height="81dp"
android:layout_marginTop="36dp"
android:gravity="center"
android:padding="20dp"
android:text="@string/add_word"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.463"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/neumorphCardView"
app:neumorph_shadowColorDark="@color/dark_shadow"
app:neumorph_shadowColorLight="@color/light_shadow"
app:neumorph_shadowElevation="5dp"
app:neumorph_shapeAppearance="@style/NeumorphismCard">
</soup.neumorphism.NeumorphButton>
</androidx.constraintlayout.widget.ConstraintLayout>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment