Skip to content

Commit 71a53f8

Browse files
committed
feat:
- login - splash screen - utils - retrofit call - app logo
1 parent 783168c commit 71a53f8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1080
-37
lines changed

.idea/kotlinc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ plugins {
33
id 'org.jetbrains.kotlin.android'
44
id 'kotlin-kapt'
55
id 'com.google.gms.google-services'
6+
id 'com.google.devtools.ksp'
67
}
78

89
android {
910
namespace 'com.jaylangkung.bpkpd'
1011
compileSdk 33
1112

13+
1214
defaultConfig {
1315
applicationId "com.jaylangkung.bpkpd"
1416
minSdk 24
@@ -17,31 +19,34 @@ android {
1719
versionName "1.0"
1820

1921
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
22+
23+
def localProperties = new Properties()
24+
localProperties.load(new FileInputStream(rootProject.file("local.properties")))
25+
buildConfigField "String", "API_KEY", localProperties['apiKey']
2026
}
2127

2228
buildTypes {
2329
release {
2430
minifyEnabled false
2531
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
2632
}
27-
applicationVariants.all {
28-
variant ->
29-
variant.outputs.each {
30-
output ->
31-
def name = "BPKPD-Pasuruan.apk"
32-
output.outputFileName = name
33-
}
33+
applicationVariants.all { variant ->
34+
variant.outputs.each { output ->
35+
def name = "BPKPD-Pasuruan.apk"
36+
output.outputFileName = name
37+
}
3438
}
3539
}
3640
compileOptions {
37-
sourceCompatibility JavaVersion.VERSION_1_8
38-
targetCompatibility JavaVersion.VERSION_1_8
41+
sourceCompatibility JavaVersion.VERSION_17
42+
targetCompatibility JavaVersion.VERSION_17
3943
}
4044
kotlinOptions {
41-
jvmTarget = '1.8'
45+
jvmTarget = '17'
4246
}
4347
buildFeatures {
4448
viewBinding true
49+
buildConfig true
4550
}
4651
}
4752

@@ -61,6 +66,12 @@ dependencies {
6166
implementation 'com.google.firebase:firebase-messaging-ktx:23.2.1'
6267
implementation 'com.google.firebase:firebase-analytics-ktx:21.3.0'
6368

69+
//room
70+
implementation 'androidx.room:room-runtime:2.5.2'
71+
ksp 'androidx.room:room-compiler:2.5.2'
72+
implementation 'androidx.room:room-ktx:2.5.2'
73+
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
74+
6475
//Retrofit
6576
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
6677
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
@@ -93,7 +104,7 @@ dependencies {
93104

94105
//image getter from internet
95106
implementation 'com.github.bumptech.glide:glide:4.14.1'
96-
kapt 'com.github.bumptech.glide:compiler:4.14.1'
107+
ksp 'com.github.bumptech.glide:compiler:4.14.1'
97108

98109
// dependency for slider view
99110
implementation 'com.github.denzcoskun:ImageSlideshow:0.1.0'

app/src/main/AndroidManifest.xml

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools">
44

5+
<uses-feature
6+
android:name="android.hardware.camera"
7+
android:required="false" />
8+
9+
<uses-permission android:name="android.permission.INTERNET" />
10+
<uses-permission android:name="android.permission.VIBRATE" />
11+
<uses-permission android:name="android.permission.CAMERA" />
12+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
13+
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
14+
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
15+
<uses-permission android:name="android.permission.WAKE_LOCK" />
16+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
17+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
18+
519
<application
620
android:allowBackup="true"
721
android:dataExtractionRules="@xml/data_extraction_rules"
@@ -14,17 +28,20 @@
1428
android:theme="@style/AppTheme"
1529
tools:targetApi="31">
1630
<activity
17-
android:name=".auth.LoginActivity"
18-
android:exported="false" />
19-
<activity
20-
android:name=".MainActivity"
31+
android:name=".auth.SplashScreenActivity"
2132
android:exported="true">
2233
<intent-filter>
2334
<action android:name="android.intent.action.MAIN" />
2435

2536
<category android:name="android.intent.category.LAUNCHER" />
2637
</intent-filter>
2738
</activity>
39+
<activity
40+
android:name=".auth.LoginActivity"
41+
android:exported="false" />
42+
<activity
43+
android:name=".MainActivity"
44+
android:exported="false" />
2845
</application>
2946

3047
</manifest>
108 KB
Loading
Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,74 @@
11
package com.jaylangkung.bpkpd
22

3+
import android.Manifest
4+
import android.content.ContentValues
5+
import android.content.pm.PackageManager
6+
import android.os.Build
37
import androidx.appcompat.app.AppCompatActivity
48
import android.os.Bundle
9+
import android.util.Log
10+
import androidx.core.app.ActivityCompat
11+
import androidx.core.content.ContextCompat
12+
import com.google.firebase.ktx.Firebase
13+
import com.google.firebase.messaging.ktx.messaging
514
import com.jaylangkung.bpkpd.databinding.ActivityMainBinding
15+
import com.jaylangkung.bpkpd.utils.MySharedPreferences
616

717
class MainActivity : AppCompatActivity() {
818

919
private lateinit var binding: ActivityMainBinding
20+
private lateinit var myPreferences: MySharedPreferences
1021

1122
override fun onCreate(savedInstanceState: Bundle?) {
1223
super.onCreate(savedInstanceState)
1324
binding = ActivityMainBinding.inflate(layoutInflater)
1425
setContentView(binding.root)
15-
26+
myPreferences = MySharedPreferences(this@MainActivity)
27+
askPermission()
28+
Firebase.messaging.token.addOnCompleteListener { task ->
29+
if (task.isSuccessful) {
30+
val token = task.result
31+
// val iduser = myPreferences.getValue(Constants.USER_IDAKTIVASI).toString()
32+
// addToken(iduser, token)
33+
} else {
34+
// Handle the error
35+
val exception = task.exception
36+
exception?.message?.let {
37+
Log.e(ContentValues.TAG, "Error retrieving FCM registration token: $it")
38+
}
39+
}
40+
}
1641

1742
}
43+
44+
private fun askPermission() {
45+
val cameraPermission = Manifest.permission.CAMERA
46+
val readStoragePermission = Manifest.permission.READ_EXTERNAL_STORAGE
47+
val writeStoragePermission = Manifest.permission.WRITE_EXTERNAL_STORAGE
48+
val permissionsToRequest = mutableListOf<String>()
49+
50+
// Check for notification permission
51+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
52+
if (ContextCompat.checkSelfPermission(this@MainActivity, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
53+
permissionsToRequest.add(Manifest.permission.POST_NOTIFICATIONS)
54+
}
55+
}
56+
57+
// Check for camera, storage, and location permissions
58+
if (ContextCompat.checkSelfPermission(this@MainActivity, cameraPermission) != PackageManager.PERMISSION_GRANTED) {
59+
permissionsToRequest.add(cameraPermission)
60+
}
61+
if (ContextCompat.checkSelfPermission(this@MainActivity, readStoragePermission) != PackageManager.PERMISSION_GRANTED) {
62+
permissionsToRequest.add(readStoragePermission)
63+
}
64+
if (ContextCompat.checkSelfPermission(this@MainActivity, writeStoragePermission) != PackageManager.PERMISSION_GRANTED) {
65+
permissionsToRequest.add(writeStoragePermission)
66+
}
67+
68+
if (permissionsToRequest.isNotEmpty()) {
69+
ActivityCompat.requestPermissions(
70+
this@MainActivity, permissionsToRequest.toTypedArray(), 100
71+
)
72+
}
73+
}
1874
}
Lines changed: 106 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,116 @@
11
package com.jaylangkung.bpkpd.auth
22

3-
import androidx.appcompat.app.AppCompatActivity
3+
import android.annotation.SuppressLint
4+
import android.content.Intent
45
import android.os.Bundle
6+
import android.provider.Settings
7+
import androidx.appcompat.app.AppCompatActivity
8+
import com.jaylangkung.bpkpd.MainActivity
59
import com.jaylangkung.bpkpd.R
10+
import com.jaylangkung.bpkpd.dataClass.LoginResponse
11+
import com.jaylangkung.bpkpd.databinding.ActivityLoginBinding
12+
import com.jaylangkung.bpkpd.retrofit.RetrofitClient
13+
import com.jaylangkung.bpkpd.utils.Constants
14+
import com.jaylangkung.bpkpd.utils.ErrorHandler
15+
import com.jaylangkung.bpkpd.utils.MySharedPreferences
16+
import es.dmoral.toasty.Toasty
17+
import org.json.JSONObject
18+
import retrofit2.Call
19+
import retrofit2.Callback
20+
import retrofit2.Response
621

722
class LoginActivity : AppCompatActivity() {
23+
24+
private lateinit var binding: ActivityLoginBinding
25+
private lateinit var myPreferences: MySharedPreferences
26+
27+
@SuppressLint("HardwareIds")
828
override fun onCreate(savedInstanceState: Bundle?) {
929
super.onCreate(savedInstanceState)
10-
setContentView(R.layout.activity_login)
30+
binding = ActivityLoginBinding.inflate(layoutInflater)
31+
setContentView(binding.root)
32+
myPreferences = MySharedPreferences(this@LoginActivity)
33+
34+
val tokenAuth = myPreferences.getValue(Constants.TokenAuth).toString()
35+
val deviceID = Settings.Secure.getString(applicationContext.contentResolver, Settings.Secure.ANDROID_ID)
36+
37+
binding.apply {
38+
btnLogin.setOnClickListener {
39+
val email = tvValueEmailLogin.text.toString()
40+
val pass = tvValuePasswordLogin.text.toString()
41+
if (validate()) {
42+
loginProcess(email, pass, deviceID, tokenAuth)
43+
btnLogin.startAnimation()
44+
}
45+
}
46+
}
47+
}
48+
49+
private fun validate(): Boolean {
50+
fun String.isValidEmail() = isNotEmpty() && android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()
51+
when {
52+
binding.tvValueEmailLogin.text.toString() == "" -> {
53+
binding.tvValueEmailLogin.error = getString(R.string.email_cant_empty)
54+
binding.tvValueEmailLogin.requestFocus()
55+
return false
56+
}
57+
58+
!binding.tvValueEmailLogin.text.toString().isValidEmail() -> {
59+
binding.tvValueEmailLogin.error = getString(R.string.email_format_error)
60+
binding.tvValueEmailLogin.requestFocus()
61+
return false
62+
}
63+
64+
binding.tvValuePasswordLogin.text.toString() == "" -> {
65+
binding.tvValuePasswordLogin.error = getString(R.string.password_cant_empty)
66+
binding.tvValuePasswordLogin.requestFocus()
67+
return false
68+
}
69+
70+
else -> return true
71+
}
72+
}
73+
74+
private fun loginProcess(email: String, password: String, deviceID: String, tokenAuth: String) {
75+
RetrofitClient.apiService.login(email, password, deviceID, tokenAuth).enqueue(object : Callback<LoginResponse> {
76+
override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
77+
binding.btnLogin.endAnimation()
78+
when (response.code()) {
79+
200 -> {
80+
val data = response.body()!!.data
81+
myPreferences.setValue(Constants.USER, Constants.LOGIN)
82+
myPreferences.setValue(Constants.USER_IDADMIN, data.idadmin.toString())
83+
myPreferences.setValue(Constants.USER_EMAIL, data.email)
84+
myPreferences.setValue(Constants.USER_NAMA, data.nama)
85+
myPreferences.setValue(Constants.USER_ALAMAT, data.alamat)
86+
myPreferences.setValue(Constants.USER_TELP, data.telp)
87+
myPreferences.setValue(Constants.USER_FOTO, data.img)
88+
startActivity(Intent(this@LoginActivity, MainActivity::class.java))
89+
finish()
90+
}
91+
92+
400, 401 -> {
93+
val msg = ErrorHandler().parseError(response.errorBody()!!.string())
94+
Toasty.error(this@LoginActivity, msg, Toasty.LENGTH_SHORT).show()
95+
}
96+
97+
500 -> {
98+
Toasty.error(this@LoginActivity, "Internal Server Error", Toasty.LENGTH_SHORT).show()
99+
}
100+
101+
else -> {
102+
val msg = ErrorHandler().parseError(response.errorBody()!!.string())
103+
Toasty.error(this@LoginActivity, msg, Toasty.LENGTH_SHORT).show()
104+
}
105+
}
106+
}
107+
108+
override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
109+
binding.btnLogin.endAnimation()
110+
ErrorHandler().responseHandler(
111+
this@LoginActivity, "loginProcess | onResponse", t.message.toString()
112+
)
113+
}
114+
})
11115
}
12116
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.jaylangkung.bpkpd.auth
2+
3+
import android.annotation.SuppressLint
4+
import android.content.Intent
5+
import android.os.Bundle
6+
import android.os.Handler
7+
import android.os.Looper
8+
import androidx.appcompat.app.AppCompatActivity
9+
import com.jaylangkung.bpkpd.BuildConfig
10+
import com.jaylangkung.bpkpd.MainActivity
11+
import com.jaylangkung.bpkpd.databinding.ActivitySplashScreenBinding
12+
import com.jaylangkung.bpkpd.utils.Constants
13+
import com.jaylangkung.bpkpd.utils.MySharedPreferences
14+
15+
@SuppressLint("CustomSplashScreen")
16+
class SplashScreenActivity : AppCompatActivity() {
17+
18+
private lateinit var binding: ActivitySplashScreenBinding
19+
private lateinit var myPreferences: MySharedPreferences
20+
21+
override fun onCreate(savedInstanceState: Bundle?) {
22+
super.onCreate(savedInstanceState)
23+
binding = ActivitySplashScreenBinding.inflate(layoutInflater)
24+
setContentView(binding.root)
25+
myPreferences = MySharedPreferences(this@SplashScreenActivity)
26+
27+
val apiKey = BuildConfig.API_KEY
28+
myPreferences.setValue(Constants.TokenAuth, apiKey)
29+
30+
31+
Handler(Looper.getMainLooper()).postDelayed({
32+
//Ketika user sudah login tidak perlu ke halaman login lagi
33+
if (myPreferences.getValue(Constants.USER).equals(Constants.LOGIN)) {
34+
startActivity(Intent(this@SplashScreenActivity, MainActivity::class.java))
35+
finish()
36+
} else {
37+
startActivity(Intent(this@SplashScreenActivity, LoginActivity::class.java))
38+
finish()
39+
}
40+
}, 500L)
41+
}
42+
}

0 commit comments

Comments
 (0)