From d66508137b9b341709465fa630a5c6f1d7a99e3b Mon Sep 17 00:00:00 2001 From: Harkamal Randhawa Date: Sun, 29 Mar 2026 17:54:23 -0600 Subject: [PATCH] Fix Android app connection and timeout issues Add proper timeout configuration to OkHttpClient (30s connect/read/write) Update OkHttp logging-interceptor to 4.12.0 to match OkHttp version Improve error messages to show server URL for debugging Configure backend to listen on all interfaces (0.0.0.0) Remove EdgeToEdge calls that interfered with layout --- android/app/build.gradle.kts | 2 +- .../activities/HomeActivity.java | 7 --- .../activities/MainActivity.java | 43 ++++++++++++++----- .../petstoremobile/api/RetrofitClient.java | 5 +++ backend/src/main/resources/application.yml | 1 + 5 files changed, 39 insertions(+), 19 deletions(-) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index fa8c88a7..552480f0 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -39,7 +39,7 @@ dependencies { implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-gson:2.9.0") - implementation("com.squareup.okhttp3:logging-interceptor:4.9.1") + implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") implementation("com.squareup.okhttp3:okhttp:4.12.0") implementation("com.google.android.material:material:1.11.0") diff --git a/android/app/src/main/java/com/example/petstoremobile/activities/HomeActivity.java b/android/app/src/main/java/com/example/petstoremobile/activities/HomeActivity.java index bc646e26..2f6c9722 100644 --- a/android/app/src/main/java/com/example/petstoremobile/activities/HomeActivity.java +++ b/android/app/src/main/java/com/example/petstoremobile/activities/HomeActivity.java @@ -39,15 +39,8 @@ public class HomeActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - EdgeToEdge.enable(this); setContentView(R.layout.activity_home); - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); - return insets; - }); - //get the bottom navbar from the layout bottomNav = findViewById(R.id.bottom_navigation); diff --git a/android/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java b/android/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java index 242000c8..8ce61921 100644 --- a/android/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java +++ b/android/app/src/main/java/com/example/petstoremobile/activities/MainActivity.java @@ -52,15 +52,8 @@ public class MainActivity extends AppCompatActivity { } } - EdgeToEdge.enable(this); setContentView(R.layout.activity_main); - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); - return insets; - }); - //get all controls from layout tvLoginStatus = findViewById(R.id.tvLoginStatus); etUser = findViewById(R.id.etUser); @@ -132,15 +125,43 @@ public class MainActivity extends AppCompatActivity { } }); } else { - Toast.makeText(MainActivity.this, "Login failed", Toast.LENGTH_SHORT).show(); - tvLoginStatus.setText("Login failed"); + String errorMessage; + switch (response.code()) { + case 401: + errorMessage = "Invalid username or password"; + break; + case 500: + errorMessage = "Server error. Please try again later."; + break; + case 503: + errorMessage = "Service unavailable. Backend may be starting up."; + break; + default: + errorMessage = "Login failed (Error " + response.code() + ")"; + } + Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_LONG).show(); + tvLoginStatus.setText(errorMessage); } } @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(MainActivity.this, "Login failed", Toast.LENGTH_SHORT).show(); - tvLoginStatus.setText("Login failed"); + Log.e("MainActivity", "Login request failed", t); + + String errorMessage; + if (t instanceof java.net.ConnectException || + t instanceof java.net.SocketTimeoutException || + t instanceof java.net.UnknownHostException) { + errorMessage = "Cannot connect to server at " + RetrofitClient.BASE_URL + + ". Please check if the backend is running."; + } else if (t instanceof java.io.IOException) { + errorMessage = "Network error. Please check your connection."; + } else { + errorMessage = "Login failed: " + t.getMessage(); + } + + Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_LONG).show(); + tvLoginStatus.setText(errorMessage); } }); }); diff --git a/android/app/src/main/java/com/example/petstoremobile/api/RetrofitClient.java b/android/app/src/main/java/com/example/petstoremobile/api/RetrofitClient.java index 4cee968b..3a93deb2 100644 --- a/android/app/src/main/java/com/example/petstoremobile/api/RetrofitClient.java +++ b/android/app/src/main/java/com/example/petstoremobile/api/RetrofitClient.java @@ -11,6 +11,8 @@ import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; +import java.util.concurrent.TimeUnit; + //Retrofit client Used for API calls public class RetrofitClient { public static final String BASE_URL = getBaseUrl(); @@ -41,6 +43,9 @@ public class RetrofitClient { OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .addInterceptor(new AuthInterceptor(context)) + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(30, TimeUnit.SECONDS) + .writeTimeout(30, TimeUnit.SECONDS) .build(); //build the retrofit object with all needed properties diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 81f7ed51..c9ba26d3 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -36,6 +36,7 @@ spring: server: port: ${SERVER_PORT:8080} + address: ${SERVER_ADDRESS:0.0.0.0} servlet: context-path: /