From 8fdf939558909604078568f9b54b84221b0b4663 Mon Sep 17 00:00:00 2001 From: "saad.siddiq" Date: Thu, 24 Apr 2025 17:59:36 +0500 Subject: [PATCH] Observation Module Screens design --- app/build.gradle | 2 + app/src/main/AndroidManifest.xml | 42 +++ .../HSETrainingForms/HseOneActivity.java | 26 ++ .../HSETrainingForms/HseTwoActivity.java | 26 ++ .../InjuryRecordForms/InjuryFormFour.java | 26 ++ .../InjuryRecordForms/InjuryFormOne.java | 80 +++++ .../InjuryRecordForms/InjuryFormThree.java | 26 ++ .../InjuryRecordForms/InjuryFormTwo.java | 26 ++ .../OtherHseActivity.java | 26 ++ .../PermitToWorkForms/PermitTwoActivity.java | 327 +++++++++++++++++- .../ProgressiveActivity.java | 26 ++ .../WeeklyActivityForms/WeeklyFormOne.java | 26 ++ .../adapters/PaperWorkImageAdapter.java | 150 ++++++++ .../fragments/HomeFragment.java | 37 +- .../models/DocumentTypeImageModel.java | 42 +++ .../utils/FullScreenImageDialog.java | 47 +++ .../utils/HSEManagement.java | 13 + app/src/main/res/layout/activity_hse_one.xml | 185 ++++++++++ app/src/main/res/layout/activity_hse_two.xml | 132 +++++++ .../res/layout/activity_injury_form_four.xml | 159 +++++++++ .../res/layout/activity_injury_form_one.xml | 247 +++++++++++++ .../res/layout/activity_injury_form_three.xml | 154 +++++++++ .../res/layout/activity_injury_form_two.xml | 228 ++++++++++++ .../main/res/layout/activity_other_hse.xml | 129 +++++++ .../main/res/layout/activity_permit_two.xml | 109 +++++- .../main/res/layout/activity_progressive.xml | 162 +++++++++ .../res/layout/activity_weekly_form_one.xml | 162 +++++++++ .../res/layout/dialog_fullscreen_image.xml | 31 ++ app/src/main/res/layout/fragment_home.xml | 13 +- app/src/main/res/layout/item_image.xml | 36 ++ app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/strings.xml | 13 + settings.gradle | 4 + 33 files changed, 2694 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/HSETrainingForms/HseOneActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/HSETrainingForms/HseTwoActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormFour.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormOne.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormThree.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormTwo.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/OtherHSEActivityForms/OtherHseActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ProgressiveActivityForms/ProgressiveActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/WeeklyActivityForms/WeeklyFormOne.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/PaperWorkImageAdapter.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/models/DocumentTypeImageModel.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/utils/FullScreenImageDialog.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/utils/HSEManagement.java create mode 100644 app/src/main/res/layout/activity_hse_one.xml create mode 100644 app/src/main/res/layout/activity_hse_two.xml create mode 100644 app/src/main/res/layout/activity_injury_form_four.xml create mode 100644 app/src/main/res/layout/activity_injury_form_one.xml create mode 100644 app/src/main/res/layout/activity_injury_form_three.xml create mode 100644 app/src/main/res/layout/activity_injury_form_two.xml create mode 100644 app/src/main/res/layout/activity_other_hse.xml create mode 100644 app/src/main/res/layout/activity_progressive.xml create mode 100644 app/src/main/res/layout/activity_weekly_form_one.xml create mode 100644 app/src/main/res/layout/dialog_fullscreen_image.xml create mode 100644 app/src/main/res/layout/item_image.xml diff --git a/app/build.gradle b/app/build.gradle index f3124be..7ca6452 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,4 +44,6 @@ dependencies { implementation libs.easypermissions implementation libs.preference + implementation 'com.github.MikeOrtiz:TouchImageView:3.6' + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6021179..5c287ad 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,6 +21,7 @@ tools:ignore="ScopedStorage" /> + + + + + + + + + { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/HSETrainingForms/HseTwoActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/HSETrainingForms/HseTwoActivity.java new file mode 100644 index 0000000..6f523ca --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/HSETrainingForms/HseTwoActivity.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.hseobservationsapp.activities.HSETrainingForms; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; + +public class HseTwoActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_hse_two); + 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; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormFour.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormFour.java new file mode 100644 index 0000000..01b6913 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormFour.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.hseobservationsapp.activities.InjuryRecordForms; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; + +public class InjuryFormFour extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_injury_form_four); + 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; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormOne.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormOne.java new file mode 100644 index 0000000..951dfa7 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormOne.java @@ -0,0 +1,80 @@ +package com.utopiaindustries.hseobservationsapp.activities.InjuryRecordForms; + +import android.app.DatePickerDialog; +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.widget.DatePicker; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Locale; + +public class InjuryFormOne extends AppCompatActivity { + + private int year, month, day; + private Calendar calendar; + TextView txtDate; + private ImageView imgCalendar; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_injury_form_one); + 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; + }); + + initializeLayouts(); + + imgCalendar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showDatePickerDialog(InjuryFormOne.this); + } + }); + } + + private void initializeLayouts() { + + calendar = Calendar.getInstance(); + year = calendar.get(Calendar.YEAR); + month = calendar.get(Calendar.MONTH); + day = calendar.get(Calendar.DAY_OF_MONTH); + txtDate = findViewById(R.id.txt_date); + imgCalendar = findViewById(R.id.img_calendar); + + } + + private void showDatePickerDialog(Context context) { + DatePickerDialog datePickerDialog = new DatePickerDialog( + context, + new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + // Month is 0-indexed, so we add 1 + Calendar selectedCalendar = Calendar.getInstance(); + selectedCalendar.set(year, monthOfYear, dayOfMonth); + SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy", Locale.getDefault()); + String selectedDate = dateFormat.format(selectedCalendar.getTime()); + txtDate.setText(selectedDate); + } + }, + year, month, day + ); + datePickerDialog.show(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormThree.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormThree.java new file mode 100644 index 0000000..ec085af --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormThree.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.hseobservationsapp.activities.InjuryRecordForms; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; + +public class InjuryFormThree extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_injury_form_three); + 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; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormTwo.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormTwo.java new file mode 100644 index 0000000..ddd21dc --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormTwo.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.hseobservationsapp.activities.InjuryRecordForms; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; + +public class InjuryFormTwo extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_injury_form_two); + 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; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/OtherHSEActivityForms/OtherHseActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/OtherHSEActivityForms/OtherHseActivity.java new file mode 100644 index 0000000..46238da --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/OtherHSEActivityForms/OtherHseActivity.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.hseobservationsapp.activities.OtherHSEActivityForms; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; + +public class OtherHseActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_other_hse); + 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; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitTwoActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitTwoActivity.java index 5deabf7..1de335d 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitTwoActivity.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitTwoActivity.java @@ -1,16 +1,110 @@ package com.utopiaindustries.hseobservationsapp.activities.PermitToWorkForms; +import android.Manifest; +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; +import android.media.ExifInterface; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.os.Environment; +import android.provider.MediaStore; +import android.view.View; +import android.widget.CheckBox; +import android.widget.Toast; import androidx.activity.EdgeToEdge; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.FileProvider; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import androidx.recyclerview.widget.RecyclerView; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.adapters.PaperWorkImageAdapter; +import com.utopiaindustries.hseobservationsapp.models.DocumentTypeImageModel; -public class PermitTwoActivity extends AppCompatActivity { +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.function.Consumer; + +import pub.devrel.easypermissions.AfterPermissionGranted; +import pub.devrel.easypermissions.AppSettingsDialog; +import pub.devrel.easypermissions.EasyPermissions; + +public class PermitTwoActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, + EasyPermissions.RationaleCallbacks{ + + private CheckBox checkboxCompany, checkboxContractor; + RecyclerView paperRecyclerView; + PaperWorkImageAdapter imagePaperAdapter; + String paperFilePath = "no_pic"; + ArrayList PaperImageList = new ArrayList<>(); + String docTypeId = ""; + String docTypeTitle = ""; + private static final int CAMERA_REQUEST_PAPER = 101; + + // Activity Result Launcher for Paper Camera + private final ActivityResultLauncher paperCameraLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + + if (result.getResultCode() == RESULT_OK) { + + File imageFile = new File(paperFilePath); + if (imageFile.exists()) { + + Bitmap originalBitmap = fixImageRotation(paperFilePath); + + //Bitmap timestampedBitmap = addTimestampToImage(originalBitmap); + + bitmapToByteArrayAsync( + originalBitmap, + 200, // Target size in KB + imageBytes -> { + this.runOnUiThread(() -> { + + DocumentTypeImageModel documentImage = new DocumentTypeImageModel( + docTypeId, + docTypeTitle, + imageBytes + ); + + //Log.e("doc-image: ",""+ documentImage); + + int position = PaperImageList.size(); + PaperImageList.add(documentImage); + imagePaperAdapter.notifyItemInserted(position); + + }); + }, + error -> { + error.printStackTrace(); + } + ); + + } else { + Toast.makeText(this, "Image file not found!", Toast.LENGTH_SHORT).show(); + } + } + else if (result.getResultCode() == RESULT_CANCELED) { + Toast.makeText(this, "Camera capture failed!", Toast.LENGTH_SHORT).show(); + } + else { + Toast.makeText(this, "Camera capture failed!", Toast.LENGTH_SHORT).show(); + } + }); @Override protected void onCreate(Bundle savedInstanceState) { @@ -22,5 +116,236 @@ public class PermitTwoActivity extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + initializeLayouts(); + + checkboxCompany.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (checkboxCompany.isChecked()) { + checkboxContractor.setChecked(false); + } + } + }); + + checkboxContractor.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (checkboxContractor.isChecked()) { + checkboxCompany.setChecked(false); + } + } + }); + } + + private void initializeLayouts() { + checkboxCompany = findViewById(R.id.checkbox_company); + checkboxContractor = findViewById(R.id.checkbox_contractor); + + paperRecyclerView = findViewById(R.id.paperRecyclerView); + + } + + @AfterPermissionGranted(CAMERA_REQUEST_PAPER) + public void openPaperCamera() { + if (hasCameraPermission()) { + try { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + File photoFile = null; + try { + photoFile = createImageFile("Paper"); + } catch (IOException ex) { + // Error occurred while creating the File + } + + if (photoFile != null) { + + Uri photoURI = FileProvider.getUriForFile(this, + getPackageName(), + photoFile); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); + //startActivityForResult(takePictureIntent, CAMERA_REQUEST); + paperCameraLauncher.launch(takePictureIntent); + } + } catch (ActivityNotFoundException e) { + Toast.makeText(this, "Camera app not found", Toast.LENGTH_SHORT).show(); + } + } else { + // Ask for one permission + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; + } + + EasyPermissions.requestPermissions(this, getString(R.string.rationale_camera), CAMERA_REQUEST_PAPER, perms); + } + } + + /*@AfterPermissionGranted(CAMERA_REQUEST_ITEM) + public void openItemCamera() { + if (hasCameraPermission()) { + try { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + File photoFile = null; + try { + photoFile = createImageFile("Item"); + } catch (IOException ex) { + // Error occurred while creating the File + } + + if (photoFile != null) { + Uri photoURI = FileProvider.getUriForFile(this, + "com.utopia.inventorymanagement", + photoFile); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); + //startActivityForResult(takePictureIntent, CAMERA_REQUEST); + itemCameraLauncher.launch(takePictureIntent); + } + } catch (ActivityNotFoundException e) { + Toast.makeText(this, "Camera app not found", Toast.LENGTH_SHORT).show(); + } + } else { + // Ask for one permission + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; + } + + EasyPermissions.requestPermissions(this, getString(R.string.rationale_camera), CAMERA_REQUEST_ITEM, perms); + } + }*/ + + @Override + public void onRequestPermissionsResult(int requestCode, + @NonNull String[] permissions, + @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + // EasyPermissions handles the request result. + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); + } + + @Override + public void onPermissionsGranted(int requestCode, @NonNull List perms) { + + } + + @Override + public void onPermissionsDenied(int requestCode, @NonNull List perms) { + if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { + new AppSettingsDialog.Builder(this).build().show(); + } + } + + private boolean hasCameraPermission() { + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; + + } + + //Log.e("perms: ",""+perms); + return EasyPermissions.hasPermissions(this, perms); + } + + private Bitmap fixImageRotation(String imagePath) { + Bitmap bitmap = BitmapFactory.decodeFile(imagePath); + try { + ExifInterface exif = new ExifInterface(imagePath); + int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); + + int rotationAngle = 0; + switch (orientation) { + case ExifInterface.ORIENTATION_ROTATE_90: + rotationAngle = 90; + break; + case ExifInterface.ORIENTATION_ROTATE_180: + rotationAngle = 180; + break; + case ExifInterface.ORIENTATION_ROTATE_270: + rotationAngle = 270; + break; + } + + if (rotationAngle != 0) { + Matrix matrix = new Matrix(); + matrix.postRotate(rotationAngle); + return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); + } + } catch (IOException e) { + e.printStackTrace(); + } + return bitmap; + } + + private File createImageFile(String pathType) throws IOException { + // Create an image file name + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageFileName = "JPEG_" + timeStamp + "_"; + File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); + File image = File.createTempFile( + imageFileName, //prefix + ".jpg", //suffix + storageDir //directory + ); + + paperFilePath = image.getAbsolutePath(); + + return image; + } + + @Override + public void onRationaleAccepted(int requestCode) { + + } + + @Override + public void onRationaleDenied(int requestCode) { + + } + + public void bitmapToByteArrayAsync( + Bitmap bitmap, + int targetSizeInKB, + Consumer onSuccess, + Consumer onError + ) { + new Thread(() -> { + try { + if (bitmap == null) { + throw new IllegalArgumentException("Bitmap cannot be null."); + } + + int targetSizeInBytes = targetSizeInKB * 1024; + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + int minQuality = 10; + int maxQuality = 100; + int quality = maxQuality; + + // Binary search for the best quality that meets the target size + while (minQuality <= maxQuality) { + byteArrayOutputStream.reset(); + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, byteArrayOutputStream); + + int byteSize = byteArrayOutputStream.size(); + if (byteSize > targetSizeInBytes) { + maxQuality = quality - 1; + } else { + minQuality = quality + 1; + } + quality = (minQuality + maxQuality) / 2; + } + + onSuccess.accept(byteArrayOutputStream.toByteArray()); + } catch (Exception e) { + onError.accept(e); + } + }).start(); } } \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ProgressiveActivityForms/ProgressiveActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ProgressiveActivityForms/ProgressiveActivity.java new file mode 100644 index 0000000..30e5919 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ProgressiveActivityForms/ProgressiveActivity.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.hseobservationsapp.activities.ProgressiveActivityForms; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; + +public class ProgressiveActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_progressive); + 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; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/WeeklyActivityForms/WeeklyFormOne.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/WeeklyActivityForms/WeeklyFormOne.java new file mode 100644 index 0000000..d361c00 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/WeeklyActivityForms/WeeklyFormOne.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.hseobservationsapp.activities.WeeklyActivityForms; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; + +public class WeeklyFormOne extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_weekly_form_one); + 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; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/PaperWorkImageAdapter.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/PaperWorkImageAdapter.java new file mode 100644 index 0000000..79206cf --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/PaperWorkImageAdapter.java @@ -0,0 +1,150 @@ +package com.utopiaindustries.hseobservationsapp.adapters; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.media.ExifInterface; +import android.net.Uri; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.models.DocumentTypeImageModel; +import com.utopiaindustries.hseobservationsapp.utils.FullScreenImageDialog; + + +import java.io.IOException; +import java.util.List; + +public class PaperWorkImageAdapter extends RecyclerView.Adapter { + + List imageList; + private Context context; + String classType; + + public PaperWorkImageAdapter(List imageList, Context context, String classType) { + this.imageList = imageList; + this.context = context; + this.classType = classType; + } + + @NonNull + @Override + public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image, parent, false); + return new ImageViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) { + //holder.imageView.setImageResource(R.drawable.img_load); + + /*Glide.with(context) + .load(imageList.get(position)) // Glide will handle the decoding and placeholder + .placeholder(R.drawable.img_load) + .apply(new RequestOptions().centerCrop()) + .into(holder.imageView);*/ + + holder.docTypeTitle.setText(imageList.get(position).getDocumentTypeName()); + byte[] imageData = imageList.get(position).getImage(); + + // Load the image using Glide + Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); + Bitmap fixedBitmap = rotateImageIfNeeded(bitmap, position); + + Glide.with(context) + .load(fixedBitmap) // Load the adjusted bitmap + //.placeholder(R.drawable.baseline_downloading) // Show loading image + //.error(R.drawable.baseline_error) // Optional: Show error image + .diskCacheStrategy(DiskCacheStrategy.ALL) + .apply(new RequestOptions().centerCrop()) + .into(holder.imageView); + + if (classType.equalsIgnoreCase("Review")) { + holder.btnDelete.setVisibility(View.GONE); + } + else { + holder.btnDelete.setVisibility(View.VISIBLE); + } + // Set a click listener for the delete button + holder.btnDelete.setOnClickListener(v -> { + imageList.remove(position); + notifyItemRemoved(position); + notifyItemRangeChanged(position, imageList.size()); + Toast.makeText(context, "Image deleted", Toast.LENGTH_SHORT).show(); + }); + + holder.imageView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // if (classType.equalsIgnoreCase("Review")) { + FullScreenImageDialog dialog = new FullScreenImageDialog(fixedBitmap); + dialog.show(((AppCompatActivity) v.getContext()).getSupportFragmentManager(), "FullScreenDialog"); + // } + } + }); + } + + @Override + public int getItemCount() { + return imageList.size(); + } + + public class ImageViewHolder extends RecyclerView.ViewHolder { + ImageView imageView; + Button btnDelete; + TextView docTypeTitle; + + public ImageViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + btnDelete = itemView.findViewById(R.id.btnDelete); + docTypeTitle = itemView.findViewById(R.id.docTypeTitle); + } + } + + // Function to rotate the image if needed based on EXIF orientation + private Bitmap rotateImageIfNeeded(Bitmap bitmap, int position) { + try { + // You can store EXIF data or add the path here if necessary + ExifInterface exif = new ExifInterface(Uri.parse(imageList.get(position).toString()).getPath()); + int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); + int rotate = 0; + + switch (orientation) { + case ExifInterface.ORIENTATION_ROTATE_90: + rotate = 90; + break; + case ExifInterface.ORIENTATION_ROTATE_180: + rotate = 180; + break; + case ExifInterface.ORIENTATION_ROTATE_270: + rotate = 270; + break; + } + + if (rotate != 0) { + android.graphics.Matrix matrix = new android.graphics.Matrix(); + matrix.postRotate(rotate); + bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); + } + } catch (IOException e) { + Log.e("ImageAdapter", "Error rotating image: " + e.getMessage()); + } + + return bitmap; + } +} diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/HomeFragment.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/HomeFragment.java index 7285539..a00551c 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/HomeFragment.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/HomeFragment.java @@ -20,7 +20,13 @@ import android.widget.TextView; import android.widget.Toast; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.HSETrainingForms.HseOneActivity; +import com.utopiaindustries.hseobservationsapp.activities.InjuryRecordForms.InjuryFormOne; import com.utopiaindustries.hseobservationsapp.activities.ObservationForms.ObservationOneActivity; +import com.utopiaindustries.hseobservationsapp.activities.OtherHSEActivityForms.OtherHseActivity; +import com.utopiaindustries.hseobservationsapp.activities.PermitToWorkForms.PermitOneActivity; +import com.utopiaindustries.hseobservationsapp.activities.ProgressiveActivityForms.ProgressiveActivity; +import com.utopiaindustries.hseobservationsapp.activities.WeeklyActivityForms.WeeklyFormOne; import com.utopiaindustries.hseobservationsapp.adapters.FormTypeAdapter; import com.utopiaindustries.hseobservationsapp.adapters.ShiftAdapter; import com.utopiaindustries.hseobservationsapp.models.FormType; @@ -46,6 +52,8 @@ public class HomeFragment extends Fragment { private FormTypeAdapter formTypeAdapter; private ArrayList formArrayList = new ArrayList<>(); + int selectedOption; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -81,6 +89,7 @@ public class HomeFragment extends Fragment { public void onItemClick(AdapterView parent, View view, int position, long id) { // Perform action when formTextview item is clicked Toast.makeText(getActivity(), "Item clicked: " + formArrayList.get(position).getTitle(), Toast.LENGTH_SHORT).show(); + selectedOption = formArrayList.get(position).getId(); } }); @@ -88,8 +97,32 @@ public class HomeFragment extends Fragment { btnNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Intent intent = new Intent(getActivity(), ObservationOneActivity.class); - startActivity(intent); + switch (selectedOption) { + case 1: + startActivity(new Intent(getActivity(), ObservationOneActivity.class)); + break; + case 2: + startActivity(new Intent(getActivity(), PermitOneActivity.class)); + break; + case 3: + startActivity(new Intent(getActivity(), HseOneActivity.class)); + break; + case 4: + startActivity(new Intent(getActivity(), InjuryFormOne.class)); + break; + case 5: + startActivity(new Intent(getActivity(), WeeklyFormOne.class)); + break; + case 6: + startActivity(new Intent(getActivity(), ProgressiveActivity.class)); + break; + case 7: + startActivity(new Intent(getActivity(), OtherHseActivity.class)); + break; + default: + Toast.makeText(getActivity(), "No option selected", Toast.LENGTH_SHORT).show(); + break; + } } }); diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/models/DocumentTypeImageModel.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/models/DocumentTypeImageModel.java new file mode 100644 index 0000000..fa2de95 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/models/DocumentTypeImageModel.java @@ -0,0 +1,42 @@ +package com.utopiaindustries.hseobservationsapp.models; + +public class DocumentTypeImageModel { + + private String docTypeId; + private String documentTypeName; + private byte[] image; + + public DocumentTypeImageModel(String docTypeId, String documentTypeName, byte[] image) { + this.docTypeId = docTypeId; + this.documentTypeName = documentTypeName; + this.image = image; + } + + public String getDocTypeId() { + return docTypeId; + } + public void setDocTypeId(String docTypeId) { + this.docTypeId = docTypeId; + } + public String getDocumentTypeName() { + return documentTypeName; + } + public void setDocumentTypeName(String documentTypeName) { + this.documentTypeName = documentTypeName; + } + public byte[] getImage() { + return image; + } + public void setImage(byte[] image) { + this.image = image; + } + + + @Override + public String toString() { + return "DocumentTypeImageModel{" + + "docTypeId='" + docTypeId + '\'' + + ", documentTypeName='" + documentTypeName + '\'' + + '}'; + } +} diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/utils/FullScreenImageDialog.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/utils/FullScreenImageDialog.java new file mode 100644 index 0000000..7a8d4b5 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/utils/FullScreenImageDialog.java @@ -0,0 +1,47 @@ +package com.utopiaindustries.hseobservationsapp.utils; + +import android.app.Dialog; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; + +import com.utopiaindustries.hseobservationsapp.R; + + +public class FullScreenImageDialog extends DialogFragment { + private Bitmap imageBitmap; + + public FullScreenImageDialog(Bitmap imageBitmap) { + this.imageBitmap = imageBitmap; + } + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + Dialog dialog = new Dialog(requireContext()); + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(R.layout.dialog_fullscreen_image); + + /*ImageView imageView = dialog.findViewById(R.id.fullscreenImageView); + imageView.setImageBitmap(imageBitmap);*/ + + //imageView.setOnClickListener(v -> dismiss()); // Close on image click + ImageView imageView = dialog.findViewById(R.id.img_view); + imageView.setImageBitmap(imageBitmap); + + ImageView btnClose = dialog.findViewById(R.id.btn_close); + btnClose.setOnClickListener(v -> dismiss()); + + dialog.getWindow().setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT + ); + return dialog; + } +} diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/utils/HSEManagement.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/utils/HSEManagement.java new file mode 100644 index 0000000..1367851 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/utils/HSEManagement.java @@ -0,0 +1,13 @@ +package com.utopiaindustries.hseobservationsapp.utils; + +import android.app.Application; + +import androidx.appcompat.app.AppCompatDelegate; + +public class HSEManagement extends Application { + @Override + public void onCreate() { + super.onCreate(); + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + } +} diff --git a/app/src/main/res/layout/activity_hse_one.xml b/app/src/main/res/layout/activity_hse_one.xml new file mode 100644 index 0000000..3518ea7 --- /dev/null +++ b/app/src/main/res/layout/activity_hse_one.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +