forked from omni/OmniCards
feat: added card view with full brightness, and center no cards text
This commit is contained in:
@@ -17,6 +17,8 @@ composeUiTooling = "1.5.6"
|
|||||||
wearToolingPreview = "1.0.0"
|
wearToolingPreview = "1.0.0"
|
||||||
activityCompose = "1.13.0"
|
activityCompose = "1.13.0"
|
||||||
coreSplashscreen = "1.2.0"
|
coreSplashscreen = "1.2.0"
|
||||||
|
zxing = "3.5.3"
|
||||||
|
zxingAndroid = "4.3.0"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
|
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
|
||||||
@@ -41,6 +43,8 @@ compose-ui-tooling = { group = "androidx.wear.compose", name = "compose-ui-tooli
|
|||||||
androidx-wear-tooling-preview = { group = "androidx.wear", name = "wear-tooling-preview", version.ref = "wearToolingPreview" }
|
androidx-wear-tooling-preview = { group = "androidx.wear", name = "wear-tooling-preview", version.ref = "wearToolingPreview" }
|
||||||
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
|
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
|
||||||
androidx-core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "coreSplashscreen" }
|
androidx-core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "coreSplashscreen" }
|
||||||
|
zxing-core = { group = "com.google.zxing", name = "core", version.ref = "zxing" }
|
||||||
|
zxing-android = { group = "com.journeyapps", name = "zxing-android-embedded", version.ref = "zxingAndroid" }
|
||||||
|
|
||||||
[plugins]
|
[plugins]
|
||||||
android-application = { id = "com.android.application", version.ref = "agp" }
|
android-application = { id = "com.android.application", version.ref = "agp" }
|
||||||
|
|||||||
@@ -45,4 +45,6 @@ dependencies {
|
|||||||
testImplementation(libs.junit)
|
testImplementation(libs.junit)
|
||||||
androidTestImplementation(libs.androidx.espresso.core)
|
androidTestImplementation(libs.androidx.espresso.core)
|
||||||
androidTestImplementation(libs.androidx.junit)
|
androidTestImplementation(libs.androidx.junit)
|
||||||
|
implementation(libs.zxing.core)
|
||||||
|
implementation(libs.zxing.android)
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,9 @@
|
|||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Base.Theme.OmniCards">
|
android:theme="@style/Base.Theme.OmniCards">
|
||||||
|
<activity
|
||||||
|
android:name=".ShowCardActivity"
|
||||||
|
android:exported="false" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".AddCardActivity"
|
android:name=".AddCardActivity"
|
||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import androidx.activity.enableEdgeToEdge
|
|||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
|
import com.google.zxing.BarcodeFormat
|
||||||
|
|
||||||
class AddCardActivity : AppCompatActivity() {
|
class AddCardActivity : AppCompatActivity() {
|
||||||
private lateinit var db: DbHelper
|
private lateinit var db: DbHelper
|
||||||
@@ -30,7 +31,7 @@ class AddCardActivity : AppCompatActivity() {
|
|||||||
val cardCodeTypeSelector: Spinner = findViewById(R.id.cardCodeTypeSelector)
|
val cardCodeTypeSelector: Spinner = findViewById(R.id.cardCodeTypeSelector)
|
||||||
val saveCardButton: Button = findViewById(R.id.saveCardButton)
|
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)
|
val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, options)
|
||||||
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
|
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
|
||||||
cardCodeTypeSelector.adapter = adapter
|
cardCodeTypeSelector.adapter = adapter
|
||||||
@@ -38,7 +39,7 @@ class AddCardActivity : AppCompatActivity() {
|
|||||||
saveCardButton.setOnClickListener {
|
saveCardButton.setOnClickListener {
|
||||||
val cardName = cardNameInput.text.toString()
|
val cardName = cardNameInput.text.toString()
|
||||||
val cardValue = cardValueInput.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)
|
db.addCard(cardName, cardValue, cardCodeType)
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
package ru.omni_devel.cards
|
package ru.omni_devel.cards
|
||||||
|
|
||||||
enum class CodeType {
|
import com.google.zxing.BarcodeFormat
|
||||||
QR,
|
|
||||||
BAR,
|
|
||||||
}
|
|
||||||
|
|
||||||
class CardInfo (
|
class CardInfo (
|
||||||
val id: Int,
|
val id: Int,
|
||||||
val name: String,
|
val name: String,
|
||||||
|
val codeType: BarcodeFormat,
|
||||||
val codeValue: String,
|
val codeValue: String,
|
||||||
val codeType: CodeType,
|
|
||||||
)
|
)
|
||||||
@@ -4,10 +4,11 @@ import android.content.ContentValues
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.database.sqlite.SQLiteDatabase
|
import android.database.sqlite.SQLiteDatabase
|
||||||
import android.database.sqlite.SQLiteOpenHelper
|
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) {
|
class DbHelper(val context: Context, val factory: SQLiteDatabase.CursorFactory?) : SQLiteOpenHelper(context, "omni_cards", factory, 1) {
|
||||||
override fun onCreate(db: SQLiteDatabase?) {
|
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(
|
override fun onUpgrade(
|
||||||
@@ -18,7 +19,7 @@ class DbHelper(val context: Context, val factory: SQLiteDatabase.CursorFactory?)
|
|||||||
db!!.execSQL("DROP TABLE IF EXISTS cards")
|
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()
|
val values = ContentValues()
|
||||||
|
|
||||||
values.put("name", name)
|
values.put("name", name)
|
||||||
@@ -42,7 +43,7 @@ class DbHelper(val context: Context, val factory: SQLiteDatabase.CursorFactory?)
|
|||||||
cards.add(CardInfo(
|
cards.add(CardInfo(
|
||||||
id = cursor.getInt(cursor.getColumnIndexOrThrow("id")),
|
id = cursor.getInt(cursor.getColumnIndexOrThrow("id")),
|
||||||
name = cursor.getString(cursor.getColumnIndexOrThrow("name")),
|
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"))
|
codeValue = cursor.getString(cursor.getColumnIndexOrThrow("codeValue"))
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
@@ -52,4 +53,29 @@ class DbHelper(val context: Context, val factory: SQLiteDatabase.CursorFactory?)
|
|||||||
|
|
||||||
return cards
|
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.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.view.View
|
||||||
import android.widget.Button
|
import android.widget.Button
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
@@ -55,6 +56,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
text.text = "Add a card to get started"
|
text.text = "Add a card to get started"
|
||||||
text.layoutParams = params
|
text.layoutParams = params
|
||||||
|
text.textAlignment = View.TEXT_ALIGNMENT_CENTER
|
||||||
|
|
||||||
cardsList.addView(text)
|
cardsList.addView(text)
|
||||||
} else {
|
} else {
|
||||||
@@ -71,6 +73,14 @@ class MainActivity : AppCompatActivity() {
|
|||||||
button.layoutParams = params
|
button.layoutParams = params
|
||||||
button.cornerRadius = (12 * resources.displayMetrics.density).toInt()
|
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)
|
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>
|
||||||
@@ -55,4 +55,6 @@ dependencies {
|
|||||||
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
|
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
|
||||||
debugImplementation(libs.androidx.compose.ui.test.manifest)
|
debugImplementation(libs.androidx.compose.ui.test.manifest)
|
||||||
debugImplementation(libs.androidx.compose.ui.tooling)
|
debugImplementation(libs.androidx.compose.ui.tooling)
|
||||||
|
implementation(libs.zxing.core)
|
||||||
|
implementation(libs.zxing.android)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user