Skip to content
This repository has been archived by the owner on Apr 2, 2021. It is now read-only.

Commit

Permalink
Authenticate Staff Accounts
Browse files Browse the repository at this point in the history
 * Create Auth class to enclose authentication functions.
 * Create App class to get app context from object classes.
 * Create Accounts models.
 * Create SplashScreen to run while async tasks are running on startup.
 * Add sign out button to Main Activity.
 * Use Kotlin Coroutines to create async tasks.
 * Update and sort string resources.
 * Replace "Bus Id" with "Id".
 * Rename SharedPrefHelper to SharedPref.
 * Rename LogInActivity to SignInActivity.
  • Loading branch information
yousinix committed Oct 17, 2019
1 parent fa0a8dd commit d08095e
Show file tree
Hide file tree
Showing 21 changed files with 357 additions and 174 deletions.
5 changes: 4 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,14 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.1.1'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.1.0'
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.google.android.material:material:1.0.0'
implementation 'com.google.firebase:firebase-firestore:21.1.1'
implementation 'com.google.firebase:firebase-common-ktx:19.2.0'
implementation 'com.google.firebase:firebase-firestore-ktx:21.2.0'
implementation 'com.journeyapps:zxing-android-embedded:4.0.0'
implementation 'com.google.zxing:core:3.4.0'
}
13 changes: 6 additions & 7 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,26 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.tazkrtak.staff">

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.CAMERA" />

<application
android:name=".App"
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/AppTheme"
tools:ignore="GoogleAppIndexingWarning">

<activity android:name="com.tazkrtak.staff.activities.ScannerActivity" />
<activity android:name="com.tazkrtak.staff.activities.MainActivity" />

<activity android:name="com.tazkrtak.staff.activities.LogInActivity">
<activity android:name=".activities.SplashScreenActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name=".activities.SignInActivity" />
<activity android:name=".activities.MainActivity" />
<activity android:name=".activities.ScannerActivity" />
</application>

</manifest>
17 changes: 17 additions & 0 deletions app/src/main/java/com/tazkrtak/staff/App.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.tazkrtak.staff

import android.app.Application
import android.content.Context

class App : Application() {

override fun onCreate() {
super.onCreate()
appContext = applicationContext
}

companion object {
var appContext: Context? = null
}

}
67 changes: 0 additions & 67 deletions app/src/main/java/com/tazkrtak/staff/activities/LogInActivity.kt

This file was deleted.

35 changes: 10 additions & 25 deletions app/src/main/java/com/tazkrtak/staff/activities/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@ package com.tazkrtak.staff.activities
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.firestore.FirebaseFirestore
import com.google.zxing.integration.android.IntentIntegrator
import com.tazkrtak.staff.R
import com.tazkrtak.staff.util.SharedPrefHelper
import com.tazkrtak.staff.util.Auth
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
Expand All @@ -16,29 +15,6 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val intent = Intent(this, LogInActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

if (SharedPrefHelper.exists(this, "busId")) {
val savedId = SharedPrefHelper.getString(this, "busId")
val savedPassword = SharedPrefHelper.getString(this, "password")

val db = FirebaseFirestore.getInstance()
db.collection("buses")
.document(savedId)
.get()
.addOnSuccessListener {
if (!it.exists() || it.data!!["password"] != savedPassword) {
SharedPrefHelper.removeString(this, "busId")
SharedPrefHelper.removeString(this, "password")
startActivity(intent)
finish()
return@addOnSuccessListener
}
}
}

scan_button.setOnClickListener {
val integrator = IntentIntegrator(this)
integrator.captureActivity = ScannerActivity::class.java
Expand All @@ -47,5 +23,14 @@ class MainActivity : AppCompatActivity() {
integrator.initiateScan()
}

sign_out_button.setOnClickListener {
Auth.signOut()
val signInActivityIntent = Intent(this, SignInActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(signInActivityIntent)
finish()
}

}
}
66 changes: 66 additions & 0 deletions app/src/main/java/com/tazkrtak/staff/activities/SignInActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.tazkrtak.staff.activities

import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.tazkrtak.staff.R
import com.tazkrtak.staff.util.Auth
import kotlinx.android.synthetic.main.activity_sign_in.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlin.coroutines.CoroutineContext

class SignInActivity : AppCompatActivity(), CoroutineScope {

override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job

private lateinit var job: Job

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sign_in)

job = Job()

sign_in_button.setOnClickListener {

id_edit_text.error = null
id_edit_text.error = null

val id = id_edit_text.text.toString()
val password = password_edit_text.text.toString()

launch {
try {
Auth.signIn(id, password)
launchMainActivity()
} catch (e: Auth.AuthIdException) {
id_edit_text.error = e.message
} catch (e: Auth.AuthPasswordException) {
password_edit_text.error = e.message
}
}

}

}

override fun onDestroy() {
job.cancel()
super.onDestroy()
}

private fun launchMainActivity() {
val mainActivityIntent = Intent(this, MainActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(mainActivityIntent)
finish()
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.tazkrtak.staff.activities

import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.tazkrtak.staff.R
import com.tazkrtak.staff.util.Auth
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlin.coroutines.CoroutineContext

class SplashScreenActivity : AppCompatActivity(), CoroutineScope {

override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job

private lateinit var job: Job

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash_screen)
job = Job()

launch {
if (Auth.isSignedIn()) {
launchActivity(MainActivity::class.java)
} else {
launchActivity(SignInActivity::class.java)
}
}

}

override fun onDestroy() {
job.cancel()
super.onDestroy()
}

private fun launchActivity(cls: Class<out Any>) {
val activityIntent = Intent(this, cls)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(activityIntent)
finish()
}
}
21 changes: 21 additions & 0 deletions app/src/main/java/com/tazkrtak/staff/models/Account.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.tazkrtak.staff.models

import androidx.core.text.isDigitsOnly


interface Account {

val id: String?
val name: String?
val password: String?
val type: Type

enum class Type { CONDUCTOR, COLLECTOR }

companion object {
fun typeOf(id: String): Type {
return if (!id.isDigitsOnly()) Type.CONDUCTOR else Type.COLLECTOR
}
}

}
1 change: 1 addition & 0 deletions app/src/main/java/com/tazkrtak/staff/models/Bus.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.tazkrtak.staff.models
data class Bus(
val id: String? = null,
val number: Int? = null,
val plateNumber: Int? = null,
val startStation: String? = null,
val endStation: String? = null,
val ticketsPrices: ArrayList<Double>? = arrayListOf()
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/java/com/tazkrtak/staff/models/Collector.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.tazkrtak.staff.models

data class Collector(
override val id: String? = null,
override val name: String? = null,
override val password: String? = null
) : Account {
override val type: Account.Type = Account.Type.COLLECTOR
}
10 changes: 10 additions & 0 deletions app/src/main/java/com/tazkrtak/staff/models/Conductor.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.tazkrtak.staff.models

data class Conductor(
override val id: String? = null,
override val name: String? = null,
override val password: String? = null,
val bus: Bus? = null
) : Account {
override val type: Account.Type = Account.Type.CONDUCTOR
}
Loading

0 comments on commit d08095e

Please sign in to comment.