From 56f3db0a45157a1de57b9f45f409e3870a4e9da3 Mon Sep 17 00:00:00 2001
From: "Moch. Sofyan Firdaus" <13521083@std.stei.itb.ac.id>
Date: Thu, 4 Apr 2024 17:19:25 +0700
Subject: [PATCH] feat: check internet connection

---
 app/src/main/AndroidManifest.xml              | 19 +++++---
 .../onionsquad/bondoman/InternetActivity.kt   | 44 +++++++++++++++++++
 .../com/onionsquad/bondoman/MainActivity.kt   |  2 +-
 .../onionsquad/bondoman/NoInternetActivity.kt | 17 +++++++
 .../bondoman/ui/login/LoginActivity.kt        | 35 +++++++++++----
 .../bondoman/ui/settings/SettingsFragment.kt  | 14 ++++--
 .../main/res/layout/activity_no_internet.xml  | 34 ++++++++++++++
 app/src/main/res/values-night/themes.xml      |  5 +++
 app/src/main/res/values/dimens.xml            |  1 +
 app/src/main/res/values/strings.xml           | 44 +++++++++++++++++++
 app/src/main/res/values/themes.xml            |  5 +++
 11 files changed, 201 insertions(+), 19 deletions(-)
 create mode 100644 app/src/main/java/com/onionsquad/bondoman/InternetActivity.kt
 create mode 100644 app/src/main/java/com/onionsquad/bondoman/NoInternetActivity.kt
 create mode 100644 app/src/main/res/layout/activity_no_internet.xml

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a0edab5..d714532 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,8 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+    xmlns:tools="http://schemas.android.com/tools" >
 
     <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
 
     <application
         android:allowBackup="true"
@@ -12,15 +15,19 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        android:theme="@style/Theme.Bondoman">
+        android:theme="@style/Theme.Bondoman" >
+        <activity
+            android:name=".NoInternetActivity"
+            android:exported="false"
+            android:noHistory="true"
+            android:theme="@style/Theme.Bondoman" />
         <activity
             android:name=".ui.login.LoginActivity"
             android:exported="false"
-            android:label="@string/title_activity_login"
-            android:noHistory="true" />
+            android:label="@string/title_activity_login"/>
         <activity
             android:name=".MainActivity"
-            android:exported="true">
+            android:exported="true" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
@@ -35,7 +42,7 @@
             android:name="androidx.core.content.FileProvider"
             android:authorities="${applicationId}.fileprovider"
             android:exported="false"
-            android:grantUriPermissions="true">
+            android:grantUriPermissions="true" >
             <meta-data
                 android:name="android.support.FILE_PROVIDER_PATHS"
                 android:resource="@xml/file_paths" />
