• AndroidManifest.
xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="[Link]
package="[Link]">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/[Link]">
<!-- Activities -->
<activity android:name=".AdminActivity" />
<activity android:name=".OperatorActivity" />
<activity android:name=".GameDataActivity" />
<activity android:name=".OperatorTotalsActivity" />
<activity android:name=".OperatorViewDataActivity" />
<!-- LoginActivity is now the launcher -->
<activity android:name=".LoginActivity"
android:exported="true">
<intent-filter>
<action android:name="[Link]" />
<category android:name="[Link]" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="[Link]" />
<uses-permission android:name="[Link].ACCESS_NETWORK_STATE" />
</manifest>
ktlin+ java -
[Link] – with time span
package [Link]
import [Link]
import [Link]
import [Link].*
import [Link]
import [Link]
import [Link]
import [Link]
import [Link].*
class OperatorActivity : AppCompatActivity() {
private lateinit var database: DatabaseReference
private lateinit var operatorId: String
private val pendingMap = linkedMapOf<String, Int>() // preserves order
private lateinit var listAdapter: ArrayAdapter<String>
private val games = listOf(
"Milan Day", "Kalyan", "Main Mumbai", "Milan Night",
"Sridevi", "Time Bazar", "Rajdhani Day", "Rajdhani Night"
)
private val types = listOf(
"Jodi", "Open", "Close",
"Single Patti", "Double Patti", "Triple Patti",
"Half Sangam", "Full Sangam", "Jackpot"
)
override fun onCreate(savedInstanceState: Bundle?) {
[Link](savedInstanceState)
setContentView([Link].activity_operator)
database = [Link]().reference
operatorId = [Link]().currentUser?.uid ?: "unknown"
val spinnerGames = findViewById<Spinner>([Link])
val spinnerGameType = findViewById<Spinner>([Link])
val etPlayNo = findViewById<EditText>([Link])
val etAmount = findViewById<EditText>([Link])
val btnAddPlay = findViewById<Button>([Link])
val listView = findViewById<ListView>([Link])
val btnSubmitPlays = findViewById<Button>([Link])
val btnViewMyData = findViewById<Button>([Link])
val tvRestriction = findViewById<TextView>([Link])
// Setup spinners
[Link] = ArrayAdapter(this, [Link].simple_spinner_dropdown_item, games)
[Link] = ArrayAdapter(this, [Link].simple_spinner_dropdown_item, types)
// Update restriction notice on game change
[Link] = object : [Link] {
override fun onItemSelected(parent: AdapterView<*>, view: [Link]?, pos: Int, id: Long) {
val game = games[pos]
[Link] = restrictionMessage(game)
}
override fun onNothingSelected(parent: AdapterView<*>) {}
}
// List adapter for pending plays
listAdapter = ArrayAdapter(this, [Link].simple_list_item_1, mutableListOf())
[Link] = listAdapter
[Link] {
val playNoRaw = [Link]().trim()
val amount = [Link]().trim().toIntOrNull()
if ([Link]() || amount == null || amount <= 0) {
[Link](this, "Enter valid Play No & Amount", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (*$"))) {
[Link](this, "Invalid Play No format", Toast.LENGTH_LONG).show()
return@setOnClickListener
}
val selectedGame = [Link]?.toString() ?: games[0]
val selectedType = [Link]?.toString() ?: types[0]
val key = "$selectedGame|$selectedType|$playNoRaw"
pendingMap[key] = (pendingMap[key] ?: 0) + amount
refreshPlayList()
[Link]()
[Link]()
}
// Remove entry on long press
[Link] { _, _, pos, _ ->
val key = [Link](pos)
if (key != null) {
[Link](key)
refreshPlayList()
}
true
}
[Link] {
if ([Link]()) {
[Link](this, "No plays to submit", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
val toSubmit = [Link]()
var submitted = 0
var totalAmount = 0
for ((key, amt) in toSubmit) {
val parts = [Link]("|")
if ([Link] < 3) continue
val game = parts[0]; val type = parts[1]; val playNo = parts[2]
if (!canSubmitPlay(game, type)) continue
val gameRef = [Link]("games").child(game).child(type).child(operatorId)
val entry = mapOf("amount" to amt, "ts" to [Link]())
[Link](playNo).push().setValue(entry)
submitted++; totalAmount += amt
[Link](key)
}
refreshPlayList()
[Link](this, "Submitted $submitted plays, Total ₹$totalAmount", Toast.LENGTH_LONG).show()
}
[Link] {
startActivity(Intent(this, OperatorViewDataActivity::[Link]))
}
}
private fun refreshPlayList() {
[Link]()
for ((key, amt) in pendingMap) {
val parts = [Link]("|")
[Link]("${parts[0]} • ${parts[1]} • ${parts[2]} → ₹$amt")
}
[Link]()
}
private fun restrictionMessage(game: String): String = when (game) {
"Milan Day" -> "⚠ Submit Open till 1:45 PM, Close till 3:45 PM"
"Kalyan" -> "⚠ Submit Open till 4:00 PM, Close till 5:00 PM"
"Main Mumbai" -> "⚠ Submit Open till 9:00 PM, Close till 11:30 PM"
"Milan Night" -> "⚠ Submit Open till 8:40 PM, Close till 10:50 PM"
"Sridevi" -> "⚠ Submit Open till 11:30 AM, Close till 12:30 PM"
"Time Bazar" -> "⚠ Submit Open till 12:30 PM, Close till 2:45 PM"
"Rajdhani Day" -> "⚠ Submit Open till 2:30 PM, Close till 4:30 PM"
"Rajdhani Night" -> "⚠ Submit Open till 8:30 PM, Close till 11:15 PM"
else -> ""
}
private fun canSubmitPlay(game: String, type: String): Boolean {
val cal = [Link]([Link]("Asia/Kolkata"))
val h = [Link](Calendar.HOUR_OF_DAY)
val m = [Link]([Link])
fun before(hh: Int, mm: Int) = h < hh || (h == hh && m <= mm)
return when (game) {
"Milan Day" -> if (type == "Close") before(15,45) else before(13,45)
"Kalyan" -> if (type == "Close") before(17,0) else before(16,0)
"Main Mumbai" -> if (type == "Close") before(23,30) else before(21,0)
"Milan Night" -> if (type == "Close") before(22,50) else before(20,40)
"Sridevi" -> if (type == "Close") before(12,30) else before(11,30)
"Time Bazar" -> if (type == "Close") before(14,45) else before(12,30)
"Rajdhani Day" -> if (type == "Close") before(16,30) else before(14,30)
"Rajdhani Night" -> if (type == "Close") before(23,15) else before(20,30)
else -> true
}
}
override fun onBackPressed() {
[Link]()
[Link]().signOut()
}
}
xlm file
activity_operator.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<!-- Game Selection -->
<Spinner
android:id="@+id/spinnerGames"
android:layout_width="match_parent"
android:layout_height="56dp"
android:spinnerMode="dropdown"
android:layout_marginBottom="8dp" />
<!-- Game Type Selection -->
<Spinner
android:id="@+id/spinnerGameType"
android:layout_width="match_parent"
android:layout_height="56dp"
android:spinnerMode="dropdown"
android:layout_marginBottom="8dp" />
<!-- Restriction Notice -->
<TextView
android:id="@+id/tvRestrictionNotice"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="⚠ Select a game to see submission times"
android:textColor="@android:color/holo_red_dark"
android:padding="8dp"
android:layout_marginBottom="12dp" />
<!-- Play No input -->
<EditText
android:id="@+id/etPlayNo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Play Number (e.g. 3-555)"
android:minHeight="48dp"
android:padding="12dp"
android:inputType="text"
android:digits="0123456789-"
android:layout_marginBottom="8dp" />
<!-- Amount input -->
<EditText
android:id="@+id/etAmount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Amount"
android:minHeight="48dp"
android:padding="12dp"
android:inputType="number"
android:layout_marginBottom="12dp" />
<!-- Add Play -->
<Button
android:id="@+id/btnAddPlay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add Play" />
<!-- List of temporary plays -->
<ListView
android:id="@+id/listPlays"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:dividerHeight="1dp"
android:layout_marginTop="8dp" />
<!-- Submit -->
<Button
android:id="@+id/btnSubmitPlays"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Submit Plays" />
<!-- View my submitted data -->
<Button
android:id="@+id/btnViewMyData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="View My Submitted Data"
android:layout_marginTop="12dp" />
</LinearLayout>
[Link]
package [Link]
import [Link]
import [Link]
import [Link].*
import [Link]
import [Link]
import [Link].*
class AdminActivity : AppCompatActivity() {
private lateinit var spinnerGames: Spinner
private lateinit var tvTotalAmount: TextView
private lateinit var btnViewGameData: Button
private lateinit var btnViewOperatorTotals: Button
private lateinit var btnCleanupData: Button
private lateinit var database: DatabaseReference
private var totalsListener: ValueEventListener? = null
private val games = listOf(
"Milan Day", "Kalyan", "Main Mumbai", "Milan Night",
"Sridevi", "Time Bazar", "Rajdhani Day", "Rajdhani Night"
)
private var selectedGame: String = games[0]
override fun onCreate(savedInstanceState: Bundle?) {
[Link](savedInstanceState)
setContentView([Link].activity_admin)
spinnerGames = findViewById([Link])
tvTotalAmount = findViewById([Link])
btnViewGameData = findViewById([Link])
btnViewOperatorTotals = findViewById([Link])
btnCleanupData = findViewById([Link])
database = [Link]().getReference("games")
[Link] = ArrayAdapter(this, [Link].simple_spinner_dropdown_item, games)
[Link] = object : [Link] {
override fun onItemSelected(parent: AdapterView<*>, view: [Link]?, pos: Int, id: Long) {
selectedGame = games[pos]
attachTotalsListener(selectedGame)
}
override fun onNothingSelected(parent: AdapterView<*>) {}
}
[Link] {
startActivity(Intent(this, GameDataActivity::[Link]))
}
[Link] {
startActivity(Intent(this, OperatorTotalsActivity::[Link]))
}
[Link] {
cleanupOldData()
}
//✅ Modern back press handling
[Link](this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// Optional: logout or just finish activity
finish()
}
})
}
private fun attachTotalsListener(game: String) {
totalsListener?.let { [Link](game).removeEventListener(it) }
totalsListener = object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (![Link]()) {
[Link] = "No data found for $game"
return
}
val typeTotals = mutableMapOf<String, Int>()
var grandTotal = 0
for (typeSnap in [Link]) {
val typeName = [Link] ?: continue
var typeSum = 0
for (op in [Link]) {
for (play in [Link]) {
for (entry in [Link]) {
val amt = [Link]("amount").getValue(Int::[Link]) ?: 0
typeSum += amt
grandTotal += amt
}
}
}
typeTotals[typeName] = typeSum
}
val sb = StringBuilder("Totals for $game:\n")
[Link] { (type, sum) ->
[Link]("• $type: ₹$sum\n")
}
[Link]("\nGrand Total: ₹$grandTotal")
[Link] = [Link]()
}
override fun onCancelled(error: DatabaseError) {
[Link] = "⚠ DB Error: ${[Link]}"
}
}
[Link](game).addValueEventListener(totalsListener!!)
}
private fun cleanupOldData() {
val cutoff = [Link]() - (12 * 60 * 60 * 1000)
for (game in games) {
[Link](game)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
for (type in [Link]) {
for (op in [Link]) {
for (play in [Link]) {
for (entry in [Link]) {
val ts = [Link]("ts").getValue(Long::[Link]) ?: 0L
if (ts < cutoff) {
[Link]()
}
}
}
}
}
}
override fun onCancelled(error: DatabaseError) {}
})
}
}
[Link](this, " 🧹 Old data (>12h) cleaned!", Toast.LENGTH_LONG).show()
override fun onDestroy() {
[Link]()
totalsListener?.let {
[Link](selectedGame).removeEventListener(it)
}
}
}
xlm -
activity_admin.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Admin Dashboard"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginBottom="16dp" />
<!-- Game selection -->
<Spinner
android:id="@+id/spinnerGames"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:padding="12dp"
android:layout_marginBottom="12dp" />
<!-- Display total -->
<TextView
android:id="@+id/tvTotalAmount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Total: ₹0"
android:textSize="18sp"
android:textStyle="bold"
android:padding="8dp"
android:background="@android:color/darker_gray"
android:textColor="@android:color/black" />
<!-- Buttons -->
<Button
android:id="@+id/btnViewGameData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="View Game Data"
android:layout_marginTop="16dp" />
<Button
android:id="@+id/btnViewOperatorTotals"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="View Operator Totals"
android:layout_marginTop="16dp"
android:padding="16dp"
android:backgroundTint="@color/purple_500"
android:textColor="@android:color/white" />
<!-- Cleanup Button -->
<Button
android:id="@+id/btnCleanupData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Cleanup Old Data (12h)"
android:layout_marginTop="16dp"
android:padding="16dp"
android:backgroundTint="@android:color/holo_red_dark"
android:textColor="@android:color/white" />
</LinearLayout>
[Link]
package [Link]
import [Link]
import [Link]
import [Link]
import [Link].*
import [Link]
import [Link]
import [Link]
import [Link].*
class GameDataActivity : AppCompatActivity() {
private lateinit var spinnerGame: Spinner
private lateinit var spinnerType: Spinner
private lateinit var rvData: RecyclerView
private lateinit var tvTotal: TextView
private lateinit var btnShare: Button
private lateinit var adapter: GameDataAdapter
private lateinit var db: DatabaseReference
private var lastReport: String = ""
private val games = listOf(
"Milan Day", "Kalyan", "Main Mumbai", "Milan Night",
"Sridevi", "Time Bazar", "Rajdhani Day", "Rajdhani Night"
)
private val types = listOf(
"All",
"Jodi", "Open", "Close",
"Single Patti", "Double Patti", "Triple Patti",
"Half Sangam", "Full Sangam", "Jackpot"
)
override fun onCreate(savedInstanceState: Bundle?) {
[Link](savedInstanceState)
setContentView([Link].activity_game_data)
db = [Link]().reference
spinnerGame = findViewById([Link])
spinnerType = findViewById([Link])
rvData = findViewById([Link])
tvTotal = findViewById([Link])
btnShare = findViewById([Link])
[Link] = LinearLayoutManager(this)
adapter = GameDataAdapter()
[Link] = adapter
[Link] = ArrayAdapter(this, [Link].simple_spinner_dropdown_item, games)
[Link] = ArrayAdapter(this, [Link].simple_spinner_dropdown_item, types)
val listener = object : [Link] {
override fun onItemSelected(parent: AdapterView<*>, view: View?, pos: Int, id: Long) {
val game = [Link]?.toString() ?: return
val type = [Link]?.toString() ?: "All"
loadGameData(game, type)
}
override fun onNothingSelected(parent: AdapterView<*>) {}
}
[Link] = listener
[Link] = listener
[Link] { shareReport() }
}
private fun loadGameData(game: String, typeFilter: String) {
[Link]("games").child(game).addListenerForSingleValueEvent(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val totals = mutableMapOf<String, Int>()
var grandTotal = 0
[Link](" 📊
val sb = StringBuilder()
Game Data Report\n")
[Link]("Game: $game\nType: $typeFilter\n")
[Link]("-------------------\n")
for (typeSnap in [Link]) {
val typeName = [Link] ?: continue
if (typeFilter != "All" && typeFilter != typeName) continue
for (opSnap in [Link]) {
for (playNoSnap in [Link]) {
val playNo = [Link] ?: continue
var sum = 0
for (entry in [Link]) {
val amt = [Link]("amount").getValue(Int::[Link]) ?: 0
sum += amt
}
if (sum > 0) {
val key = "$playNo ($typeName)"
totals[key] = (totals[key] ?: 0) + sum
grandTotal += sum
}
}
}
}
val rows = [Link] { PlayEntry([Link], [Link]) }
[Link](rows)
if ([Link]()) {
[Link] = "No data"
lastReport = ""
} else {
[Link]([Link]("\n") { "${[Link]} : ₹${[Link]}" })
[Link]("\n\nGRAND TOTAL: ₹$grandTotal")
[Link] = "Overall Total: ₹$grandTotal"
lastReport = [Link]()
}
}
override fun onCancelled(error: DatabaseError) {
[Link](this@GameDataActivity, "Error: ${[Link]}", Toast.LENGTH_SHORT).show()
}
})
}
private fun shareReport() {
if ([Link]()) {
[Link](this, "No data to share", Toast.LENGTH_SHORT).show()
return
}
val i = Intent(Intent.ACTION_SEND)
[Link] = "text/plain"
[Link](Intent.EXTRA_TEXT, lastReport)
try { startActivity(i) }
catch (e: Exception) { [Link](this, "No share app found", Toast.LENGTH_SHORT).show() }
}
}
activity_game_data.xml,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<!-- Game Spinner -->
<Spinner
android:id="@+id/spinnerSelectGame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:padding="12dp"
android:spinnerMode="dropdown" />
<!-- Type Spinner -->
<Spinner
android:id="@+id/spinnerSelectType"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:padding="12dp"
android:layout_marginTop="12dp"
android:spinnerMode="dropdown" />
<!-- Recycler -->
<[Link]
android:id="@+id/rvGameData"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="12dp" />
<!-- Totals -->
<TextView
android:id="@+id/tvTotalAmountGame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/overall_total_placeholder"
android:textSize="16sp"
android:textStyle="bold"
android:gravity="center_horizontal"
android:padding="12dp" />
<!-- Share -->
<Button
android:id="@+id/btnShareGameData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:text="@string/share_report"
android:layout_marginTop="12dp" />
</LinearLayout>
[Link]
package [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
class GameDataAdapter : [Link]<[Link]>() {
private val items = mutableListOf<PlayEntry>()
class ViewHolder(itemView: View) : [Link](itemView) {
val tvPlayNo: TextView = [Link]([Link])
val tvAmount: TextView = [Link]([Link])
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val v = [Link]([Link]).inflate([Link].item_game_data, parent, false)
return ViewHolder(v)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val e = items[position]
[Link] = [Link]
[Link] = "₹${[Link]}"
}
override fun getItemCount(): Int = [Link]
fun updateData(newItems: List<PlayEntry>) {
[Link]()
[Link](newItems)
notifyDataSetChanged()
}
}
[Link]
package [Link]
import [Link]
import [Link]
import [Link].*
import [Link]
import [Link]
import [Link]
class LoginActivity : AppCompatActivity() {
private lateinit var etEmail: EditText
private lateinit var etPassword: EditText
private lateinit var btnLogin: Button
private lateinit var auth: FirebaseAuth
override fun onCreate(savedInstanceState: Bundle?) {
[Link](savedInstanceState)
setContentView([Link].login_activity)
auth = [Link]()
etEmail = findViewById([Link])
etPassword = findViewById([Link])
btnLogin = findViewById([Link])
[Link] { loginUser() }
}
private fun loginUser() {
val email = [Link]().trim()
val password = [Link]().trim()
if ([Link]() || [Link]()) {
[Link](this, "Enter Email and Password", Toast.LENGTH_SHORT).show()
return
}
[Link](email, password)
.addOnSuccessListener { result ->
val uid = [Link]?.uid ?: return@addOnSuccessListener
[Link]().getReference("users")
.child(uid).child("role").get()
.addOnSuccessListener { roleSnap ->
val role = [Link](String::[Link]) ?: "operator"
if (role == "admin") {
startActivity(Intent(this, AdminActivity::[Link]))
} else {
val intent = Intent(this, OperatorActivity::[Link])
[Link]("operatorId", uid)
startActivity(intent)
}
finish()
}
}
.addOnFailureListener {
[Link](this, "Login failed: ${[Link]}", Toast.LENGTH_SHORT).show()
}
}
}
login_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:gravity="center"
android:orientation="vertical"
android:padding="24dp">
<!-- App Title -->
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GAME CHANGER"
android:textSize="28sp"
android:textColor="#1A73E8"
android:fontFamily="@font/poppins_bold"
android:layout_marginBottom="36dp" />
<!-- Email -->
<EditText
android:id="@+id/etEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:hint="Email"
android:inputType="textEmailAddress"
android:padding="12dp"
android:background="@android:drawable/edit_text"
android:fontFamily="@font/poppins_regular" />
<!-- Password -->
<EditText
android:id="@+id/etPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:hint="Password"
android:inputType="textPassword"
android:padding="12dp"
android:background="@android:drawable/edit_text"
android:fontFamily="@font/poppins_regular"
android:layout_marginTop="12dp" />
<!-- Login Button -->
<Button
android:id="@+id/btnLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:text="LOGIN"
android:textAllCaps="true"
android:fontFamily="@font/poppins_bold"
android:textColor="@android:color/white"
android:backgroundTint="#1A73E8"
android:layout_marginTop="20dp" />
</LinearLayout>
[Link]
package [Link]
data class OperatorTotal(
val playNo: String,
val totalAmount: Int
)
[Link]
package [Link]
import [Link]
import [Link]
import [Link].*
import [Link]
import [Link]
import [Link]
import [Link].*
class OperatorTotalsActivity : AppCompatActivity() {
private lateinit var spinnerOperator: Spinner
private lateinit var spinnerGame: Spinner
private lateinit var spinnerType: Spinner
private lateinit var rvTotals: RecyclerView
private lateinit var tvTotal: TextView
private lateinit var btnShare: Button
private lateinit var adapter: GameDataAdapter
private lateinit var db: DatabaseReference
private val operatorMap = mutableMapOf<String, String>() // email → uid
private var lastReport = ""
private val games = listOf(
"Milan Day", "Kalyan", "Main Mumbai", "Milan Night",
"Sridevi", "Time Bazar", "Rajdhani Day", "Rajdhani Night"
)
private val types = listOf(
"All",
"Jodi", "Open", "Close",
"Single Patti", "Double Patti", "Triple Patti",
"Half Sangam", "Full Sangam", "Jackpot"
)
override fun onCreate(savedInstanceState: Bundle?) {
[Link](savedInstanceState)
setContentView([Link].activity_operator_totals)
db = [Link]().reference
spinnerOperator = findViewById([Link])
spinnerGame = findViewById([Link])
spinnerType = findViewById([Link])
rvTotals = findViewById([Link])
tvTotal = findViewById([Link])
btnShare = findViewById([Link])
[Link] = LinearLayoutManager(this)
adapter = GameDataAdapter()
[Link] = adapter
loadOperators()
[Link] = ArrayAdapter(this, [Link].simple_spinner_dropdown_item, games)
[Link] = ArrayAdapter(this, [Link].simple_spinner_dropdown_item, types)
val listener = object : [Link] {
override fun onItemSelected(parent: AdapterView<*>, v: [Link]?, pos: Int, id: Long) {
fetchTotals()
}
override fun onNothingSelected(parent: AdapterView<*>) {}
}
[Link] = listener
[Link] = listener
[Link] = listener
[Link] { shareReport() }
}
private fun loadOperators() {
[Link]("users").addListenerForSingleValueEvent(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val emails = mutableListOf<String>()
[Link]()
for (child in [Link]) {
val uid = [Link] ?: continue
val role = [Link]("role").getValue(String::[Link]) ?: ""
val email = [Link]("email").getValue(String::[Link]) ?: uid
if (role == "operator") {
[Link](email)
operatorMap[email] = uid
}
}
[Link] = ArrayAdapter(
this@OperatorTotalsActivity,
[Link].simple_spinner_dropdown_item,
emails
)
}
override fun onCancelled(error: DatabaseError) {
[Link](this@OperatorTotalsActivity, "Failed to load operators: ${[Link]}",
Toast.LENGTH_SHORT).show()
}
})
}
private fun fetchTotals() {
val operatorEmail = [Link]?.toString() ?: return
val game = [Link]?.toString() ?: return
val type = [Link]?.toString() ?: "All"
val uid = operatorMap[operatorEmail] ?: return
[Link]("games").child(game).addListenerForSingleValueEvent(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val rows = mutableListOf<PlayEntry>()
var grandTotal = 0
[Link](" 📊
val sb = StringBuilder()
Operator Totals\nOperator: $operatorEmail\nGame: $game\nType: $type\n-------------------\n")
for (typeSnap in [Link]) {
val tName = [Link] ?: continue
if (type != "All" && tName != type) continue
val opSnap = [Link](uid)
for (playNoSnap in [Link]) {
val playNo = [Link] ?: continue
var sum = 0
for (entry in [Link]) {
val amt = [Link]("amount").getValue(Int::[Link]) ?: 0
sum += amt
}
if (sum > 0) {
[Link](PlayEntry("$playNo ($tName)", sum))
[Link]("$playNo [$tName] : ₹$sum\n")
grandTotal += sum
}
}
}
if ([Link]()) {
[Link] = [Link]
[Link] = getString([Link].no_data)
lastReport = ""
} else {
[Link] = [Link]
[Link](rows)
[Link]("\nGRAND TOTAL: ₹$grandTotal")
[Link] = "Overall Total: ₹$grandTotal"
lastReport = [Link]()
}
}
override fun onCancelled(error: DatabaseError) {
[Link](this@OperatorTotalsActivity, "DB Error: ${[Link]}", Toast.LENGTH_SHORT).show()
}
})
}
private fun shareReport() {
if ([Link]()) {
[Link](this, "No data to share", Toast.LENGTH_SHORT).show()
return
}
val i = Intent(Intent.ACTION_SEND)
[Link] = "text/plain"
[Link](Intent.EXTRA_TEXT, lastReport)
try { startActivity(i) }
catch (e: Exception) { [Link](this, "No share app found", Toast.LENGTH_SHORT).show() }
}
}
activity_operator_totals.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<!-- Operator Selection -->
<Spinner
android:id="@+id/spinnerOperatorTotals"
android:layout_width="match_parent"
android:layout_height="56dp"
android:spinnerMode="dropdown"
android:layout_marginBottom="8dp" />
<!-- Game Selection -->
<Spinner
android:id="@+id/spinnerGameTotals"
android:layout_width="match_parent"
android:layout_height="56dp"
android:spinnerMode="dropdown"
android:layout_marginBottom="8dp" />
<!-- Game Type Selection -->
<Spinner
android:id="@+id/spinnerTypeTotals"
android:layout_width="match_parent"
android:layout_height="56dp"
android:spinnerMode="dropdown"
android:layout_marginBottom="12dp" />
<!-- RecyclerView -->
<[Link]
android:id="@+id/rvOperatorTotals"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="8dp" />
<!-- No Data -->
<TextView
android:id="@+id/tvNoDataTotals"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="No data available"
android:gravity="center"
android:textColor="@android:color/darker_gray"
android:visibility="gone"
android:layout_marginTop="8dp" />
<!-- Total -->
<TextView
android:id="@+id/tvTotalAmountTotals"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Overall Total: ₹0"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginTop="8dp" />
<!-- Share Report -->
<Button
android:id="@+id/btnShareTotals"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Share Report"
android:layout_marginTop="12dp" />
</LinearLayout>
[Link]
package [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
class OperatorTotalsAdapter(private var operatorTotals: List<OperatorTotal>) :
[Link]<[Link]>() {
class OperatorTotalsViewHolder(itemView: View) : [Link](itemView) {
val tvPlayNo: TextView = [Link]([Link])
val tvAmount: TextView = [Link]([Link])
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): OperatorTotalsViewHolder {
val view = [Link]([Link])
.inflate([Link].item_operator_total, parent, false)
return OperatorTotalsViewHolder(view)
}
override fun onBindViewHolder(holder: OperatorTotalsViewHolder, position: Int) {
val item = operatorTotals[position]
[Link] = [Link]
[Link] = "₹${[Link]}"
}
override fun getItemCount(): Int = [Link]
fun updateData(newList: List<OperatorTotal>) {
operatorTotals = newList
notifyDataSetChanged()
}
}
[Link]
package [Link]
import [Link]
import [Link]
import [Link]
import [Link].*
import [Link]
import [Link]
import [Link]
import [Link]
import [Link].*
import [Link]
import [Link].*
class OperatorViewDataActivity : AppCompatActivity() {
private lateinit var db: DatabaseReference
private lateinit var spinnerGame: Spinner
private lateinit var spinnerType: Spinner
private lateinit var rvData: RecyclerView
private lateinit var adapter: GameDataAdapter
private lateinit var tvTotal: TextView
private lateinit var tvNoData: TextView
private lateinit var btnShare: Button
private var lastReport: String = ""
private val games = listOf(
"Milan Day", "Kalyan", "Main Mumbai", "Milan Night",
"Sridevi", "Time Bazar", "Rajdhani Day", "Rajdhani Night"
)
private val types = listOf(
"All",
"Jodi", "Open", "Close",
"Single Patti", "Double Patti", "Triple Patti",
"Half Sangam", "Full Sangam", "Jackpot"
)
override fun onCreate(savedInstanceState: Bundle?) {
[Link](savedInstanceState)
setContentView([Link].activity_operator_view_data)
db = [Link]().reference
spinnerGame = findViewById([Link])
spinnerType = findViewById([Link])
rvData = findViewById([Link])
tvTotal = findViewById([Link])
tvNoData = findViewById([Link])
btnShare = findViewById([Link])
[Link] = LinearLayoutManager(this)
adapter = GameDataAdapter()
[Link] = adapter
[Link] = ArrayAdapter(this, [Link].simple_spinner_dropdown_item, games)
[Link] = ArrayAdapter(this, [Link].simple_spinner_dropdown_item, types)
val listener = object : [Link] {
override fun onItemSelected(parent: AdapterView<*>, view: View?, pos: Int, id: Long) {
val game = [Link]?.toString() ?: return
val type = [Link]?.toString() ?: "All"
loadMyData(game, type)
}
override fun onNothingSelected(parent: AdapterView<*>) {}
}
[Link] = listener
[Link] = listener
[Link] { shareReport() }
}
private fun loadMyData(game: String, typeFilter: String) {
val uid = [Link]().currentUser?.uid ?: return
[Link]("users").child(uid).child("email").get()
.addOnSuccessListener { emailSnap ->
val operatorEmail = [Link](String::[Link]) ?: "Unknown Operator"
val rows = mutableListOf<PlayEntry>()
var grandTotal = 0
val sb = StringBuilder()
val time = SimpleDateFormat("dd-MM-yyyy HH:mm:ss", [Link]()).format(Date())
[Link](" 📊 My Submitted Data\n")
[Link]("Operator: $operatorEmail\n")
[Link]("Game: $game\nType: $typeFilter\nGenerated: $time\n-------------------\n")
if (typeFilter == "All") {
var pending = [Link] - 1
for (t in types) {
if (t == "All") continue
[Link]("games").child(game).child(t).child(uid)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snap: DataSnapshot) {
var typeSum = 0
for (playNoSnap in [Link]) {
val playNo = [Link] ?: continue
var sum = 0
for (entry in [Link]) {
val amt = [Link]("amount").getValue(Int::[Link]) ?: 0
sum += amt
}
if (sum > 0) {
[Link](PlayEntry("$playNo ($t)", sum))
[Link]("$playNo [$t] : ₹$sum\n")
typeSum += sum
grandTotal += sum
}
}
if (typeSum > 0) [Link]("➡ $t TOTAL: ₹$typeSum\n")
pending--
if (pending == 0) finalize(rows, grandTotal, sb)
}
override fun onCancelled(error: DatabaseError) {
pending--
if (pending == 0) finalize(rows, grandTotal, sb)
}
})
}
} else {
[Link]("games").child(game).child(typeFilter).child(uid)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snap: DataSnapshot) {
var typeSum = 0
for (playNoSnap in [Link]) {
val playNo = [Link] ?: continue
var sum = 0
for (entry in [Link]) {
val amt = [Link]("amount").getValue(Int::[Link]) ?: 0
sum += amt
}
if (sum > 0) {
[Link](PlayEntry(playNo, sum))
[Link]("$playNo [$typeFilter] : ₹$sum\n")
typeSum += sum
grandTotal += sum
}
}
if (typeSum > 0) [Link]("➡ $typeFilter TOTAL: ₹$typeSum\n")
finalize(rows, grandTotal, sb)
}
override fun onCancelled(error: DatabaseError) {
[Link](this@OperatorViewDataActivity, "DB Error: ${[Link]}",
Toast.LENGTH_SHORT).show()
}
})
}
}
}
private fun finalize(rows: List<PlayEntry>, grandTotal: Int, sb: StringBuilder) {
if ([Link]()) {
[Link] = [Link]
[Link] = [Link]
[Link] = ""
lastReport = ""
} else {
[Link] = [Link]
[Link] = [Link]
[Link](rows)
[Link]("\nGRAND TOTAL: ₹$grandTotal")
[Link] = "Overall Total: ₹$grandTotal"
lastReport = [Link]()
}
}
private fun shareReport() {
if ([Link]()) {
[Link](this, "No data to share", Toast.LENGTH_SHORT).show()
return
}
val i = Intent(Intent.ACTION_SEND)
[Link] = "text/plain"
[Link](Intent.EXTRA_TEXT, lastReport)
try { startActivity(i) }
catch (e: Exception) { [Link](this, "No share app found", Toast.LENGTH_SHORT).show() }
}
}
[Link]
package [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
class OperatorViewDataAdapter(private val items: List<Pair<String, Int>>) :
[Link]<[Link]>() {
class ViewHolder(view: View) : [Link](view) {
val tvPlay: TextView = [Link]([Link])
val tvAmount: TextView = [Link]([Link])
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = [Link]([Link])
.inflate([Link].item_operator_view_data, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val (play, amount) = items[position]
[Link] = play
[Link] = "₹$amount"
}
override fun getItemCount(): Int = [Link]
}
[Link]
package [Link]
data class PlayEntry(
val playNo: String,
val amount: Int
)
[Link]
package [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
class PlayTotalsAdapter(private var items: List<PlayEntry>) :
[Link]<[Link]>() {
inner class ViewHolder(view: View) : [Link](view) {
val tvPlayNo: TextView = [Link]([Link])
val tvAmount: TextView = [Link]([Link])
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val v = [Link]([Link])
.inflate([Link].item_play_total, parent, false)
return ViewHolder(v)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val entry = items[position]
[Link] = [Link]
[Link] = "₹${[Link]}"
//✅
if ([Link]().contains("TOTAL")) {
Highlight TOTAL rows
[Link](null, [Link])
[Link](null, [Link])
🔵 🔴
val color = when ([Link]()) {
"GRAND TOTAL" -> [Link].holo_red_dark // highlight grand total
else -> [Link].holo_blue_dark // highlight type totals
}
[Link]([Link]([Link], color))
[Link]([Link]([Link], color))
[Link](
[Link]([Link], [Link].darker_gray)
)
//✅
} else {
Normal rows
[Link](null, [Link])
[Link](null, [Link])
[Link]([Link]([Link], [Link]))
[Link]([Link]([Link],
[Link].holo_green_dark))
[Link](
[Link]([Link], [Link])
)
}
}
override fun getItemCount(): Int = [Link]
fun updateData(newItems: List<PlayEntry>) {
items = newItems
notifyDataSetChanged()
}
//✅ Add this getter
fun getItems(): List<PlayEntry> = items
}
activity_operator_view_data.xml,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<!-- Select Game -->
<Spinner
android:id="@+id/spinnerSelectGame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:padding="12dp"
android:spinnerMode="dropdown" />
<!-- Select Type -->
<Spinner
android:id="@+id/spinnerSelectType"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:padding="12dp"
android:layout_marginTop="12dp"
android:spinnerMode="dropdown" />
<!-- Recycler -->
<[Link]
android:id="@+id/rvOperatorData"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="12dp" />
<!-- No Data Label -->
<TextView
android:id="@+id/tvNoData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_data"
android:visibility="gone"
android:layout_gravity="center"
android:textSize="16sp"
android:textColor="@android:color/holo_red_dark"
android:layout_marginTop="12dp" />
<!-- Total -->
<TextView
android:id="@+id/tvTotalAmount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/overall_total_placeholder"
android:textSize="16sp"
android:textStyle="bold"
android:padding="12dp"
android:gravity="center_horizontal" />
<!-- Share -->
<Button
android:id="@+id/btnShareMyData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:text="@string/share_report"
android:layout_marginTop="12dp" />
</LinearLayout>
item_game_data.xml,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="12dp"
android:gravity="center_vertical">
<TextView
android:id="@+id/tvPlayNo"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="wrap_content"
android:text="123-123"
android:textSize="16sp"
android:textColor="@android:color/black" />
<TextView
android:id="@+id/tvAmount"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:gravity="end"
android:text="₹0"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="@android:color/holo_green_dark" />
</LinearLayout>
item_operator_total.xml,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="12dp"
android:gravity="center_vertical"
android:background="?android:attr/selectableItemBackground">
<!-- Operator Email -->
<TextView
android:id="@+id/tvOperatorEmail"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="operator@[Link]"
android:textSize="14sp"
android:textColor="@android:color/black"
android:ellipsize="end"
android:singleLine="true" />
<!-- Type -->
<TextView
android:id="@+id/tvType"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="Jodi"
android:textSize="14sp"
android:gravity="center"
android:textColor="@android:color/darker_gray" />
<!-- Play No -->
<TextView
android:id="@+id/tvPlayNo"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="123"
android:textSize="16sp"
android:textStyle="bold"
android:gravity="center"
android:textColor="@android:color/black" />
<!-- Amount -->
<TextView
android:id="@+id/tvAmount"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="end"
android:text="₹0"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="@android:color/holo_green_dark" />
</LinearLayout>
item_operator_view_data.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="12dp">
<TextView
android:id="@+id/tvPlay"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Play No"
android:textSize="16sp"/>
<TextView
android:id="@+id/tvAmount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="₹0"
android:textSize="16sp"
android:textStyle="bold"/>
</LinearLayout>
item_play.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="12dp"
android:background="?attr/selectableItemBackground">
<TextView
android:id="@+id/tvPlayNo"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Play 12"
android:textSize="16sp"/>
<TextView
android:id="@+id/tvAmount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="₹100"
android:textStyle="bold"
android:textSize="16sp"/>
</LinearLayout>
item_play_total.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="12dp"
android:background="?android:attr/selectableItemBackground">
<!-- GameType + Play No -->
<TextView
android:id="@+id/tvPlayNo"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Jodi - 12"
android:textSize="16sp"
android:textColor="@android:color/black"
android:ellipsize="end"
android:singleLine="true" />
<!-- Amount -->
<TextView
android:id="@+id/tvAmount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="₹100"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="@android:color/holo_green_dark" />
</LinearLayout>
[Link]
<resources>
<string name="app_name">Game Changer</string>
<!-- Operator / Admin labels -->
<string name="operator_totals">Operator Totals</string>
<!-- Common -->
<!-- Labels for Play totals -->
<string name="play_no">Play No</string>
<string name="total">Total</string>
<string name="total_placeholder">Total: ₹0</string>
<!-- Admin -->
<string name="admin_dashboard">Admin Dashboard</string>
<string name="add_operator">Add Operator</string>
<string name="view_game_data">View Game Data</string>
<string name="view_operator_totals">View Operator Totals</string>
<string name="operator_removed">Operator removed</string>
<string name="operator_added">Operator added</string>
<string name="enter_email_password">Enter email & password</string>
<!-- Operator -->
<string name="operator_dashboard">Operator Dashboard</string>
<string name="operator_username">Operator Username</string>
<string name="operator_password">Operator Password</string>
<string name="play_number">Play Number</string>
<string name="amount">Amount</string>
<string name="add_play">Add Play</string>
<string name="submit_plays">Submit Plays</string>
<string name="view_my_data">View My Submitted Data</string>
<string name="enter_valid_play">Enter valid Play No and Amount</string>
<string name="no_plays_to_submit">No plays to submit</string>
<string name="submitted_to_game">Submitted %1$d plays to %2$s</string>
<!-- Operator View Data -->
<string name="my_submitted_data">My Submitted Data</string>
<string name="total_amount">Total: ₹%1$d</string>
<string name="please_select_game">Please select a game first</string>
<string name="no_data">No data available</string>
<string name="admin_panel">Admin Panel</string>
<string name="new_operator_username">New Operator Username</string>
<string name="new_operator_password">New Operator Password</string>
<string name="select_game">Select Game</string>
<string name="select_type">Select Type</string>
<string name="select_operator">Select Operator</string>
<string name="overall_total">Overall Total: ₹0</string>
<string name="share_report">Share Report</string>
<string name="overall_total_placeholder">Overall Total: ₹0</string>
<string name="operators_label">Operators:</string>
<string name="login">Login</string>
<string name="username">Username</string>
<string name="password">Password</string>
<string name="login_successful">Login successful</string>
<string name="incorrect_password">Incorrect password</string>
<string name="user_not_found">User not found</string>
<string name="restriction_placeholder">Select a game to see time restrictions</string>
<string name="play_number_hint">Play Number (e.g. 3-555)</string>
<string name="amount_hint">Amount</string>
<!-- Admin Panel -->
<string-array name="game_list">
<item>Sridevi</item>
<item>Kalyan</item>
<item>Pune</item>
</string-array>
</resources>
poppins_bold.xml
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="[Link]
<font
android:fontStyle="normal"
android:fontWeight="700"
android:font="@font/poppins_bold_ttf" />
</font-family>
poppins_regular.xml
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="[Link]
<font
android:fontStyle="normal"
android:fontWeight="400"
android:font="@font/poppins_regular_ttf" />
</font-family>
edittext_background.xml
<shape xmlns:android="[Link]
android:shape="rectangle">
<solid android:color="@android:color/white" />
<stroke android:width="1dp" android:color="#DDDDDD" />
<corners android:radius="8dp" />
<padding android:left="8dp" android:top="8dp"
android:right="8dp" android:bottom="8dp"/>
</shape>