From 15cdd6590b8cbdc0f457893b6b84f686d38667e8 Mon Sep 17 00:00:00 2001 From: Nikitha Date: Thu, 12 Mar 2026 20:55:23 -0600 Subject: [PATCH] Activity logger, Input validator To search and validate activities --- .../petstoremobile/utils/ActivityLogger.java | 45 +++++++++ .../petstoremobile/utils/InputValidator.java | 97 +++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 app/src/main/java/com/example/petstoremobile/utils/ActivityLogger.java create mode 100644 app/src/main/java/com/example/petstoremobile/utils/InputValidator.java diff --git a/app/src/main/java/com/example/petstoremobile/utils/ActivityLogger.java b/app/src/main/java/com/example/petstoremobile/utils/ActivityLogger.java new file mode 100644 index 00000000..f474508f --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/utils/ActivityLogger.java @@ -0,0 +1,45 @@ +package com.example.petstoremobile.utils; + +import android.content.Context; +import java.io.FileWriter; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +public class ActivityLogger { + + private static final String LOG_FILE = "log.txt"; + + // Logs a general message with a timestamp + public static void log(Context context, String message) { + String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(new Date()); + String entry = timestamp + " | INFO | " + message + "\n"; + writeToFile(context, entry); + } + + // Logs a database change (ADD, UPDATE, DELETE) with entity type and ID + public static void logChange(Context context, String entity, String action, int id) { + String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(new Date()); + String entry = timestamp + " | DB CHANGE | " + action + " " + entity + " ID: " + id + "\n"; + writeToFile(context, entry); + } + + // Logs an exception with location info + public static void logException(Context context, String location, Exception e) { + String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(new Date()); + String entry = timestamp + " | ERROR | " + location + ": " + e.getMessage() + "\n"; + writeToFile(context, entry); + } + + // Writes the log entry to log.txt in internal storage + private static void writeToFile(Context context, String entry) { + try { + FileWriter fw = new FileWriter(context.getFilesDir() + "/" + LOG_FILE, true); + fw.write(entry); + fw.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/app/src/main/java/com/example/petstoremobile/utils/InputValidator.java b/app/src/main/java/com/example/petstoremobile/utils/InputValidator.java new file mode 100644 index 00000000..8182912b --- /dev/null +++ b/app/src/main/java/com/example/petstoremobile/utils/InputValidator.java @@ -0,0 +1,97 @@ +package com.example.petstoremobile.utils; + +import android.widget.EditText; + +public class InputValidator { + + // Checks if an EditText field is not empty + public static boolean isNotEmpty(EditText field, String fieldName) { + if (field.getText().toString().trim().isEmpty()) { + field.setError(fieldName + " is required"); + field.requestFocus(); + return false; + } + return true; + } + + // Checks if the value is a positive integer + public static boolean isPositiveInteger(EditText field, String fieldName) { + String value = field.getText().toString().trim(); + try { + int num = Integer.parseInt(value); + if (num < 0) { + field.setError(fieldName + " must be a positive number"); + field.requestFocus(); + return false; + } + return true; + } catch (NumberFormatException e) { + field.setError(fieldName + " must be a whole number"); + field.requestFocus(); + return false; + } + } + + // Checks if the value is a positive decimal number + public static boolean isPositiveDecimal(EditText field, String fieldName) { + String value = field.getText().toString().trim(); + try { + double num = Double.parseDouble(value); + if (num < 0) { + field.setError(fieldName + " must be a positive number"); + field.requestFocus(); + return false; + } + return true; + } catch (NumberFormatException e) { + field.setError(fieldName + " must be a number"); + field.requestFocus(); + return false; + } + } + + // Checks if the email address is valid + public static boolean isValidEmail(EditText field) { + String email = field.getText().toString().trim(); + if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) { + field.setError("Enter a valid email address"); + field.requestFocus(); + return false; + } + return true; + } + + // Checks if the phone number is valid (digits, spaces, dashes, brackets allowed) + public static boolean isValidPhone(EditText field) { + String phone = field.getText().toString().trim(); + if (phone.isEmpty() || !phone.matches("[0-9\\-\\s\\(\\)\\+]+")) { + field.setError("Enter a valid phone number"); + field.requestFocus(); + return false; + } + return true; + } + + // Checks if the date is in YYYY-MM-DD format + public static boolean isValidDate(EditText field) { + String date = field.getText().toString().trim(); + if (date.isEmpty() || !date.matches("\\d{4}-\\d{2}-\\d{2}")) { + field.setError("Date must be in YYYY-MM-DD format"); + field.requestFocus(); + return false; + } + return true; + } + + // Checks if the time format is valid (e.g. 10:00 AM) + public static boolean isValidTime(EditText field) { + String time = field.getText().toString().trim(); + if (time.isEmpty() || !time.matches("\\d{1,2}:\\d{2}\\s?(AM|PM|am|pm)?")) { + field.setError("Enter a valid time (e.g. 10:00 AM)"); + field.requestFocus(); + return false; + } + return true; + } +} +