diff --git a/app/src/main/java/com/example/abe/ui/login/LoginActivity.kt b/app/src/main/java/com/example/abe/ui/login/LoginActivity.kt index 00288046b2652ea831f3dcde8df2d10009cb22d4..373eaf3bee5911e33734b6e28da99ba93664ca07 100644 --- a/app/src/main/java/com/example/abe/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/example/abe/ui/login/LoginActivity.kt @@ -3,13 +3,22 @@ package com.example.abe.ui.login import android.content.Context import android.content.Intent import android.os.Bundle +import android.util.Log +import android.view.View +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.asLiveData +import androidx.lifecycle.lifecycleScope import com.example.abe.MainActivity import com.example.abe.R +import com.example.abe.connection.ConnectivityObserver +import com.example.abe.connection.NetworkConnectivityObserver import com.example.abe.data.network.LoginResultCallback import com.example.abe.data.network.Retrofit import com.example.abe.databinding.ActivityLoginBinding -import com.example.abe.data.network.LoginResponse +import com.example.abe.utils.isConnected +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach class LoginActivity : AppCompatActivity(), LoginResultCallback { @@ -22,11 +31,14 @@ class LoginActivity : AppCompatActivity(), LoginResultCallback { retrofit.login(email, password, this) } + private lateinit var connectivityObserver: ConnectivityObserver + override fun onSuccess(loginResponse: com.example.abe.data.network.LoginResponse) { // Handle successful login println("Login successful: $loginResponse") - val sharedPref = getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE) + val sharedPref = + getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE) with(sharedPref.edit()) { putString("login_token", loginResponse.token) putString("user", email) @@ -52,11 +64,39 @@ class LoginActivity : AppCompatActivity(), LoginResultCallback { val view = binding.root setContentView(view) + connectivityObserver = NetworkConnectivityObserver(applicationContext) + connectivityObserver.observe().onEach { + Log.v("abecekut", "Status is $it") + if (it == ConnectivityObserver.NetworkState.UNAVAILABLE || it == ConnectivityObserver.NetworkState.LOST) { + runOnUiThread { + val builder: AlertDialog.Builder = AlertDialog.Builder(this@LoginActivity) + builder + .setMessage("We are having trouble connecting you to the internet") + .setTitle("No Connection") + .setPositiveButton("OK") { _, _ -> } + + val dialog: AlertDialog = builder.create() + dialog.show() + } + } + }.launchIn(lifecycleScope) + binding.btnSignIn.setOnClickListener { email = binding.emailInput.text.toString() val password: String = binding.passwordInput.text.toString() + val networkState = connectivityObserver.observe().asLiveData().value + + if (!isConnected(networkState)) { + binding.loginLayout.visibility = View.GONE + binding.noNetworkLayout.visibility = View.VISIBLE + } else { + attemptLogin(email, password) + } + } - attemptLogin(email, password) + binding.btnTryAgain.setOnClickListener { + binding.noNetworkLayout.visibility = View.GONE + binding.loginLayout.visibility = View.VISIBLE } } } diff --git a/app/src/main/java/com/example/abe/utils/Utils.kt b/app/src/main/java/com/example/abe/utils/Utils.kt new file mode 100644 index 0000000000000000000000000000000000000000..d68b03eaef07b4a4338b6459ba5c344cfe3adaaa --- /dev/null +++ b/app/src/main/java/com/example/abe/utils/Utils.kt @@ -0,0 +1,7 @@ +package com.example.abe.utils + +import com.example.abe.connection.ConnectivityObserver + +fun isConnected(networkState: ConnectivityObserver.NetworkState?): Boolean { + return (networkState != null && (networkState == ConnectivityObserver.NetworkState.AVAILABLE || networkState == ConnectivityObserver.NetworkState.LOSING)) +} diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index ac3598da695e7e684b840dfb9651f3ea3e78925e..48f3fa71a778687cb4c4e7d311426835aceebaa6 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -7,87 +7,143 @@ android:backgroundTint="#9759C4" tools:context=".ui.login.LoginActivity"> - <EditText - android:id="@+id/emailInput" - android:layout_width="300dp" + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/loginLayout" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginBottom="16dp" - android:ems="10" - android:hint="Email" - android:inputType="textEmailAddress" - android:outlineAmbientShadowColor="#000000" - android:outlineProvider="background" android:visibility="visible" - app:layout_constraintBottom_toTopOf="@+id/passwordInput" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/appName" - app:layout_constraintVertical_bias="0.5" - app:layout_constraintVertical_chainStyle="packed" - tools:visibility="visible" /> + app:layout_constraintTop_toTopOf="parent"> - <EditText - android:id="@+id/passwordInput" - android:layout_width="300dp" - android:layout_height="wrap_content" - android:ems="10" - android:hint="Password" - android:inputType="textPassword" - app:layout_constraintBottom_toTopOf="@+id/btnSignIn" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/emailInput" - app:layout_constraintVertical_bias="0.5" /> + <EditText + android:id="@+id/emailInput" + android:layout_width="300dp" + android:layout_height="wrap_content" + android:layout_marginBottom="16dp" + android:ems="10" + android:hint="Email" + android:inputType="textEmailAddress" + android:outlineAmbientShadowColor="#000000" + android:outlineProvider="background" + app:layout_constraintBottom_toTopOf="@+id/passwordInput" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/appName" + app:layout_constraintVertical_bias="0.5" + app:layout_constraintVertical_chainStyle="packed" /> - <Button - android:id="@+id/btnSignIn" - android:layout_width="300dp" - android:layout_height="wrap_content" - android:layout_marginTop="36dp" - android:background="#9759C4" - android:clickable="true" - android:text="Sign in" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/passwordInput" - app:layout_constraintVertical_bias="0.5" /> - <TextView - android:id="@+id/welcomeText" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="8dp" - android:fontFamily="@font/roboto_medium" - android:text="Welcome back to" - android:textColor="#000000" - android:textSize="20sp" - app:layout_constraintBottom_toTopOf="@+id/appName" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.5" - app:layout_constraintVertical_chainStyle="packed" /> + <EditText + android:id="@+id/passwordInput" + android:layout_width="300dp" + android:layout_height="wrap_content" + android:ems="10" + android:hint="Password" + android:inputType="textPassword" + app:layout_constraintBottom_toTopOf="@+id/btnSignIn" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/emailInput" + app:layout_constraintVertical_bias="0.5" /> + + <Button + android:id="@+id/btnSignIn" + android:layout_width="300dp" + android:layout_height="wrap_content" + android:layout_marginTop="36dp" + android:background="#9759C4" + android:clickable="true" + android:text="Sign in" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/passwordInput" + app:layout_constraintVertical_bias="0.5" /> + + <TextView + android:id="@+id/welcomeText" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:fontFamily="@font/roboto_medium" + android:text="Welcome back to" + android:textColor="#000000" + android:textSize="20sp" + app:layout_constraintBottom_toTopOf="@+id/appName" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.5" + app:layout_constraintVertical_chainStyle="packed" /> - <TextView - android:id="@+id/appName" + <TextView + android:id="@+id/appName" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginBottom="64dp" + android:fontFamily="@font/carter_one" + android:text="Bondoman" + android:textColor="#9759C4" + android:textSize="24sp" + android:textStyle="bold" + app:layout_constraintBottom_toTopOf="@+id/emailInput" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/welcomeText" + app:layout_constraintVertical_bias="0.5" /> + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/noNetworkLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:layout_marginBottom="64dp" - android:fontFamily="@font/carter_one" - android:text="Bondoman" - android:textColor="#9759C4" - android:textSize="24sp" - android:textStyle="bold" - app:layout_constraintBottom_toTopOf="@+id/emailInput" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/welcomeText" - app:layout_constraintVertical_bias="0.5" /> + app:layout_constraintTop_toTopOf="parent"> + + <ImageView + android:id="@+id/ivTrxIcon" + android:layout_width="400dp" + android:layout_height="350dp" + android:src="@mipmap/no_network_foreground" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/textView2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginHorizontal="20dp" + android:text="@string/failed_connect_msg" + android:textAlignment="center" + android:textSize="16sp" + android:textStyle="bold" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/ivTrxIcon" /> + + <Button + android:id="@+id/btnTryAgain" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/try_again" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textView2" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/no_network_foreground.webp b/app/src/main/res/mipmap-hdpi/no_network_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..146477e4daed7e4d42df864763d93dea4a21e1bf Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/no_network_foreground.webp differ diff --git a/app/src/main/res/mipmap-mdpi/no_network_foreground.webp b/app/src/main/res/mipmap-mdpi/no_network_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..50b1eadd920f2070aa96dbb6878c12178537b6b8 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/no_network_foreground.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/no_network_foreground.webp b/app/src/main/res/mipmap-xhdpi/no_network_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..d88f22adbe89b8b19c3f54d6deacc1b835930aac Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/no_network_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/no_network_foreground.webp b/app/src/main/res/mipmap-xxhdpi/no_network_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..4859633958ea9fd9290ae494744a54b4b1e7409c Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/no_network_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/no_network_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/no_network_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..e6c5741b8e84a8463cf99b886c0f57d2e097660b Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/no_network_foreground.webp differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 27b03fd014a2bff83443fc7c5d0439313bba6423..cb0e255805159c00e1f22d060c974c2ef308f783 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,8 @@ <string name="save">Save</string> <string name="delete">Delete</string> <string name="preference_file_key">com.example.ABE.PREFERENCE_FILE_KEY</string> + <string name="failed_connect_msg">Failed to connect to the server. Please check your internet connection.</string> + <string name="try_again">Try Again</string> <string-array name="Categories"> <item>Income</item>