diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/HSETrainingForms/HseOneActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/HSETrainingForms/HseOneActivity.java index 031392b..8e1e209 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/HSETrainingForms/HseOneActivity.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/HSETrainingForms/HseOneActivity.java @@ -1,16 +1,167 @@ package com.utopiaindustries.hseobservationsapp.activities.HSETrainingForms; +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.drawable.ColorDrawable; +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.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.activity.EdgeToEdge; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; 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.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.DashboardActivity; +import com.utopiaindustries.hseobservationsapp.activities.PermitToWorkForms.PermitTwoActivity; +import com.utopiaindustries.hseobservationsapp.adapters.PTWImageAdapter; +import com.utopiaindustries.hseobservationsapp.models.DocumentTypeImageModel; -public class HseOneActivity extends AppCompatActivity { +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +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 HseOneActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, + EasyPermissions.RationaleCallbacks{ + + RecyclerView trainingPicRecyclerView; + PTWImageAdapter imagePaperAdapter; + String paperFilePath = "no_pic"; + ArrayList PaperImageList = new ArrayList<>(); + String docTypeId = ""; + String docTypeTitle = ""; + private static final int CAMERA_REQUEST_PAPER = 101; + private static final int GALLERY_REQUEST = 201; + ImageView imgUpload, imgBack; + Button btnNext; + + // Activity Result Launcher for Gallery + private final ActivityResultLauncher imagePickerLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + Uri selectedImage = result.getData().getData(); + + uriToByteArrayAsync( + this, + selectedImage, + 100, // Target size in KB + compressedImage -> { + // Handle the compressed image here, e.g., display it + runOnUiThread(() -> { + DocumentTypeImageModel documentImage = new DocumentTypeImageModel( + docTypeId, + docTypeTitle, + compressedImage + ); + + //Log.e("doc-image: ",""+ documentImage); + + int position = PaperImageList.size(); + PaperImageList.add(documentImage); + imagePaperAdapter.notifyItemInserted(position); + }); + }, + error -> { + // Handle any errors + runOnUiThread(() -> { + Toast.makeText(this, "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } + ); + } + else if (result.getResultCode() == RESULT_CANCELED) { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + else { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + }); + + // 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, + 100, // 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 +173,365 @@ public class HseOneActivity extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + initializeLayouts(); + + imgUpload.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + alertForPictures(HseOneActivity.this); + } + }); + + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + btnNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(HseOneActivity.this, HseTwoActivity.class); + startActivity(intent); + } + }); + } + + private void initializeLayouts() { + imgUpload = findViewById(R.id.img_upload); + imgBack = findViewById(R.id.img_back); + btnNext = findViewById(R.id.btn_next); + + trainingPicRecyclerView = findViewById(R.id.tPicturesRecyclerView); + + imagePaperAdapter = new PTWImageAdapter(PaperImageList, this, ""); + trainingPicRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); + trainingPicRecyclerView.setAdapter(imagePaperAdapter); + + } + + 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(); + } + + public void uriToByteArrayAsync( + Context context, + Uri uri, + int targetSizeInKB, + Consumer onSuccess, + Consumer onError + ) { + new Thread(() -> { + try { + int targetSizeInBytes = targetSizeInKB * 1024; + + // Load the image as a Bitmap without scaling + Bitmap bitmap; + try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) { + bitmap = BitmapFactory.decodeStream(inputStream); + } + + if (bitmap == null) { + throw new IOException("Failed to decode image from URI."); + } + + 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 (IOException e) { + onError.accept(e); + } + }).start(); + } + + 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; + } + + @SuppressLint("MissingInflatedId") + public void alertForPictures(Context con) { + ViewGroup viewGroup = findViewById(android.R.id.content); + + TextView dialogCameraBtn, dialogGalleryBtn; + + AlertDialog.Builder builder = new AlertDialog.Builder(con); + View view1 = LayoutInflater.from(con).inflate(R.layout.custom_layout_for_image, viewGroup, false); + builder.setCancelable(false); + builder.setView(view1); + + dialogCameraBtn = view1.findViewById(R.id.dialog_camera_btn); + dialogGalleryBtn = view1.findViewById(R.id.dialog_gallery_btn); + + AlertDialog alertDialog = builder.create(); + alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + dialogCameraBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openCamera(); + + } + }); + + dialogGalleryBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openGallery(); + + } + }); + + alertDialog.show(); + } + + @AfterPermissionGranted(GALLERY_REQUEST) + public void openGallery() { + if (hasGalleryPermission()) { + // Have permission, do the thing! + Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + // Start the Intent + //startActivityForResult(galleryIntent, GALLERY_REQUEST); + imagePickerLauncher.launch(galleryIntent); + } else { + // Ask for one permission + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + + } + EasyPermissions.requestPermissions(this, getString(R.string.rationale_gallery), GALLERY_REQUEST, perms); + } + } + + @AfterPermissionGranted(CAMERA_REQUEST_PAPER) + public void openCamera() { + if (hasCameraPermission()) { + try { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + File photoFile = null; + try { + photoFile = createImageFile(); + } 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 boolean hasGalleryPermission() { + String[] perms = {}; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + } + + return EasyPermissions.hasPermissions(this, perms); + } + + private File createImageFile() 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) { + } } \ 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 index 6f523ca..bcfbd96 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/HSETrainingForms/HseTwoActivity.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/HSETrainingForms/HseTwoActivity.java @@ -1,6 +1,10 @@ package com.utopiaindustries.hseobservationsapp.activities.HSETrainingForms; +import android.content.Intent; import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; @@ -9,9 +13,13 @@ import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.DashboardActivity; +import com.utopiaindustries.hseobservationsapp.activities.PermitToWorkForms.PermitTwoActivity; public class HseTwoActivity extends AppCompatActivity { + Button btnSubmit; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -22,5 +30,24 @@ public class HseTwoActivity extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + initializeLayouts(); + + btnSubmit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(HseTwoActivity.this,"Reported Submitted",Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(HseTwoActivity.this, DashboardActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + } + }); + } + + private void initializeLayouts() { + + btnSubmit = findViewById(R.id.btn_submit); } } \ 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 index 01b6913..8b00283 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormFour.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormFour.java @@ -1,6 +1,10 @@ package com.utopiaindustries.hseobservationsapp.activities.InjuryRecordForms; +import android.content.Intent; import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; @@ -9,9 +13,13 @@ import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.DashboardActivity; +import com.utopiaindustries.hseobservationsapp.activities.ObservationForms.ObservationThreeActivity; public class InjuryFormFour extends AppCompatActivity { + Button btnSubmit; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -22,5 +30,24 @@ public class InjuryFormFour extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + initializeLayouts(); + + btnSubmit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(InjuryFormFour.this,"Reported Submitted",Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(InjuryFormFour.this, DashboardActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + } + }); + } + + private void initializeLayouts() { + + btnSubmit = findViewById(R.id.btn_submit); } } \ 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 index 951dfa7..cb89f20 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormOne.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormOne.java @@ -2,8 +2,10 @@ package com.utopiaindustries.hseobservationsapp.activities.InjuryRecordForms; import android.app.DatePickerDialog; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.view.View; +import android.widget.Button; import android.widget.DatePicker; import android.widget.ImageView; import android.widget.TextView; @@ -26,6 +28,7 @@ public class InjuryFormOne extends AppCompatActivity { private Calendar calendar; TextView txtDate; private ImageView imgCalendar; + Button btnNext; @Override protected void onCreate(Bundle savedInstanceState) { @@ -46,6 +49,14 @@ public class InjuryFormOne extends AppCompatActivity { showDatePickerDialog(InjuryFormOne.this); } }); + + btnNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(InjuryFormOne.this, InjuryFormTwo.class); + startActivity(intent); + } + }); } private void initializeLayouts() { @@ -56,6 +67,7 @@ public class InjuryFormOne extends AppCompatActivity { day = calendar.get(Calendar.DAY_OF_MONTH); txtDate = findViewById(R.id.txt_date); imgCalendar = findViewById(R.id.img_calendar); + btnNext = findViewById(R.id.btn_next); } 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 index ec085af..f89a57a 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormThree.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormThree.java @@ -1,16 +1,167 @@ package com.utopiaindustries.hseobservationsapp.activities.InjuryRecordForms; +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.drawable.ColorDrawable; +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.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.activity.EdgeToEdge; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; 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.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.DashboardActivity; +import com.utopiaindustries.hseobservationsapp.activities.PermitToWorkForms.PermitTwoActivity; +import com.utopiaindustries.hseobservationsapp.adapters.PTWImageAdapter; +import com.utopiaindustries.hseobservationsapp.models.DocumentTypeImageModel; -public class InjuryFormThree extends AppCompatActivity { +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +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 InjuryFormThree extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, + EasyPermissions.RationaleCallbacks{ + + RecyclerView picturesRecyclerView; + PTWImageAdapter imagePaperAdapter; + String paperFilePath = "no_pic"; + ArrayList PaperImageList = new ArrayList<>(); + String docTypeId = ""; + String docTypeTitle = ""; + private static final int CAMERA_REQUEST_PAPER = 101; + private static final int GALLERY_REQUEST = 201; + ImageView imgUpload, imgBack; + Button btnNext; + + // Activity Result Launcher for Gallery + private final ActivityResultLauncher imagePickerLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + Uri selectedImage = result.getData().getData(); + + uriToByteArrayAsync( + this, + selectedImage, + 100, // Target size in KB + compressedImage -> { + // Handle the compressed image here, e.g., display it + runOnUiThread(() -> { + DocumentTypeImageModel documentImage = new DocumentTypeImageModel( + docTypeId, + docTypeTitle, + compressedImage + ); + + //Log.e("doc-image: ",""+ documentImage); + + int position = PaperImageList.size(); + PaperImageList.add(documentImage); + imagePaperAdapter.notifyItemInserted(position); + }); + }, + error -> { + // Handle any errors + runOnUiThread(() -> { + Toast.makeText(this, "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } + ); + } + else if (result.getResultCode() == RESULT_CANCELED) { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + else { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + }); + + // 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, + 100, // 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 +173,365 @@ public class InjuryFormThree extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + initializeLayouts(); + + imgUpload.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + alertForPictures(InjuryFormThree.this); + } + }); + + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + btnNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(InjuryFormThree.this, InjuryFormFour.class); + startActivity(intent); + } + }); + } + + private void initializeLayouts() { + + imgUpload = findViewById(R.id.img_upload); + imgBack = findViewById(R.id.img_back); + btnNext = findViewById(R.id.btn_next); + + picturesRecyclerView = findViewById(R.id.picturesRecyclerView); + + imagePaperAdapter = new PTWImageAdapter(PaperImageList, this, ""); + picturesRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); + picturesRecyclerView.setAdapter(imagePaperAdapter); + } + + @SuppressLint("MissingInflatedId") + public void alertForPictures(Context con) { + ViewGroup viewGroup = findViewById(android.R.id.content); + + TextView dialogCameraBtn, dialogGalleryBtn; + + AlertDialog.Builder builder = new AlertDialog.Builder(con); + View view1 = LayoutInflater.from(con).inflate(R.layout.custom_layout_for_image, viewGroup, false); + builder.setCancelable(false); + builder.setView(view1); + + dialogCameraBtn = view1.findViewById(R.id.dialog_camera_btn); + dialogGalleryBtn = view1.findViewById(R.id.dialog_gallery_btn); + + AlertDialog alertDialog = builder.create(); + alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + dialogCameraBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openCamera(); + + } + }); + + dialogGalleryBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openGallery(); + + } + }); + + alertDialog.show(); + } + + @AfterPermissionGranted(GALLERY_REQUEST) + public void openGallery() { + if (hasGalleryPermission()) { + // Have permission, do the thing! + Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + // Start the Intent + //startActivityForResult(galleryIntent, GALLERY_REQUEST); + imagePickerLauncher.launch(galleryIntent); + } else { + // Ask for one permission + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + + } + EasyPermissions.requestPermissions(this, getString(R.string.rationale_gallery), GALLERY_REQUEST, perms); + } + } + + @AfterPermissionGranted(CAMERA_REQUEST_PAPER) + public void openCamera() { + if (hasCameraPermission()) { + try { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + File photoFile = null; + try { + photoFile = createImageFile(); + } 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 boolean hasGalleryPermission() { + String[] perms = {}; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + } + + 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() 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(); + } + + public void uriToByteArrayAsync( + Context context, + Uri uri, + int targetSizeInKB, + Consumer onSuccess, + Consumer onError + ) { + new Thread(() -> { + try { + int targetSizeInBytes = targetSizeInKB * 1024; + + // Load the image as a Bitmap without scaling + Bitmap bitmap; + try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) { + bitmap = BitmapFactory.decodeStream(inputStream); + } + + if (bitmap == null) { + throw new IOException("Failed to decode image from URI."); + } + + 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 (IOException e) { + onError.accept(e); + } + }).start(); } } \ 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 index ddd21dc..88b58fc 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormTwo.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/InjuryRecordForms/InjuryFormTwo.java @@ -1,6 +1,9 @@ package com.utopiaindustries.hseobservationsapp.activities.InjuryRecordForms; +import android.content.Intent; import android.os.Bundle; +import android.view.View; +import android.widget.Button; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; @@ -12,6 +15,8 @@ import com.utopiaindustries.hseobservationsapp.R; public class InjuryFormTwo extends AppCompatActivity { + Button btnNext; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -22,5 +27,20 @@ public class InjuryFormTwo extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + initializeLayouts(); + + btnNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(InjuryFormTwo.this, InjuryFormThree.class); + startActivity(intent); + } + }); + } + + private void initializeLayouts() { + + btnNext = findViewById(R.id.btn_next); } } \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationNearMissActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationNearMissActivity.java index 5d8e301..88c0e43 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationNearMissActivity.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationNearMissActivity.java @@ -17,6 +17,8 @@ import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.DashboardActivity; +import com.utopiaindustries.hseobservationsapp.activities.PermitToWorkForms.PermitTwoActivity; import com.utopiaindustries.hseobservationsapp.adapters.ObservationClassAdapter; import com.utopiaindustries.hseobservationsapp.adapters.ObservationSubClassAdapter; import com.utopiaindustries.hseobservationsapp.models.Shift; @@ -29,7 +31,7 @@ public class ObservationNearMissActivity extends AppCompatActivity { private ObservationClassAdapter observationClassAdapter; private ArrayList obClassArrayList = new ArrayList<>(); - private Button btnNext; + private Button btnSubmit; ImageView imgBack; String observationClass = ""; @@ -55,12 +57,18 @@ public class ObservationNearMissActivity extends AppCompatActivity { } }); - btnNext.setOnClickListener(new View.OnClickListener() { + btnSubmit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if (isValidate()) { + /* if (isValidate()) { - } + }*/ + Toast.makeText(ObservationNearMissActivity.this,"Reported Submitted",Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(ObservationNearMissActivity.this, DashboardActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } }); @@ -76,7 +84,7 @@ public class ObservationNearMissActivity extends AppCompatActivity { public void initializeLayout() { observationTextview = findViewById(R.id.observation_near_textview); - btnNext = findViewById(R.id.btn_next); + btnSubmit = findViewById(R.id.btn_submit); imgBack = findViewById(R.id.img_back); etDescription = findViewById(R.id.et_description); diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationThreeActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationThreeActivity.java index 5200d77..1d1fcac 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationThreeActivity.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationThreeActivity.java @@ -1,9 +1,12 @@ package com.utopiaindustries.hseobservationsapp.activities.ObservationForms; +import android.content.Intent; import android.os.Bundle; import android.view.View; +import android.widget.Button; import android.widget.ImageView; import android.widget.RadioGroup; +import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; @@ -12,12 +15,15 @@ import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.DashboardActivity; +import com.utopiaindustries.hseobservationsapp.activities.PermitToWorkForms.PermitTwoActivity; public class ObservationThreeActivity extends AppCompatActivity { RadioGroup rg1; ImageView imgBack; + Button btnSubmit, btnDraft; @Override protected void onCreate(Bundle savedInstanceState) { @@ -53,11 +59,33 @@ public class ObservationThreeActivity extends AppCompatActivity { } } }); + + btnSubmit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(ObservationThreeActivity.this,"Reported Submitted",Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(ObservationThreeActivity.this, DashboardActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + } + }); + + btnDraft.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); } private void initializeLayouts() { rg1 = findViewById(R.id.rg1); imgBack = findViewById(R.id.img_back); + + btnSubmit = findViewById(R.id.btn_submit); + btnDraft = findViewById(R.id.btn_draft); } } \ 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 index 46238da..bf800ab 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/OtherHSEActivityForms/OtherHseActivity.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/OtherHSEActivityForms/OtherHseActivity.java @@ -1,6 +1,10 @@ package com.utopiaindustries.hseobservationsapp.activities.OtherHSEActivityForms; +import android.content.Intent; import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; @@ -9,9 +13,12 @@ import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.DashboardActivity; public class OtherHseActivity extends AppCompatActivity { + Button btnSubmit; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -22,5 +29,26 @@ public class OtherHseActivity extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + initializeLayouts(); + + btnSubmit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(OtherHseActivity.this,"Reported Submitted",Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(OtherHseActivity.this, DashboardActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + } + }); } + + private void initializeLayouts() { + + btnSubmit = findViewById(R.id.btn_submit); + } + + } \ 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 1ddb0c7..d53af69 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,26 +1,35 @@ package com.utopiaindustries.hseobservationsapp.activities.PermitToWorkForms; import android.Manifest; +import android.annotation.SuppressLint; import android.content.ActivityNotFoundException; +import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Color; import android.graphics.Matrix; +import android.graphics.drawable.ColorDrawable; 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.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; import android.widget.CheckBox; import android.widget.ImageView; +import android.widget.TextView; 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.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.FileProvider; import androidx.core.graphics.Insets; @@ -29,13 +38,18 @@ import androidx.core.view.WindowInsetsCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.DashboardActivity; +import com.utopiaindustries.hseobservationsapp.activities.ObservationForms.ObservationThreeActivity; import com.utopiaindustries.hseobservationsapp.adapters.PTWImageAdapter; import com.utopiaindustries.hseobservationsapp.models.DocumentTypeImageModel; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -57,7 +71,51 @@ public class PermitTwoActivity extends AppCompatActivity implements EasyPermissi String docTypeId = ""; String docTypeTitle = ""; private static final int CAMERA_REQUEST_PAPER = 101; + private static final int GALLERY_REQUEST = 201; ImageView imgUpload, imgBack; + Button btnSubmit; + + // Activity Result Launcher for Gallery + private final ActivityResultLauncher imagePickerLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + Uri selectedImage = result.getData().getData(); + + uriToByteArrayAsync( + this, + selectedImage, + 100, // Target size in KB + compressedImage -> { + // Handle the compressed image here, e.g., display it + runOnUiThread(() -> { + DocumentTypeImageModel documentImage = new DocumentTypeImageModel( + docTypeId, + docTypeTitle, + compressedImage + ); + + //Log.e("doc-image: ",""+ documentImage); + + int position = PaperImageList.size(); + PaperImageList.add(documentImage); + imagePaperAdapter.notifyItemInserted(position); + }); + }, + error -> { + // Handle any errors + runOnUiThread(() -> { + Toast.makeText(this, "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } + ); + } + else if (result.getResultCode() == RESULT_CANCELED) { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + else { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + }); // Activity Result Launcher for Paper Camera private final ActivityResultLauncher paperCameraLauncher = @@ -143,7 +201,7 @@ public class PermitTwoActivity extends AppCompatActivity implements EasyPermissi imgUpload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - openPaperCamera(); + alertForPictures(PermitTwoActivity.this); } }); @@ -153,6 +211,79 @@ public class PermitTwoActivity extends AppCompatActivity implements EasyPermissi finish(); } }); + + btnSubmit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(PermitTwoActivity.this,"Reported Submitted",Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(PermitTwoActivity.this, DashboardActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + } + }); + } + + @SuppressLint("MissingInflatedId") + public void alertForPictures(Context con) { + ViewGroup viewGroup = findViewById(android.R.id.content); + + TextView dialogCameraBtn, dialogGalleryBtn; + + AlertDialog.Builder builder = new AlertDialog.Builder(con); + View view1 = LayoutInflater.from(con).inflate(R.layout.custom_layout_for_image, viewGroup, false); + builder.setCancelable(false); + builder.setView(view1); + + dialogCameraBtn = view1.findViewById(R.id.dialog_camera_btn); + dialogGalleryBtn = view1.findViewById(R.id.dialog_gallery_btn); + + AlertDialog alertDialog = builder.create(); + alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + dialogCameraBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openCamera(); + + } + }); + + dialogGalleryBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openGallery(); + + } + }); + + alertDialog.show(); + } + + @AfterPermissionGranted(GALLERY_REQUEST) + public void openGallery() { + if (hasGalleryPermission()) { + // Have permission, do the thing! + Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + // Start the Intent + //startActivityForResult(galleryIntent, GALLERY_REQUEST); + imagePickerLauncher.launch(galleryIntent); + } else { + // Ask for one permission + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + + } + EasyPermissions.requestPermissions(this, getString(R.string.rationale_gallery), GALLERY_REQUEST, perms); + } } private void initializeLayouts() { @@ -160,6 +291,7 @@ public class PermitTwoActivity extends AppCompatActivity implements EasyPermissi checkboxContractor = findViewById(R.id.checkbox_contractor); imgUpload = findViewById(R.id.img_upload); imgBack = findViewById(R.id.img_back); + btnSubmit = findViewById(R.id.btn_submit); ptwRecyclerView = findViewById(R.id.ptwRecyclerView); @@ -170,7 +302,7 @@ public class PermitTwoActivity extends AppCompatActivity implements EasyPermissi } @AfterPermissionGranted(CAMERA_REQUEST_PAPER) - public void openPaperCamera() { + public void openCamera() { if (hasCameraPermission()) { try { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); @@ -277,6 +409,18 @@ public class PermitTwoActivity extends AppCompatActivity implements EasyPermissi return EasyPermissions.hasPermissions(this, perms); } + private boolean hasGalleryPermission() { + String[] perms = {}; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + } + + return EasyPermissions.hasPermissions(this, perms); + } + private Bitmap fixImageRotation(String imagePath) { Bitmap bitmap = BitmapFactory.decodeFile(imagePath); try { @@ -371,4 +515,51 @@ public class PermitTwoActivity extends AppCompatActivity implements EasyPermissi } }).start(); } + + public void uriToByteArrayAsync( + Context context, + Uri uri, + int targetSizeInKB, + Consumer onSuccess, + Consumer onError + ) { + new Thread(() -> { + try { + int targetSizeInBytes = targetSizeInKB * 1024; + + // Load the image as a Bitmap without scaling + Bitmap bitmap; + try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) { + bitmap = BitmapFactory.decodeStream(inputStream); + } + + if (bitmap == null) { + throw new IOException("Failed to decode image from URI."); + } + + 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 (IOException 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 index 30e5919..d25f845 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ProgressiveActivityForms/ProgressiveActivity.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ProgressiveActivityForms/ProgressiveActivity.java @@ -1,16 +1,167 @@ package com.utopiaindustries.hseobservationsapp.activities.ProgressiveActivityForms; +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.drawable.ColorDrawable; +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.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.activity.EdgeToEdge; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; 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.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.DashboardActivity; +import com.utopiaindustries.hseobservationsapp.activities.WeeklyActivityForms.WeeklyFormOne; +import com.utopiaindustries.hseobservationsapp.adapters.PTWImageAdapter; +import com.utopiaindustries.hseobservationsapp.models.DocumentTypeImageModel; -public class ProgressiveActivity extends AppCompatActivity { +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +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 ProgressiveActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, + EasyPermissions.RationaleCallbacks { + + RecyclerView picturesRecyclerView; + PTWImageAdapter imagePaperAdapter; + String paperFilePath = "no_pic"; + ArrayList PaperImageList = new ArrayList<>(); + String docTypeId = ""; + String docTypeTitle = ""; + private static final int CAMERA_REQUEST_PAPER = 101; + private static final int GALLERY_REQUEST = 201; + ImageView imgUpload, imgBack; + Button btnSubmit; + + // Activity Result Launcher for Gallery + private final ActivityResultLauncher imagePickerLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + Uri selectedImage = result.getData().getData(); + + uriToByteArrayAsync( + this, + selectedImage, + 100, // Target size in KB + compressedImage -> { + // Handle the compressed image here, e.g., display it + runOnUiThread(() -> { + DocumentTypeImageModel documentImage = new DocumentTypeImageModel( + docTypeId, + docTypeTitle, + compressedImage + ); + + //Log.e("doc-image: ",""+ documentImage); + + int position = PaperImageList.size(); + PaperImageList.add(documentImage); + imagePaperAdapter.notifyItemInserted(position); + }); + }, + error -> { + // Handle any errors + runOnUiThread(() -> { + Toast.makeText(this, "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } + ); + } + else if (result.getResultCode() == RESULT_CANCELED) { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + else { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + }); + + // 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, + 100, // 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 +173,370 @@ public class ProgressiveActivity extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + initializeLayouts(); + + imgUpload.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + alertForPictures(ProgressiveActivity.this); + } + }); + + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + btnSubmit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(ProgressiveActivity.this,"Reported Submitted",Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(ProgressiveActivity.this, DashboardActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + + } + }); + } + + private void initializeLayouts() { + + imgUpload = findViewById(R.id.img_upload); + imgBack = findViewById(R.id.img_back); + btnSubmit = findViewById(R.id.btn_submit); + + picturesRecyclerView = findViewById(R.id.picturesRecyclerView); + + imagePaperAdapter = new PTWImageAdapter(PaperImageList, this, ""); + picturesRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); + picturesRecyclerView.setAdapter(imagePaperAdapter); + } + + @SuppressLint("MissingInflatedId") + public void alertForPictures(Context con) { + ViewGroup viewGroup = findViewById(android.R.id.content); + + TextView dialogCameraBtn, dialogGalleryBtn; + + AlertDialog.Builder builder = new AlertDialog.Builder(con); + View view1 = LayoutInflater.from(con).inflate(R.layout.custom_layout_for_image, viewGroup, false); + builder.setCancelable(false); + builder.setView(view1); + + dialogCameraBtn = view1.findViewById(R.id.dialog_camera_btn); + dialogGalleryBtn = view1.findViewById(R.id.dialog_gallery_btn); + + AlertDialog alertDialog = builder.create(); + alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + dialogCameraBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openCamera(); + + } + }); + + dialogGalleryBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openGallery(); + + } + }); + + alertDialog.show(); + } + + @AfterPermissionGranted(GALLERY_REQUEST) + public void openGallery() { + if (hasGalleryPermission()) { + // Have permission, do the thing! + Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + // Start the Intent + //startActivityForResult(galleryIntent, GALLERY_REQUEST); + imagePickerLauncher.launch(galleryIntent); + } else { + // Ask for one permission + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + + } + EasyPermissions.requestPermissions(this, getString(R.string.rationale_gallery), GALLERY_REQUEST, perms); + } + } + + @AfterPermissionGranted(CAMERA_REQUEST_PAPER) + public void openCamera() { + if (hasCameraPermission()) { + try { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + File photoFile = null; + try { + photoFile = createImageFile(); + } 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 boolean hasGalleryPermission() { + String[] perms = {}; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + } + + 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() 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(); + } + + public void uriToByteArrayAsync( + Context context, + Uri uri, + int targetSizeInKB, + Consumer onSuccess, + Consumer onError + ) { + new Thread(() -> { + try { + int targetSizeInBytes = targetSizeInKB * 1024; + + // Load the image as a Bitmap without scaling + Bitmap bitmap; + try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) { + bitmap = BitmapFactory.decodeStream(inputStream); + } + + if (bitmap == null) { + throw new IOException("Failed to decode image from URI."); + } + + 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 (IOException e) { + onError.accept(e); + } + }).start(); } } \ 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 index d361c00..00013a1 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/WeeklyActivityForms/WeeklyFormOne.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/WeeklyActivityForms/WeeklyFormOne.java @@ -1,16 +1,169 @@ package com.utopiaindustries.hseobservationsapp.activities.WeeklyActivityForms; +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.drawable.ColorDrawable; +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.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.activity.EdgeToEdge; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; 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.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.DashboardActivity; +import com.utopiaindustries.hseobservationsapp.activities.InjuryRecordForms.InjuryFormFour; +import com.utopiaindustries.hseobservationsapp.activities.InjuryRecordForms.InjuryFormThree; +import com.utopiaindustries.hseobservationsapp.activities.ObservationForms.ObservationThreeActivity; +import com.utopiaindustries.hseobservationsapp.adapters.PTWImageAdapter; +import com.utopiaindustries.hseobservationsapp.models.DocumentTypeImageModel; -public class WeeklyFormOne extends AppCompatActivity { +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +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 WeeklyFormOne extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, + EasyPermissions.RationaleCallbacks { + + RecyclerView picturesRecyclerView; + PTWImageAdapter imagePaperAdapter; + String paperFilePath = "no_pic"; + ArrayList PaperImageList = new ArrayList<>(); + String docTypeId = ""; + String docTypeTitle = ""; + private static final int CAMERA_REQUEST_PAPER = 101; + private static final int GALLERY_REQUEST = 201; + ImageView imgUpload, imgBack; + Button btnSubmit; + + // Activity Result Launcher for Gallery + private final ActivityResultLauncher imagePickerLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + Uri selectedImage = result.getData().getData(); + + uriToByteArrayAsync( + this, + selectedImage, + 100, // Target size in KB + compressedImage -> { + // Handle the compressed image here, e.g., display it + runOnUiThread(() -> { + DocumentTypeImageModel documentImage = new DocumentTypeImageModel( + docTypeId, + docTypeTitle, + compressedImage + ); + + //Log.e("doc-image: ",""+ documentImage); + + int position = PaperImageList.size(); + PaperImageList.add(documentImage); + imagePaperAdapter.notifyItemInserted(position); + }); + }, + error -> { + // Handle any errors + runOnUiThread(() -> { + Toast.makeText(this, "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } + ); + } + else if (result.getResultCode() == RESULT_CANCELED) { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + else { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + }); + + // 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, + 100, // 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 +175,369 @@ public class WeeklyFormOne extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + initializeLayouts(); + + imgUpload.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + alertForPictures(WeeklyFormOne.this); + } + }); + + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + btnSubmit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(WeeklyFormOne.this,"Reported Submitted",Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(WeeklyFormOne.this, DashboardActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + } + }); + } + + private void initializeLayouts() { + + imgUpload = findViewById(R.id.img_upload); + imgBack = findViewById(R.id.img_back); + btnSubmit = findViewById(R.id.btn_submit); + + picturesRecyclerView = findViewById(R.id.picturesRecyclerView); + + imagePaperAdapter = new PTWImageAdapter(PaperImageList, this, ""); + picturesRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); + picturesRecyclerView.setAdapter(imagePaperAdapter); + } + + @SuppressLint("MissingInflatedId") + public void alertForPictures(Context con) { + ViewGroup viewGroup = findViewById(android.R.id.content); + + TextView dialogCameraBtn, dialogGalleryBtn; + + AlertDialog.Builder builder = new AlertDialog.Builder(con); + View view1 = LayoutInflater.from(con).inflate(R.layout.custom_layout_for_image, viewGroup, false); + builder.setCancelable(false); + builder.setView(view1); + + dialogCameraBtn = view1.findViewById(R.id.dialog_camera_btn); + dialogGalleryBtn = view1.findViewById(R.id.dialog_gallery_btn); + + AlertDialog alertDialog = builder.create(); + alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + dialogCameraBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openCamera(); + + } + }); + + dialogGalleryBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openGallery(); + + } + }); + + alertDialog.show(); + } + + @AfterPermissionGranted(GALLERY_REQUEST) + public void openGallery() { + if (hasGalleryPermission()) { + // Have permission, do the thing! + Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + // Start the Intent + //startActivityForResult(galleryIntent, GALLERY_REQUEST); + imagePickerLauncher.launch(galleryIntent); + } else { + // Ask for one permission + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + + } + EasyPermissions.requestPermissions(this, getString(R.string.rationale_gallery), GALLERY_REQUEST, perms); + } + } + + @AfterPermissionGranted(CAMERA_REQUEST_PAPER) + public void openCamera() { + if (hasCameraPermission()) { + try { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + File photoFile = null; + try { + photoFile = createImageFile(); + } 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 boolean hasGalleryPermission() { + String[] perms = {}; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + } + + 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() 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(); + } + + public void uriToByteArrayAsync( + Context context, + Uri uri, + int targetSizeInKB, + Consumer onSuccess, + Consumer onError + ) { + new Thread(() -> { + try { + int targetSizeInBytes = targetSizeInKB * 1024; + + // Load the image as a Bitmap without scaling + Bitmap bitmap; + try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) { + bitmap = BitmapFactory.decodeStream(inputStream); + } + + if (bitmap == null) { + throw new IOException("Failed to decode image from URI."); + } + + 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 (IOException e) { + onError.accept(e); + } + }).start(); } } \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/PTWImageAdapter.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/PTWImageAdapter.java index 6d3cc6f..07ba505 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/PTWImageAdapter.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/PTWImageAdapter.java @@ -58,7 +58,7 @@ public class PTWImageAdapter extends RecyclerView.Adapter { 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 @@ -105,14 +98,14 @@ public class PTWImageAdapter extends RecyclerView.Adapter + android:width="0.9dp" + android:color="@color/grey_500" /> diff --git a/app/src/main/res/layout/activity_hse_one.xml b/app/src/main/res/layout/activity_hse_one.xml index 7b9a9ec..6afa9e2 100644 --- a/app/src/main/res/layout/activity_hse_one.xml +++ b/app/src/main/res/layout/activity_hse_one.xml @@ -59,10 +59,10 @@ @@ -75,7 +75,7 @@ android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:hint="@string/select_safety_training" - android:padding="5dp" + android:padding="2dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> @@ -90,10 +90,10 @@ @@ -102,9 +102,9 @@ android:id="@+id/et_no_of_employees" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="5dp" android:layout_marginTop="5dp" - android:layout_marginRight="10dp" + android:layout_marginStart="10dp" + android:layout_marginEnd="10dp" android:background="@drawable/et_border" android:hint="No Of Employees" android:imeOptions="actionDone" @@ -115,10 +115,10 @@ @@ -143,19 +143,44 @@ android:textSize="16sp" /> + + + + + + + + android:paddingStart="5dp" + android:paddingEnd="5dp" + android:textSize="@dimen/_10sdp" + android:text="Upload up to 5 supported files: PDF or image. Max 10 MB per file."/> + diff --git a/app/src/main/res/layout/activity_hse_two.xml b/app/src/main/res/layout/activity_hse_two.xml index f07b597..16f81d3 100644 --- a/app/src/main/res/layout/activity_hse_two.xml +++ b/app/src/main/res/layout/activity_hse_two.xml @@ -53,15 +53,16 @@ @@ -70,9 +71,9 @@ android:id="@+id/et_no_of_employees" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="5dp" + android:layout_marginEnd="10dp" + android:layout_marginStart="10dp" android:layout_marginTop="5dp" - android:layout_marginRight="10dp" android:background="@drawable/et_border" android:hint="No Of Employees" android:imeOptions="actionDone" @@ -84,10 +85,10 @@ android:id="@+id/heading_description" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="5dp" + android:layout_marginTop="10dp" android:gravity="left" android:padding="5dp" - android:text="Description" + android:text="Description *" android:textColor="@color/black" android:textSize="@dimen/_13sdp" android:textStyle="bold" @@ -101,7 +102,7 @@ android:layout_marginStart="10dp" android:layout_marginTop="5dp" android:layout_marginEnd="10dp" - android:layout_marginBottom="5dp" + android:layout_marginBottom="10dp" android:background="@drawable/et_border" android:gravity="top|start" android:hint="Write Description Here" @@ -119,7 +120,7 @@