Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 37 additions & 3 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
import java.util.Properties

plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)
kotlin("plugin.serialization") version "2.0.20"
}

android {
namespace = "com.example.pollpulse"
compileSdk = 34



val key: String = com.android.build.gradle.internal.cxx.configure.gradleLocalProperties(rootDir,providers)
.getProperty("supabaseKey")
val url: String = com.android.build.gradle.internal.cxx.configure.gradleLocalProperties(rootDir,providers)
.getProperty("supabaseUrl")



defaultConfig {
applicationId = "com.example.pollpulse"
minSdk = 27
Expand All @@ -15,6 +27,9 @@ android {
versionName = "1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

buildConfigField("String", "supabaseKey", "\"$key\"")
buildConfigField("String", "supabaseUrl", "\"$url\"")
}

buildTypes {
Expand All @@ -26,17 +41,23 @@ android {
)
}
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}

kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures{
buildConfig = true
}


}

dependencies {

implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
Expand All @@ -46,6 +67,19 @@ dependencies {
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)

//PinView
// PinView
implementation(libs.chaosleung.pinview)
}

val supabase_version = "3.0.0"
implementation("io.github.jan-tennert.supabase:postgrest-kt:$supabase_version")
implementation("io.github.jan-tennert.supabase:storage-kt:$supabase_version")
implementation("io.github.jan-tennert.supabase:auth-kt:$supabase_version")

val ktor_version = "3.0.0-rc-1"
implementation("io.ktor:ktor-client-android:$ktor_version")
implementation("io.ktor:ktor-client-core:$ktor_version")
implementation("io.ktor:ktor-utils:$ktor_version")

// Ensure consistent serialization version
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
}
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
Expand Down
64 changes: 64 additions & 0 deletions app/src/main/java/com/example/pollpulse/data/AuthRepoImpl.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.example.pollpulse.data

import android.content.ContentValues.TAG
import android.util.Log
import io.github.jan.supabase.BuildConfig
import io.github.jan.supabase.annotations.SupabaseInternal
import io.github.jan.supabase.auth.Auth
import io.github.jan.supabase.auth.FlowType
import io.github.jan.supabase.auth.auth
import io.github.jan.supabase.auth.providers.builtin.Email
import io.github.jan.supabase.createSupabaseClient
import io.github.jan.supabase.postgrest.Postgrest

interface AuthenticationRepository {
suspend fun signIn(email: String, password: String): Boolean
suspend fun signUp(email: String, password: String): Boolean

}

class AuthenticationRepositoryImpl(

) : AuthenticationRepository {
@OptIn(SupabaseInternal::class)
val client = createSupabaseClient(
supabaseKey = "Enter key",
supabaseUrl = "Enter url"
){
install(Postgrest)
install(Auth) {
flowType = FlowType.PKCE
scheme = "app"
host = "supabase.com"
}
}
private val auth = client.auth


override suspend fun signIn(email: String, password: String): Boolean {
return try {
auth.signInWith(Email) {
this.email = email
this.password = password
}
true
} catch (e: Exception) {
false
}
}

override suspend fun signUp(email: String, password: String): Boolean {
return try {
auth.signUpWith(Email) {
this.email = email
this.password = password
}
true
} catch (e: Exception) {
Log.d(TAG, "Joni:${e.message}")
false
}
}


}
50 changes: 36 additions & 14 deletions app/src/main/java/com/example/pollpulse/ui/LoginActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,50 @@ import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import com.example.pollpulse.R
import com.example.pollpulse.data.AuthenticationRepositoryImpl
import com.example.pollpulse.ui.viewmodels.AuthenticationViewModel
import com.example.pollpulse.ui.viewmodels.AuthenticationViewModelFactory

class LoginActivity : AppCompatActivity() {
private lateinit var button: Button

private lateinit var emailEditText: EditText
private lateinit var passwordEditText: EditText
private lateinit var loginButton: Button


private val viewModel: AuthenticationViewModel by viewModels {
AuthenticationViewModelFactory(AuthenticationRepositoryImpl())
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login_page)

button = findViewById(R.id.login)
button.setOnClickListener(View.OnClickListener { view: View? ->
this.click(
view
)
})
}
emailEditText = findViewById(R.id.email_edt)
passwordEditText = findViewById(R.id.password_edt)
loginButton = findViewById(R.id.login)

loginButton.setOnClickListener {
val email = emailEditText.text.toString()
val password = passwordEditText.text.toString()


viewModel.signIn(email, password) { success ->
if (success) {

val intent = Intent(this, VerificationPageActivity::class.java)
startActivity(intent)
finish()
} else {

private fun click(view: View?) {
val intent = Intent(
this,
VerificationPageActivity::class.java
)
startActivity(intent)
Toast.makeText(this, "Login failed. Please check your credentials.", Toast.LENGTH_SHORT).show()
}
}
}
}
}
50 changes: 34 additions & 16 deletions app/src/main/java/com/example/pollpulse/ui/SignUpActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,51 @@ package com.example.pollpulse.ui

import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.example.pollpulse.R
import android.widget.EditText
import android.widget.Toast
import androidx.activity.viewModels
import com.example.pollpulse.data.AuthenticationRepositoryImpl
import com.example.pollpulse.ui.viewmodels.AuthenticationViewModel
import com.example.pollpulse.ui.viewmodels.AuthenticationViewModelFactory

class SignUpActivity : AppCompatActivity() {
private lateinit var button: Button

private lateinit var emailEditText: EditText
private lateinit var passwordEditText: EditText
private lateinit var signUpButton: Button


private val viewModel: AuthenticationViewModel by viewModels {
AuthenticationViewModelFactory(AuthenticationRepositoryImpl())
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sign_up_page)

emailEditText = findViewById(R.id.email_edt)
passwordEditText = findViewById(R.id.password_edt)
signUpButton = findViewById(R.id.signin)

button = findViewById(R.id.signin)
button.setOnClickListener(View.OnClickListener { view: View? ->
this.click(
view
)
})
}
signUpButton.setOnClickListener {
val email = emailEditText.text.toString()
val password = passwordEditText.text.toString()


viewModel.signUp(email, password) { success ->
if (success) {

private fun click(view: View?) {
val intent = Intent(
this,
VerificationPageActivity::class.java
)
val intent = Intent(this, VerificationPageActivity::class.java)
startActivity(intent)
finish()
} else {

startActivity(intent)
Toast.makeText(this, "Sign-up failed. Please try again.", Toast.LENGTH_SHORT).show()
}
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.example.pollpulse.ui.viewmodels

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.example.pollpulse.data.AuthenticationRepositoryImpl
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext


class AuthenticationViewModel(private val repository: AuthenticationRepositoryImpl) : ViewModel() {

var isAuthenticated: Boolean = false
private set

fun signIn(email: String, password: String, onResult: (Boolean) -> Unit) {
viewModelScope.launch {
val result = withContext(Dispatchers.IO) {
repository.signIn(email, password)
}
isAuthenticated = result
onResult(result)
}
}

fun signUp(email: String, password: String, onResult: (Boolean) -> Unit) {
viewModelScope.launch {
val result = withContext(Dispatchers.IO) {
repository.signUp(email, password)
}
onResult(result)
}
}
}



class AuthenticationViewModelFactory(private val repository: AuthenticationRepositoryImpl) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(AuthenticationViewModel::class.java)) {
return AuthenticationViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}