feat: added card view with full brightness, and center no cards text

This commit is contained in:
2026-06-09 14:13:32 +03:00
parent 0e9cbcccfe
commit 1b0d535912
11 changed files with 186 additions and 10 deletions
+2
View File
@@ -45,4 +45,6 @@ dependencies {
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(libs.androidx.junit)
implementation(libs.zxing.core)
implementation(libs.zxing.android)
}
+3
View File
@@ -11,6 +11,9 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Base.Theme.OmniCards">
<activity
android:name=".ShowCardActivity"
android:exported="false" />
<activity
android:name=".AddCardActivity"
android:exported="false" />
@@ -9,6 +9,7 @@ import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.google.zxing.BarcodeFormat
class AddCardActivity : AppCompatActivity() {
private lateinit var db: DbHelper
@@ -30,7 +31,7 @@ class AddCardActivity : AppCompatActivity() {
val cardCodeTypeSelector: Spinner = findViewById(R.id.cardCodeTypeSelector)
val saveCardButton: Button = findViewById(R.id.saveCardButton)
val options = CodeType.entries.map { it.name }
val options = BarcodeFormat.entries.map { it.name }
val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, options)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
cardCodeTypeSelector.adapter = adapter
@@ -38,7 +39,7 @@ class AddCardActivity : AppCompatActivity() {
saveCardButton.setOnClickListener {
val cardName = cardNameInput.text.toString()
val cardValue = cardValueInput.text.toString()
val cardCodeType = CodeType.valueOf(cardCodeTypeSelector.selectedItem.toString())
val cardCodeType = BarcodeFormat.valueOf(cardCodeTypeSelector.selectedItem.toString())
db.addCard(cardName, cardValue, cardCodeType)
@@ -1,13 +1,10 @@
package ru.omni_devel.cards
enum class CodeType {
QR,
BAR,
}
import com.google.zxing.BarcodeFormat
class CardInfo (
val id: Int,
val name: String,
val codeType: BarcodeFormat,
val codeValue: String,
val codeType: CodeType,
)
@@ -4,10 +4,11 @@ import android.content.ContentValues
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import com.google.zxing.BarcodeFormat
class DbHelper(val context: Context, val factory: SQLiteDatabase.CursorFactory?) : SQLiteOpenHelper(context, "omni_cards", factory, 1) {
override fun onCreate(db: SQLiteDatabase?) {
db!!.execSQL("CREATE TABLE IF NOT EXISTS cards (id SERIAL PRIMARY KEY, name TEXT, codeType TEXT, codeValue TEXT)")
db!!.execSQL("CREATE TABLE IF NOT EXISTS cards (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, codeType TEXT, codeValue TEXT)")
}
override fun onUpgrade(
@@ -18,7 +19,7 @@ class DbHelper(val context: Context, val factory: SQLiteDatabase.CursorFactory?)
db!!.execSQL("DROP TABLE IF EXISTS cards")
}
fun addCard(name: String, codeValue: String, codeType: CodeType) {
fun addCard(name: String, codeValue: String, codeType: BarcodeFormat) {
val values = ContentValues()
values.put("name", name)
@@ -42,7 +43,7 @@ class DbHelper(val context: Context, val factory: SQLiteDatabase.CursorFactory?)
cards.add(CardInfo(
id = cursor.getInt(cursor.getColumnIndexOrThrow("id")),
name = cursor.getString(cursor.getColumnIndexOrThrow("name")),
codeType = CodeType.valueOf(cursor.getString(cursor.getColumnIndexOrThrow("codeType"))),
codeType = BarcodeFormat.valueOf(cursor.getString(cursor.getColumnIndexOrThrow("codeType"))),
codeValue = cursor.getString(cursor.getColumnIndexOrThrow("codeValue"))
))
}
@@ -52,4 +53,29 @@ class DbHelper(val context: Context, val factory: SQLiteDatabase.CursorFactory?)
return cards
}
fun getCard(id: Int): CardInfo? {
val db = this.readableDatabase
val cursor = db.rawQuery("SELECT * FROM cards WHERE id = ?", arrayOf(id.toString()))
if (!cursor.moveToFirst()) {
cursor.close()
db.close()
return null
}
val cardInfo = CardInfo(
id = cursor.getInt(cursor.getColumnIndexOrThrow("id")),
name = cursor.getString(cursor.getColumnIndexOrThrow("name")),
codeType = BarcodeFormat.valueOf(cursor.getString(cursor.getColumnIndexOrThrow("codeType"))),
codeValue = cursor.getString(cursor.getColumnIndexOrThrow("codeValue"))
)
cursor.close()
db.close()
return cardInfo
}
}
@@ -2,6 +2,7 @@ package ru.omni_devel.cards
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
@@ -55,6 +56,7 @@ class MainActivity : AppCompatActivity() {
text.text = "Add a card to get started"
text.layoutParams = params
text.textAlignment = View.TEXT_ALIGNMENT_CENTER
cardsList.addView(text)
} else {
@@ -71,6 +73,14 @@ class MainActivity : AppCompatActivity() {
button.layoutParams = params
button.cornerRadius = (12 * resources.displayMetrics.density).toInt()
button.setOnClickListener {
val intent = Intent(this, ShowCardActivity::class.java)
intent.putExtra("cardId", card.id)
startActivity(intent)
}
cardsList.addView(button)
}
}
@@ -0,0 +1,66 @@
package ru.omni_devel.cards
import android.os.Bundle
import android.view.WindowManager
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
class ShowCardActivity : AppCompatActivity() {
private lateinit var db: DbHelper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_show_card)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
db = DbHelper(this, null)
}
override fun onResume() {
super.onResume()
setBrightness(1.0f)
renderCard()
}
override fun onPause() {
super.onPause()
setBrightness(WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE)
}
private fun renderCard() {
val cardId = intent.getIntExtra("cardId", 0)
val cardInfo = db.getCard(cardId)
if (cardInfo == null) {
Toast.makeText(this, "cardInfo is null", Toast.LENGTH_LONG).show()
return
}
val cardCodeView: ImageView = findViewById(R.id.cardCodeView)
val code = generateCode(cardInfo.codeValue, cardInfo.codeType)
cardCodeView.setImageBitmap(code)
}
private fun setBrightness(level: Float) {
val params = window.attributes
params.screenBrightness = level
window.attributes = params
}
}
@@ -0,0 +1,13 @@
package ru.omni_devel.cards
import android.graphics.Bitmap
import com.google.zxing.BarcodeFormat
import com.google.zxing.MultiFormatWriter
import com.journeyapps.barcodescanner.BarcodeEncoder
fun generateCode(value: String, format: BarcodeFormat): Bitmap {
val writer = MultiFormatWriter()
val matrix = writer.encode(value, format, 600, 300)
return BarcodeEncoder().createBitmap(matrix)
}
@@ -0,0 +1,52 @@
<?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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AddCardActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="OmniCards"
android:textColor="@color/text_primary"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="@+id/toolbar2"
app:layout_constraintStart_toStartOf="@+id/toolbar2"
app:layout_constraintTop_toTopOf="@+id/toolbar2" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar2"
app:layout_constraintVertical_bias="0.0">
<ImageView
android:id="@+id/cardCodeView"
android:layout_width="match_parent"
android:layout_height="300dp"
android:scaleType="fitCenter"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>