diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a0edab5f4cdbd3e858c3dec4fd20441d0c954598..d714532975888e4121fa1752cdccf45b004eab91 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 0000000000000000000000000000000000000000..34eb4e6274ac76be39f1ea50296ab38041e77fb1 --- /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 c0498169e12886585ae46342d9124c1244b72c7f..3d60d1d1a9f49a2cb6ef0d9ca5b9ecb7e77dd637 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 0000000000000000000000000000000000000000..c17e7959a6d92b4be05ee8c321ff3e198b0550ff --- /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 b756280b2e8f04b7a4eef3d57e7614828c682d4b..2774d6bf67bd5c8c4385e964a7d047f1fe3d4a7d 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 25a006159c73320ffb24bc1e40df328bb90ce677..1219bbe14f7a5a8503001852174bbf81f0539ad8 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 0000000000000000000000000000000000000000..83fadbcdb8ddb17ee2e949e3f0c4259e159de028 --- /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 56c03a8376f28c9b6734087a3ff220d5f679beeb..e583f294812112bb767d715ad02a0e68165ac49a 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 e00c2dd143c595389b3cf8a32d9dc6aff48ec367..31a9d11eac959d2240c96b92b6bd8bac38877228 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 e48d9841a8bfd416ef39ac9460a98e07c6693f2b..739e37fd07ec87846c017316b3f57218ed4b3a8e 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 c39849b812b4a960243b412e67ae6101d43e244f..6d562401242a5cbb0c942e57f091934d7c7f4796 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