diff --git a/app/src/main/java/com/onionsquad/bondoman/InternetActivity.kt b/app/src/main/java/com/onionsquad/bondoman/InternetActivity.kt
new file mode 100644
index 0000000..34eb4e6
--- /dev/null
+++ b/app/src/main/java/com/onionsquad/bondoman/InternetActivity.kt
@@ -0,0 +1,44 @@
+package com.onionsquad.bondoman
+
+import android.content.Context
+import android.net.ConnectivityManager
+import android.net.Network
+import android.net.NetworkCapabilities
+import android.net.NetworkRequest
+import android.os.Bundle
+import android.os.PersistableBundle
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+
+open class InternetActivity : AppCompatActivity() {
+
+    var isInternetConnected = false
+        private set
+
+    private val networkRequest = NetworkRequest.Builder()
+        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+        .build()
+
+    private val networkCallback = object : ConnectivityManager.NetworkCallback() {
+        override fun onAvailable(network: Network) {
+            super.onAvailable(network)
+            isInternetConnected = true
+        }
+
+        override fun onLost(network: Network) {
+            super.onLost(network)
+            isInternetConnected = false
+            Toast.makeText(
+                this@InternetActivity,
+                R.string.internet_not_connected,
+                Toast.LENGTH_SHORT
+            ).show()
+        }
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+        connectivityManager.requestNetwork(networkRequest, networkCallback)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/onionsquad/bondoman/MainActivity.kt b/app/src/main/java/com/onionsquad/bondoman/MainActivity.kt
index c049816..3d60d1d 100644
--- a/app/src/main/java/com/onionsquad/bondoman/MainActivity.kt
+++ b/app/src/main/java/com/onionsquad/bondoman/MainActivity.kt
@@ -13,7 +13,7 @@ import com.onionsquad.bondoman.auth.SessionManager
 import com.onionsquad.bondoman.databinding.ActivityMainBinding
 import com.onionsquad.bondoman.ui.login.LoginActivity
 
-class MainActivity : AppCompatActivity() {
+class MainActivity : InternetActivity() {
 
     private lateinit var binding: ActivityMainBinding
 
diff --git a/app/src/main/java/com/onionsquad/bondoman/NoInternetActivity.kt b/app/src/main/java/com/onionsquad/bondoman/NoInternetActivity.kt
new file mode 100644
index 0000000..c17e795
--- /dev/null
+++ b/app/src/main/java/com/onionsquad/bondoman/NoInternetActivity.kt
@@ -0,0 +1,17 @@
+package com.onionsquad.bondoman
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.onionsquad.bondoman.databinding.ActivityNoInternetBinding
+
+class NoInternetActivity : AppCompatActivity() {
+
+    private lateinit var binding: ActivityNoInternetBinding
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        binding = ActivityNoInternetBinding.inflate(layoutInflater)
+        setContentView(binding.root)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/onionsquad/bondoman/ui/login/LoginActivity.kt b/app/src/main/java/com/onionsquad/bondoman/ui/login/LoginActivity.kt
index b756280..2774d6b 100644
--- a/app/src/main/java/com/onionsquad/bondoman/ui/login/LoginActivity.kt
+++ b/app/src/main/java/com/onionsquad/bondoman/ui/login/LoginActivity.kt
@@ -16,7 +16,9 @@ import androidx.work.ExistingWorkPolicy
 import androidx.work.OneTimeWorkRequestBuilder
 import androidx.work.PeriodicWorkRequestBuilder
 import androidx.work.WorkManager
+import com.onionsquad.bondoman.InternetActivity
 import com.onionsquad.bondoman.MainActivity
+import com.onionsquad.bondoman.NoInternetActivity
 import com.onionsquad.bondoman.databinding.ActivityLoginBinding
 
 import com.onionsquad.bondoman.R
@@ -25,7 +27,7 @@ import com.onionsquad.bondoman.auth.SessionManager
 import java.time.Instant
 import java.util.concurrent.TimeUnit
 
-class LoginActivity : AppCompatActivity() {
+class LoginActivity : InternetActivity() {
 
     private lateinit var loginViewModel: LoginViewModel
     private lateinit var binding: ActivityLoginBinding
@@ -87,25 +89,40 @@ class LoginActivity : AppCompatActivity() {
 
             setOnEditorActionListener { _, actionId, _ ->
                 when (actionId) {
-                    EditorInfo.IME_ACTION_DONE ->
-                        loginViewModel.login(
-                            email.text.toString(),
-                            password.text.toString()
-                        )
+                    EditorInfo.IME_ACTION_DONE -> {
+                        if (!isInternetConnected) {
+                            sendToNoInternetActivity()
+                        } else {
+                            loginViewModel.login(
+                                email.text.toString(),
+                                password.text.toString()
+                            )
+                        }
+                    }
                 }
                 false
             }
 
             login.setOnClickListener {
-                loading.visibility = View.VISIBLE
-                loginViewModel.login(email.text.toString(), password.text.toString())
+                if (!isInternetConnected) {
+                    sendToNoInternetActivity()
+                    return@setOnClickListener
+                } else {
+                    loading.visibility = View.VISIBLE
+                    loginViewModel.login(email.text.toString(), password.text.toString())
+                }
             }
         }
     }
 
+    private fun sendToNoInternetActivity() {
+        val intent = Intent(this@LoginActivity, NoInternetActivity::class.java)
+        startActivity(intent)
+    }
+
     private fun sendToMainActivity() {
         val intent = Intent(this@LoginActivity, MainActivity::class.java)
-        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK)
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
         startActivity(intent)
         finish()
     }
diff --git a/app/src/main/java/com/onionsquad/bondoman/ui/settings/SettingsFragment.kt b/app/src/main/java/com/onionsquad/bondoman/ui/settings/SettingsFragment.kt
index 25a0061..1219bbe 100644
--- a/app/src/main/java/com/onionsquad/bondoman/ui/settings/SettingsFragment.kt
+++ b/app/src/main/java/com/onionsquad/bondoman/ui/settings/SettingsFragment.kt
@@ -2,7 +2,6 @@ package com.onionsquad.bondoman.ui.settings
 
 import android.app.AlertDialog
 import android.content.Intent
-import android.net.Uri
 import android.os.Bundle
 import android.util.Log
 import android.view.LayoutInflater
@@ -12,9 +11,10 @@ import android.widget.ArrayAdapter
 import android.widget.Toast
 import androidx.activity.result.contract.ActivityResultContracts.CreateDocument
 import androidx.core.content.FileProvider
-import androidx.core.net.toUri
 import androidx.fragment.app.Fragment
 import androidx.navigation.fragment.findNavController
+import com.onionsquad.bondoman.InternetActivity
+import com.onionsquad.bondoman.NoInternetActivity
 import com.onionsquad.bondoman.R
 import com.onionsquad.bondoman.auth.AutoLogoutWorker
 import com.onionsquad.bondoman.auth.SessionManager
@@ -30,7 +30,6 @@ import java.io.File
 import java.io.OutputStream
 import java.time.ZoneId
 import java.time.format.DateTimeFormatter
-import kotlin.io.path.createTempFile
 
 class SettingsFragment : Fragment() {
     private var _binding: FragmentSettingsBinding? = null
@@ -110,6 +109,10 @@ class SettingsFragment : Fragment() {
             }
 
             buttonSendEmail.setOnClickListener {
+                if (!(requireActivity() as InternetActivity).isInternetConnected) {
+                    sendToNoInternetActivity()
+                    return@setOnClickListener
+                }
                 sessionManager.ensureAuthenticated()
                 val token = sessionManager.fetchAuthToken()!!
                 val intent = Intent(Intent.ACTION_SEND).apply {
@@ -148,6 +151,11 @@ class SettingsFragment : Fragment() {
         return binding.root
     }
 
+    private fun sendToNoInternetActivity() {
+        val intent = Intent(requireContext(), NoInternetActivity::class.java)
+        startActivity(intent)
+    }
+
     override fun onDestroyView() {
         super.onDestroyView()
         _binding = null
diff --git a/app/src/main/res/layout/activity_no_internet.xml b/app/src/main/res/layout/activity_no_internet.xml
new file mode 100644
index 0000000..83fadbc
--- /dev/null
+++ b/app/src/main/res/layout/activity_no_internet.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:layout_centerHorizontal="true"
+        android:layout_centerVertical="true"
+        tools:layout_editor_absoluteX="1dp"
+        tools:layout_editor_absoluteY="1dp" >
+
+        <ImageView
+            android:id="@+id/no_internet_image"
+            android:layout_width="match_parent"
+            android:layout_height="160dp"
+            android:alpha="0.2"
+            android:contentDescription="@string/no_internet"
+            app:srcCompat="@drawable/ic_baseline_signal_wifi_connected_no_internet_4_24" />
+
+        <TextView
+            android:id="@+id/text_no_internet"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textSize="30sp"
+            android:textAlignment="center"
+            android:alpha="0.2"
+            android:text="@string/no_internet" />
+    </LinearLayout>
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index 56c03a8..e583f29 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -13,4 +13,9 @@
         <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
         <!-- Customize your theme here. -->
     </style>
+  <!-- Base application theme. -->
+    <style name="Base.Theme.Bondoman" parent="Theme.Material3.DayNight.NoActionBar">
+        <!-- Customize your dark theme here. -->
+        <!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
+    </style>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index e00c2dd..31a9d11 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -2,4 +2,5 @@
     <!-- Default screen margins, per the Android Design guidelines. -->
     <dimen name="activity_horizontal_margin">16dp</dimen>
     <dimen name="activity_vertical_margin">16dp</dimen>
+    <dimen name="fab_margin">16dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e48d984..739e37f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -22,4 +22,48 @@
     <string name="action_save_email">Send transactions</string>
     <string name="transactions_saved">Transactions saved</string>
     <string name="transactions_sent">Transactions sent to email</string>
+    <string name="internet_not_connected">You are not connecting to internet</string>
+    <!-- Strings used for fragments for navigation -->
+    <string name="first_fragment_label">First Fragment</string>
+    <string name="second_fragment_label">Second Fragment</string>
+    <string name="next">Next</string>
+    <string name="previous">Previous</string>
+
+    <string name="lorem_ipsum">
+        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris
+        volutpat, dolor id interdum ullamcorper, risus dolor egestas lectus, sit amet mattis purus
+        dui nec risus. Maecenas non sodales nisi, vel dictum dolor. Class aptent taciti sociosqu ad
+        litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend
+        diam, vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a,
+        ornare ex. Sed rhoncus est ut libero porta lobortis. Fusce in dictum tellus.\n\n
+        Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus
+        egestas, est a condimentum egestas, turpis nisl iaculis ipsum, in dictum tellus dolor sed
+        neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui. Interdum et malesuada
+        fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae,
+        molestie nibh. Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor
+        bibendum, vel congue leo egestas.\n\n
+        Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit
+        amet auctor at, mollis non turpis. Nullam pretium libero vestibulum, finibus orci vel,
+        molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero facilisis et. Integer
+        interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at
+        lacinia sit amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula,
+        in lobortis sem porta sed. Integer id ultrices magna, in luctus elit. Sed a pellentesque
+        est.\n\n
+        Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh.
+        Morbi laoreet, tortor sed facilisis varius, nibh orci rhoncus nulla, id elementum leo dui
+        non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu libero sed commodo. In
+        eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc,
+        quis imperdiet eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra
+        ipsum. Nunc quis augue egestas, cursus lorem at, molestie sem. Morbi a consectetur ipsum, a
+        placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet finibus
+        convallis.\n\n
+        Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et
+        malesuada fames ac turpis egestas. In volutpat arcu ut felis sagittis, in finibus massa
+        gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur ullamcorper,
+        libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper
+        sodales. Praesent bibendum rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus
+        libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus
+        vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
+    </string>
+    <string name="no_internet">No internet</string>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index c39849b..6d56240 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -13,4 +13,9 @@
         <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
         <!-- Customize your theme here. -->
     </style>
+  <!-- Base application theme. -->
+    <style name="Base.Theme.Bondoman" parent="Theme.Material3.DayNight.NoActionBar">
+        <!-- Customize your light theme here. -->
+        <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
+    </style>
 </resources>
\ No newline at end of file
-- 
GitLab