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: /