API mechanism implemented

master
saad.siddiq 2024-11-23 15:52:52 +05:00
parent f35e7c534b
commit 4b54fa3ba3
21 changed files with 2038 additions and 68 deletions

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -6,6 +6,7 @@
android:name="android.hardware.camera" android:name="android.hardware.camera"
android:required="false" /> android:required="false" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-permission <uses-permission
@ -26,6 +27,8 @@
android:roundIcon="@drawable/search" android:roundIcon="@drawable/search"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.QualityControlApp" android:theme="@style/Theme.QualityControlApp"
android:allowClearUserData="true"
android:usesCleartextTraffic="true"
tools:targetApi="31"> tools:targetApi="31">
<activity <activity
android:name=".activities.SummaryActivity" android:name=".activities.SummaryActivity"

View File

@ -5,6 +5,7 @@ import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.widget.Button; import android.widget.Button;
import android.widget.Toast;
import androidx.activity.EdgeToEdge; import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
@ -22,6 +23,7 @@ import com.utopiaindustries.qualitycontrol.fragments.HomeFragment;
import com.utopiaindustries.qualitycontrol.fragments.PackingFragment; import com.utopiaindustries.qualitycontrol.fragments.PackingFragment;
import com.utopiaindustries.qualitycontrol.fragments.StitchingFragment; import com.utopiaindustries.qualitycontrol.fragments.StitchingFragment;
import com.utopiaindustries.qualitycontrol.fragments.SubStoreFragment; import com.utopiaindustries.qualitycontrol.fragments.SubStoreFragment;
import com.utopiaindustries.qualitycontrol.helper.Helper;
import java.io.File; import java.io.File;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -47,6 +49,10 @@ public class HomeActivity extends AppCompatActivity {
return insets; return insets;
}); });
if( !Helper.isNetworkConnected(this) ){
Toast.makeText( this, "No Internet Connection", Toast.LENGTH_LONG ).show();
}
//btnNext = findViewById(R.id.btn_next); //btnNext = findViewById(R.id.btn_next);
// Initialize fragments // Initialize fragments

View File

@ -17,11 +17,8 @@ public interface ApiService {
@Query("username") String username @Query("username") String username
);*/ );*/
@GET("rest/application/authenticate-user") @GET("rest/uic/quality-control/get-quality-control-data")
Call<QualityControlResponse> isUserAuthenticated( Call<QualityControlResponse> isUserAuthenticated();
@Query("username") String username,
@Query("password") String password
);
/*@POST("rest/application/save-truck-load") /*@POST("rest/application/save-truck-load")

View File

@ -11,7 +11,7 @@ import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitClient { public class RetrofitClient {
private final static String BASE_URL = "http://192.168.90.228:8080/cosmos/"; private final static String BASE_URL = "http://192.168.91.44:8081/uind/";
private static Retrofit retrofit; private static Retrofit retrofit;

View File

@ -1,17 +1,37 @@
package com.utopiaindustries.qualitycontrol.fragments; package com.utopiaindustries.qualitycontrol.fragments;
import android.Manifest;
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.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.utopiaindustries.qualitycontrol.R; import com.utopiaindustries.qualitycontrol.R;
import com.utopiaindustries.qualitycontrol.activities.HomeActivity; import com.utopiaindustries.qualitycontrol.activities.HomeActivity;
@ -19,14 +39,101 @@ import com.utopiaindustries.qualitycontrol.adapters.ImageAdapter;
import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter; import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter;
import com.utopiaindustries.qualitycontrol.models.Item; import com.utopiaindustries.qualitycontrol.models.Item;
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.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;
public class CheckingFragment extends Fragment { import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions;
public class CheckingFragment extends Fragment implements EasyPermissions.PermissionCallbacks{
RecyclerView recyclerView, imageRecyclerView; RecyclerView recyclerView, imageRecyclerView;
ImageAdapter imageAdapter; ImageAdapter imageAdapter;
private static final int CAMERA_REQUEST = 101;
private static final int GALLERY_REQUEST = 201;
String filePath = "no_pic";
ArrayList<byte[]> imageList = new ArrayList<>();
Button nextButton;
ImageButton imagePicker, deleteImage;
// Activity Result Launcher for Gallery
private final ActivityResultLauncher<Intent> imagePickerLauncher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == requireActivity().RESULT_OK && result.getData() != null) {
Uri selectedImage = result.getData().getData();
if (selectedImage != null) {
//imageView.setImageURI(selectedImage);
Log.e("Selected-Image: ", "" + selectedImage);
uriToByteArrayAsync(
getContext(),
selectedImage,
100, // Target size in KB
compressedImage -> {
// Handle the compressed image here, e.g., display it
requireActivity().runOnUiThread(() -> {
//store.getReport().getItems().get(0).getCheckPoints().get(requestCode).addImageList(compressedImage);
imageList.add(compressedImage);
imageAdapter.notifyDataSetChanged();
});
},
error -> {
// Handle any errors
requireActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show();
});
}
);
}
}
});
// Activity Result Launcher for Camera
private final ActivityResultLauncher<Intent> cameraLauncher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Uri contentUri = Uri.fromFile(new File((filePath)));
uriToByteArrayAsync(
getContext(),
contentUri,
100, // Target size in KB
compressedImage -> {
// Handle the compressed image here, e.g., display it
requireActivity().runOnUiThread(() -> {
//store.getReport().getItems().get(0).getCheckPoints().get(requestCode).addImageList(compressedImage);
imageList.add(compressedImage);
imageAdapter.notifyDataSetChanged();
});
},
error -> {
// Handle any errors
requireActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show();
});
}
);
Log.e("contentUri: ", "" + contentUri);
if (result.getResultCode() == requireActivity().RESULT_OK && result.getData() != null) {
Uri selectedImage = result.getData().getData();
if (selectedImage != null) {
//imageView.setImageURI(selectedImage);
Log.e("Selected-Image: ", "" + selectedImage);
}
}
});
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
@ -48,13 +155,28 @@ public class CheckingFragment extends Fragment {
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
Button nextButton = view.findViewById(R.id.btn_next); imageAdapter = new ImageAdapter(imageList, getActivity());
imageRecyclerView.setAdapter(imageAdapter);
nextButton.setOnClickListener(v -> { nextButton.setOnClickListener(v -> {
if (getActivity() instanceof HomeActivity) { if (getActivity() instanceof HomeActivity) {
((HomeActivity) getActivity()).navigateToFragment(new PackingFragment(), true); ((HomeActivity) getActivity()).navigateToFragment(new PackingFragment(), true);
} }
}); });
imagePicker.setOnClickListener(v -> {
showAlertDialog(view);
});
deleteImage.setOnClickListener(v -> {
if (!imageList.isEmpty()) {
imageList.remove(imageList.size() - 1);
} else {
System.out.println("The list is empty");
}
imageAdapter.notifyDataSetChanged();
});
return view; return view;
} }
@ -65,8 +187,225 @@ public class CheckingFragment extends Fragment {
private void initializeLayout(View view) { private void initializeLayout(View view) {
imagePicker = view.findViewById(R.id.image_picker);
deleteImage = view.findViewById(R.id.delete_image);
nextButton = view.findViewById(R.id.btn_next);
recyclerView = view.findViewById(R.id.recycler_view_checking); recyclerView = view.findViewById(R.id.recycler_view_checking);
imageRecyclerView = view.findViewById(R.id.imageRecyclerView); imageRecyclerView = view.findViewById(R.id.imageRecyclerView);
imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false)); imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
} }
@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<String> perms) {
}
@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this).build().show();
}
}
public void showAlertDialog(View view) {
ViewGroup viewGroup = view.findViewById(android.R.id.content);
TextView txt_camera, txt_gallery, txt_cancel;
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
View view1 = LayoutInflater.from(getActivity()).inflate(R.layout.custom_layout, viewGroup, false);
builder.setCancelable(false);
builder.setView(view1);
txt_camera = view1.findViewById(R.id.txt_camera);
txt_gallery = view1.findViewById(R.id.txt_gallery);
txt_cancel = view1.findViewById(R.id.txt_cancel);
AlertDialog alertDialog = builder.create();
Objects.requireNonNull(alertDialog.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
txt_camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
openCamera();
}
});
txt_gallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
openGallery();
}
});
txt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
}
});
alertDialog.show();
}
public void uriToByteArrayAsync(
Context context,
Uri uri,
int targetSizeInKB,
Consumer<byte[]> onSuccess,
Consumer<Exception> 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 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(requireActivity(), perms);
}
private boolean hasCameraPermission() {
String[] perms = {};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
//Log.e("TIRAMISU: ","***");
perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA};
} else {
//Log.e("Not-TIRAMISU: ","***");
perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
}
//Log.e("perms: ",""+perms);
return EasyPermissions.hasPermissions(requireActivity(), 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 = requireActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
filePath = image.getAbsolutePath();
return image;
}
@AfterPermissionGranted(CAMERA_REQUEST)
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(requireActivity(),
"com.utopiaindustries.qualitycontrol",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
//startActivityForResult(takePictureIntent, CAMERA_REQUEST);
cameraLauncher.launch(takePictureIntent);
}
} catch (ActivityNotFoundException e) {
Toast.makeText(getContext(), "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, perms);
}
}
@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_camera), GALLERY_REQUEST, perms);
}
}
} }

View File

@ -3,6 +3,7 @@ package com.utopiaindustries.qualitycontrol.fragments;
import static android.app.Activity.RESULT_OK; import static android.app.Activity.RESULT_OK;
import android.Manifest; import android.Manifest;
import android.content.ActivityNotFoundException;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
@ -38,7 +39,10 @@ import com.utopiaindustries.qualitycontrol.R;
import com.utopiaindustries.qualitycontrol.activities.HomeActivity; import com.utopiaindustries.qualitycontrol.activities.HomeActivity;
import com.utopiaindustries.qualitycontrol.adapters.ImageAdapter; import com.utopiaindustries.qualitycontrol.adapters.ImageAdapter;
import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter; import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter;
import com.utopiaindustries.qualitycontrol.helper.Helper;
import com.utopiaindustries.qualitycontrol.models.Item; import com.utopiaindustries.qualitycontrol.models.Item;
import com.utopiaindustries.qualitycontrol.models.QualityControlProcessStep;
import com.utopiaindustries.qualitycontrol.models.QualityControlResponse;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
@ -54,9 +58,10 @@ import java.util.Objects;
import java.util.function.Consumer; import java.util.function.Consumer;
import pub.devrel.easypermissions.AfterPermissionGranted; import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions; import pub.devrel.easypermissions.EasyPermissions;
public class CuttingFragment extends Fragment { public class CuttingFragment extends Fragment implements EasyPermissions.PermissionCallbacks {
RecyclerView recyclerView, imageRecyclerView; RecyclerView recyclerView, imageRecyclerView;
ImageAdapter imageAdapter; ImageAdapter imageAdapter;
@ -66,6 +71,8 @@ public class CuttingFragment extends Fragment {
private static final int GALLERY_REQUEST = 200; private static final int GALLERY_REQUEST = 200;
String filePath = "no_pic"; String filePath = "no_pic";
ArrayList<byte[]> imageList = new ArrayList<>(); ArrayList<byte[]> imageList = new ArrayList<>();
ArrayList<QualityControlProcessStep> qualityControlProcessStepList = new ArrayList<>();
QualityControlResponse qualityControlResponse;
// Activity Result Launcher for Gallery // Activity Result Launcher for Gallery
private final ActivityResultLauncher<Intent> imagePickerLauncher = private final ActivityResultLauncher<Intent> imagePickerLauncher =
@ -169,7 +176,12 @@ public class CuttingFragment extends Fragment {
}); });
deleteImage.setOnClickListener(v -> { deleteImage.setOnClickListener(v -> {
if (!imageList.isEmpty()) {
imageList.remove(imageList.size() - 1);
} else {
System.out.println("The list is empty");
}
imageAdapter.notifyDataSetChanged();
}); });
return view; return view;
@ -183,6 +195,12 @@ public class CuttingFragment extends Fragment {
recyclerView = view.findViewById(R.id.recycler_view_cutting); recyclerView = view.findViewById(R.id.recycler_view_cutting);
imageRecyclerView = view.findViewById(R.id.imageRecyclerView); imageRecyclerView = view.findViewById(R.id.imageRecyclerView);
imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false)); imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
qualityControlResponse = Helper.getPreferenceObjectJson(getActivity().getApplicationContext(), "qcResponse");
if (!qualityControlResponse.getQualityControlProcessSteps().isEmpty()) {
qualityControlProcessStepList.addAll(qualityControlResponse.getQualityControlProcessSteps());
}
} }
@Override @Override
@ -236,23 +254,18 @@ public class CuttingFragment extends Fragment {
alertDialog.show(); alertDialog.show();
} }
@AfterPermissionGranted(GALLERY_REQUEST) @AfterPermissionGranted(CAMERA_REQUEST)
public void openCamera() { public void openCamera() {
if (hasCameraPermission()) { if (hasCameraPermission()) {
Log.e("hasCameraPermission: ", "true"); try {
// Have permission, do the thing! Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(requireActivity().getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null; File photoFile = null;
try { try {
photoFile = createImageFile(); photoFile = createImageFile();
} catch (IOException ex) { } catch (IOException ex) {
// Error occurred while creating the File // Error occurred while creating the File
} }
// Continue only if the File was successfully created
if (photoFile != null) { if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(requireActivity(), Uri photoURI = FileProvider.getUriForFile(requireActivity(),
"com.utopiaindustries.qualitycontrol", "com.utopiaindustries.qualitycontrol",
@ -261,25 +274,23 @@ public class CuttingFragment extends Fragment {
//startActivityForResult(takePictureIntent, CAMERA_REQUEST); //startActivityForResult(takePictureIntent, CAMERA_REQUEST);
cameraLauncher.launch(takePictureIntent); cameraLauncher.launch(takePictureIntent);
} }
} catch (ActivityNotFoundException e) {
Toast.makeText(getContext(), "Camera app not found", Toast.LENGTH_SHORT).show();
} }
} else { } else {
// Ask for one permission // Ask for one permission
String[] perms = {}; String[] perms = {};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
Log.e("TIRAMISU: ", "***");
perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA}; perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA};
} else { } else {
Log.e("Not-TIRAMISU: ", "***");
perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
} }
//Log.e("perms: ",""+perms.length);
EasyPermissions.requestPermissions(this, getString(R.string.rationale_camera), CAMERA_REQUEST, perms); EasyPermissions.requestPermissions(this, getString(R.string.rationale_camera), CAMERA_REQUEST, perms);
} }
} }
@AfterPermissionGranted(GALLERY_REQUEST)
public void openGallery() { public void openGallery() {
if (hasGalleryPermission()) { if (hasGalleryPermission()) {
// Have permission, do the thing! // Have permission, do the thing!
@ -342,42 +353,6 @@ public class CuttingFragment extends Fragment {
return image; return image;
} }
/*public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == GALLERY_REQUEST) {
Log.e("=====From Gallery", "=========");
Uri contentUri = data.getData();
//filePath = Helper.getPath(contentUri, this);
*//*try {
//For Cropping purposes
String currentTimeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
File destinationFile = new File(getCacheDir(), "croppedImage.png" + currentTimeStamp);
Uri destinationUri = Uri.fromFile(destinationFile);
} catch (Exception e) {
Log.e("=====From Gallery error", "=========" + e.getMessage());
e.printStackTrace();
}*//*
} else if (requestCode == CAMERA_REQUEST) {
//Log.e("=====From Camera", "=========" + filePath);
// rotatedBitmap = Helper.getBitmap(filePath);
//For Cropping purposes
*//*String currentTimeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
File destinationFile = new File(getCacheDir(), "croppedImage.png" + currentTimeStamp);
Uri destinationUri = Uri.fromFile(destinationFile);
Uri contentUri = Uri.fromFile(new File((filePath)));*//*
}
}
}*/
public void uriToByteArrayAsync( public void uriToByteArrayAsync(
Context context, Context context,
Uri uri, Uri uri,
@ -424,4 +399,26 @@ public class CuttingFragment extends Fragment {
} }
}).start(); }).start();
} }
@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<String> perms) {
}
@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this).build().show();
}
}
} }

View File

@ -1,10 +1,12 @@
package com.utopiaindustries.qualitycontrol.fragments; package com.utopiaindustries.qualitycontrol.fragments;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -14,11 +16,22 @@ import android.widget.AdapterView;
import android.widget.AutoCompleteTextView; import android.widget.AutoCompleteTextView;
import android.widget.Button; import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import com.utopiaindustries.qualitycontrol.R; import com.utopiaindustries.qualitycontrol.R;
import com.utopiaindustries.qualitycontrol.activities.HomeActivity; import com.utopiaindustries.qualitycontrol.activities.HomeActivity;
import com.utopiaindustries.qualitycontrol.helper.Helper;
import com.utopiaindustries.qualitycontrol.helper.Preference;
import com.utopiaindustries.qualitycontrol.models.Department;
import com.utopiaindustries.qualitycontrol.models.LocationFloor;
import com.utopiaindustries.qualitycontrol.models.LocationSite;
import com.utopiaindustries.qualitycontrol.models.QualityControlProcess;
import com.utopiaindustries.qualitycontrol.models.QualityControlProcessStep;
import com.utopiaindustries.qualitycontrol.utils.ProgressDialogFragment;
import com.utopiaindustries.qualitycontrol.viewmodels.LoginViewModel;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
@ -26,6 +39,13 @@ public class HomeFragment extends Fragment {
AutoCompleteTextView locationTextview, departmentTextView, floorTextview; AutoCompleteTextView locationTextview, departmentTextView, floorTextview;
TextView txtCurrentDate; TextView txtCurrentDate;
LoginViewModel loginViewModel;
ArrayList<LocationFloor> locationFloorList = new ArrayList<>();
ArrayList<LocationSite> locationSiteList = new ArrayList<>();
ArrayList<Department> departmentList = new ArrayList<>();
ArrayList<QualityControlProcess> qualityControlProcessList = new ArrayList<>();
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@ -87,5 +107,60 @@ public class HomeFragment extends Fragment {
locationTextview = view.findViewById(R.id.location_textview); locationTextview = view.findViewById(R.id.location_textview);
departmentTextView = view.findViewById(R.id.department_textview); departmentTextView = view.findViewById(R.id.department_textview);
floorTextview = view.findViewById(R.id.floor_textview); floorTextview = view.findViewById(R.id.floor_textview);
loginViewModel = new ViewModelProvider(getActivity()).get(LoginViewModel.class);
loginViewModel.getLoadingState().observe(getActivity(), isLoading -> {
if (isLoading != null && isLoading) {
showProgressDialog();
} else {
dismissProgressDialog();
}
});
loginViewModel.getErrorMessage().observe(getActivity(), errorResponse -> {
Toast.makeText(getActivity(), errorResponse, Toast.LENGTH_SHORT).show();
});
loginViewModel.getUserLiveData().observe(getActivity(), qcResponse -> {
if (qcResponse != null) {
Helper.setPreferenceObject(getActivity().getApplicationContext(), qcResponse, "qcResponse");
if (!qcResponse.getLocationSites().isEmpty()) {
locationSiteList.addAll(qcResponse.getLocationSites());
Log.e("locationSiteList-size: ",""+locationSiteList.size());
}
if (!qcResponse.getDepartments().isEmpty()) {
departmentList.addAll(qcResponse.getDepartments());
Log.e("departmentList-size: ",""+departmentList.size());
}
if (!qcResponse.getLocationFloors().isEmpty()) {
locationFloorList.addAll(qcResponse.getLocationFloors());
Log.e("locationFloorList-size: ",""+locationFloorList.size());
}
} else {
Toast.makeText(getActivity(), "Login Failed", Toast.LENGTH_SHORT).show();
}
});
loginViewModel.getQualityControlData();
}
public void showProgressDialog() {
ProgressDialogFragment progressDialog = new ProgressDialogFragment();
progressDialog.setCancelable(false);
progressDialog.show(getActivity().getSupportFragmentManager(), "progressDialog");
}
public void dismissProgressDialog() {
ProgressDialogFragment progressDialog = (ProgressDialogFragment)
getActivity().getSupportFragmentManager().findFragmentByTag("progressDialog");
if (progressDialog != null) {
progressDialog.dismiss();
}
} }
} }

View File

@ -1,17 +1,37 @@
package com.utopiaindustries.qualitycontrol.fragments; package com.utopiaindustries.qualitycontrol.fragments;
import android.Manifest;
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.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.utopiaindustries.qualitycontrol.R; import com.utopiaindustries.qualitycontrol.R;
import com.utopiaindustries.qualitycontrol.activities.HomeActivity; import com.utopiaindustries.qualitycontrol.activities.HomeActivity;
@ -19,13 +39,101 @@ import com.utopiaindustries.qualitycontrol.adapters.ImageAdapter;
import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter; import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter;
import com.utopiaindustries.qualitycontrol.models.Item; import com.utopiaindustries.qualitycontrol.models.Item;
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.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;
public class PackingFragment extends Fragment { import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions;
public class PackingFragment extends Fragment implements EasyPermissions.PermissionCallbacks{
RecyclerView recyclerView, imageRecyclerView; RecyclerView recyclerView, imageRecyclerView;
ImageAdapter imageAdapter; ImageAdapter imageAdapter;
String filePath = "no_pic";
private static final int CAMERA_REQUEST = 102;
private static final int GALLERY_REQUEST = 202;
Button nextButton;
ImageButton imagePicker, deleteImage;
ArrayList<byte[]> imageList = new ArrayList<>();
// Activity Result Launcher for Gallery
private final ActivityResultLauncher<Intent> imagePickerLauncher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == requireActivity().RESULT_OK && result.getData() != null) {
Uri selectedImage = result.getData().getData();
if (selectedImage != null) {
//imageView.setImageURI(selectedImage);
Log.e("Selected-Image: ", "" + selectedImage);
uriToByteArrayAsync(
getContext(),
selectedImage,
100, // Target size in KB
compressedImage -> {
// Handle the compressed image here, e.g., display it
requireActivity().runOnUiThread(() -> {
//store.getReport().getItems().get(0).getCheckPoints().get(requestCode).addImageList(compressedImage);
imageList.add(compressedImage);
imageAdapter.notifyDataSetChanged();
});
},
error -> {
// Handle any errors
requireActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show();
});
}
);
}
}
});
// Activity Result Launcher for Camera
private final ActivityResultLauncher<Intent> cameraLauncher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Uri contentUri = Uri.fromFile(new File((filePath)));
uriToByteArrayAsync(
getContext(),
contentUri,
100, // Target size in KB
compressedImage -> {
// Handle the compressed image here, e.g., display it
requireActivity().runOnUiThread(() -> {
//store.getReport().getItems().get(0).getCheckPoints().get(requestCode).addImageList(compressedImage);
imageList.add(compressedImage);
imageAdapter.notifyDataSetChanged();
});
},
error -> {
// Handle any errors
requireActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show();
});
}
);
Log.e("contentUri: ", "" + contentUri);
if (result.getResultCode() == requireActivity().RESULT_OK && result.getData() != null) {
Uri selectedImage = result.getData().getData();
if (selectedImage != null) {
//imageView.setImageURI(selectedImage);
Log.e("Selected-Image: ", "" + selectedImage);
}
}
});
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@ -48,7 +156,22 @@ public class PackingFragment extends Fragment {
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
Button nextButton = view.findViewById(R.id.btn_next); imageAdapter = new ImageAdapter(imageList, getActivity());
imageRecyclerView.setAdapter(imageAdapter);
imagePicker.setOnClickListener(v -> {
showAlertDialog(view);
});
deleteImage.setOnClickListener(v -> {
if (!imageList.isEmpty()) {
imageList.remove(imageList.size() - 1);
} else {
System.out.println("The list is empty");
}
imageAdapter.notifyDataSetChanged();
});
nextButton.setOnClickListener(v -> { nextButton.setOnClickListener(v -> {
if (getActivity() instanceof HomeActivity) { if (getActivity() instanceof HomeActivity) {
((HomeActivity) getActivity()).navigateToFragment(new SubStoreFragment(), true); ((HomeActivity) getActivity()).navigateToFragment(new SubStoreFragment(), true);
@ -65,8 +188,225 @@ public class PackingFragment extends Fragment {
private void initializeLayout(View view) { private void initializeLayout(View view) {
imagePicker = view.findViewById(R.id.image_picker);
deleteImage = view.findViewById(R.id.delete_image);
nextButton = view.findViewById(R.id.btn_next);
recyclerView = view.findViewById(R.id.recycler_view_packing); recyclerView = view.findViewById(R.id.recycler_view_packing);
imageRecyclerView = view.findViewById(R.id.imageRecyclerView); imageRecyclerView = view.findViewById(R.id.imageRecyclerView);
imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false)); imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
} }
@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<String> perms) {
}
@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this).build().show();
}
}
public void uriToByteArrayAsync(
Context context,
Uri uri,
int targetSizeInKB,
Consumer<byte[]> onSuccess,
Consumer<Exception> 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 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(requireActivity(), perms);
}
private boolean hasCameraPermission() {
String[] perms = {};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
//Log.e("TIRAMISU: ","***");
perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA};
} else {
//Log.e("Not-TIRAMISU: ","***");
perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
}
//Log.e("perms: ",""+perms);
return EasyPermissions.hasPermissions(requireActivity(), 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 = requireActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
filePath = image.getAbsolutePath();
return image;
}
public void showAlertDialog(View view) {
ViewGroup viewGroup = view.findViewById(android.R.id.content);
TextView txt_camera, txt_gallery, txt_cancel;
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
View view1 = LayoutInflater.from(getActivity()).inflate(R.layout.custom_layout, viewGroup, false);
builder.setCancelable(false);
builder.setView(view1);
txt_camera = view1.findViewById(R.id.txt_camera);
txt_gallery = view1.findViewById(R.id.txt_gallery);
txt_cancel = view1.findViewById(R.id.txt_cancel);
AlertDialog alertDialog = builder.create();
Objects.requireNonNull(alertDialog.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
txt_camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
openCamera();
}
});
txt_gallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
openGallery();
}
});
txt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
}
});
alertDialog.show();
}
@AfterPermissionGranted(CAMERA_REQUEST)
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(requireActivity(),
"com.utopiaindustries.qualitycontrol",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
//startActivityForResult(takePictureIntent, CAMERA_REQUEST);
cameraLauncher.launch(takePictureIntent);
}
} catch (ActivityNotFoundException e) {
Toast.makeText(getContext(), "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, perms);
}
}
@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_camera), GALLERY_REQUEST, perms);
}
}
} }

View File

@ -1,17 +1,37 @@
package com.utopiaindustries.qualitycontrol.fragments; package com.utopiaindustries.qualitycontrol.fragments;
import android.Manifest;
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.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.utopiaindustries.qualitycontrol.R; import com.utopiaindustries.qualitycontrol.R;
import com.utopiaindustries.qualitycontrol.activities.HomeActivity; import com.utopiaindustries.qualitycontrol.activities.HomeActivity;
@ -19,13 +39,102 @@ import com.utopiaindustries.qualitycontrol.adapters.ImageAdapter;
import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter; import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter;
import com.utopiaindustries.qualitycontrol.models.Item; import com.utopiaindustries.qualitycontrol.models.Item;
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.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;
public class StitchingFragment extends Fragment { import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions;
public class StitchingFragment extends Fragment implements EasyPermissions.PermissionCallbacks{
RecyclerView recyclerView, imageRecyclerView; RecyclerView recyclerView, imageRecyclerView;
ImageAdapter imageAdapter; ImageAdapter imageAdapter;
String filePath = "no_pic";
private static final int CAMERA_REQUEST = 103;
private static final int GALLERY_REQUEST = 203;
Button nextButton;
ImageButton imagePicker, deleteImage;
ArrayList<byte[]> imageList = new ArrayList<>();
// Activity Result Launcher for Gallery
private final ActivityResultLauncher<Intent> imagePickerLauncher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == requireActivity().RESULT_OK && result.getData() != null) {
Uri selectedImage = result.getData().getData();
if (selectedImage != null) {
//imageView.setImageURI(selectedImage);
Log.e("Selected-Image: ", "" + selectedImage);
uriToByteArrayAsync(
getContext(),
selectedImage,
100, // Target size in KB
compressedImage -> {
// Handle the compressed image here, e.g., display it
requireActivity().runOnUiThread(() -> {
//store.getReport().getItems().get(0).getCheckPoints().get(requestCode).addImageList(compressedImage);
imageList.add(compressedImage);
imageAdapter.notifyDataSetChanged();
});
},
error -> {
// Handle any errors
requireActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show();
});
}
);
}
}
});
// Activity Result Launcher for Camera
private final ActivityResultLauncher<Intent> cameraLauncher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Uri contentUri = Uri.fromFile(new File((filePath)));
uriToByteArrayAsync(
getContext(),
contentUri,
100, // Target size in KB
compressedImage -> {
// Handle the compressed image here, e.g., display it
requireActivity().runOnUiThread(() -> {
//store.getReport().getItems().get(0).getCheckPoints().get(requestCode).addImageList(compressedImage);
imageList.add(compressedImage);
imageAdapter.notifyDataSetChanged();
});
},
error -> {
// Handle any errors
requireActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show();
});
}
);
Log.e("contentUri: ", "" + contentUri);
if (result.getResultCode() == requireActivity().RESULT_OK && result.getData() != null) {
Uri selectedImage = result.getData().getData();
if (selectedImage != null) {
//imageView.setImageURI(selectedImage);
Log.e("Selected-Image: ", "" + selectedImage);
}
}
});
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@ -48,7 +157,22 @@ public class StitchingFragment extends Fragment {
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
Button nextButton = view.findViewById(R.id.btn_next); imageAdapter = new ImageAdapter(imageList, getActivity());
imageRecyclerView.setAdapter(imageAdapter);
imagePicker.setOnClickListener(v -> {
showAlertDialog(view);
});
deleteImage.setOnClickListener(v -> {
if (!imageList.isEmpty()) {
imageList.remove(imageList.size() - 1);
} else {
System.out.println("The list is empty");
}
imageAdapter.notifyDataSetChanged();
});
nextButton.setOnClickListener(v -> { nextButton.setOnClickListener(v -> {
if (getActivity() instanceof HomeActivity) { if (getActivity() instanceof HomeActivity) {
((HomeActivity) getActivity()).navigateToFragment(new CheckingFragment(), true); ((HomeActivity) getActivity()).navigateToFragment(new CheckingFragment(), true);
@ -65,8 +189,225 @@ public class StitchingFragment extends Fragment {
private void initializeLayout(View view) { private void initializeLayout(View view) {
imagePicker = view.findViewById(R.id.image_picker);
deleteImage = view.findViewById(R.id.delete_image);
nextButton = view.findViewById(R.id.btn_next);
recyclerView = view.findViewById(R.id.recycler_view_stitching); recyclerView = view.findViewById(R.id.recycler_view_stitching);
imageRecyclerView = view.findViewById(R.id.imageRecyclerView); imageRecyclerView = view.findViewById(R.id.imageRecyclerView);
imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false)); imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
} }
@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<String> perms) {
}
@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this).build().show();
}
}
public void uriToByteArrayAsync(
Context context,
Uri uri,
int targetSizeInKB,
Consumer<byte[]> onSuccess,
Consumer<Exception> 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 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(requireActivity(), perms);
}
private boolean hasCameraPermission() {
String[] perms = {};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
//Log.e("TIRAMISU: ","***");
perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA};
} else {
//Log.e("Not-TIRAMISU: ","***");
perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
}
//Log.e("perms: ",""+perms);
return EasyPermissions.hasPermissions(requireActivity(), 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 = requireActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
filePath = image.getAbsolutePath();
return image;
}
public void showAlertDialog(View view) {
ViewGroup viewGroup = view.findViewById(android.R.id.content);
TextView txt_camera, txt_gallery, txt_cancel;
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
View view1 = LayoutInflater.from(getActivity()).inflate(R.layout.custom_layout, viewGroup, false);
builder.setCancelable(false);
builder.setView(view1);
txt_camera = view1.findViewById(R.id.txt_camera);
txt_gallery = view1.findViewById(R.id.txt_gallery);
txt_cancel = view1.findViewById(R.id.txt_cancel);
AlertDialog alertDialog = builder.create();
Objects.requireNonNull(alertDialog.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
txt_camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
openCamera();
}
});
txt_gallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
openGallery();
}
});
txt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
}
});
alertDialog.show();
}
@AfterPermissionGranted(CAMERA_REQUEST)
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(requireActivity(),
"com.utopiaindustries.qualitycontrol",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
//startActivityForResult(takePictureIntent, CAMERA_REQUEST);
cameraLauncher.launch(takePictureIntent);
}
} catch (ActivityNotFoundException e) {
Toast.makeText(getContext(), "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, perms);
}
}
@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_camera), GALLERY_REQUEST, perms);
}
}
} }

View File

@ -1,18 +1,37 @@
package com.utopiaindustries.qualitycontrol.fragments; package com.utopiaindustries.qualitycontrol.fragments;
import android.Manifest;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.utopiaindustries.qualitycontrol.R; import com.utopiaindustries.qualitycontrol.R;
import com.utopiaindustries.qualitycontrol.activities.HomeActivity; import com.utopiaindustries.qualitycontrol.activities.HomeActivity;
@ -21,13 +40,100 @@ import com.utopiaindustries.qualitycontrol.adapters.ImageAdapter;
import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter; import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter;
import com.utopiaindustries.qualitycontrol.models.Item; import com.utopiaindustries.qualitycontrol.models.Item;
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.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;
public class SubStoreFragment extends Fragment { import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions;
public class SubStoreFragment extends Fragment implements EasyPermissions.PermissionCallbacks{
RecyclerView recyclerView, imageRecyclerView; RecyclerView recyclerView, imageRecyclerView;
ImageAdapter imageAdapter; ImageAdapter imageAdapter;
String filePath = "no_pic";
private static final int CAMERA_REQUEST = 104;
private static final int GALLERY_REQUEST = 204;
Button nextButton;
ImageButton imagePicker, deleteImage;
ArrayList<byte[]> imageList = new ArrayList<>();
// Activity Result Launcher for Gallery
private final ActivityResultLauncher<Intent> imagePickerLauncher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == requireActivity().RESULT_OK && result.getData() != null) {
Uri selectedImage = result.getData().getData();
if (selectedImage != null) {
//imageView.setImageURI(selectedImage);
uriToByteArrayAsync(
getContext(),
selectedImage,
100, // Target size in KB
compressedImage -> {
// Handle the compressed image here, e.g., display it
requireActivity().runOnUiThread(() -> {
//store.getReport().getItems().get(0).getCheckPoints().get(requestCode).addImageList(compressedImage);
imageList.add(compressedImage);
imageAdapter.notifyDataSetChanged();
});
},
error -> {
// Handle any errors
requireActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show();
});
}
);
}
}
});
// Activity Result Launcher for Camera
private final ActivityResultLauncher<Intent> cameraLauncher =
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
Uri contentUri = Uri.fromFile(new File((filePath)));
uriToByteArrayAsync(
getContext(),
contentUri,
100, // Target size in KB
compressedImage -> {
// Handle the compressed image here, e.g., display it
requireActivity().runOnUiThread(() -> {
//store.getReport().getItems().get(0).getCheckPoints().get(requestCode).addImageList(compressedImage);
imageList.add(compressedImage);
imageAdapter.notifyDataSetChanged();
});
},
error -> {
// Handle any errors
requireActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show();
});
}
);
if (result.getResultCode() == requireActivity().RESULT_OK && result.getData() != null) {
Uri selectedImage = result.getData().getData();
if (selectedImage != null) {
//imageView.setImageURI(selectedImage);
Log.e("Selected-Image: ", "" + selectedImage);
}
}
});
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@ -50,7 +156,22 @@ public class SubStoreFragment extends Fragment {
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
Button nextButton = view.findViewById(R.id.btn_next); imageAdapter = new ImageAdapter(imageList, getActivity());
imageRecyclerView.setAdapter(imageAdapter);
imagePicker.setOnClickListener(v -> {
showAlertDialog(view);
});
deleteImage.setOnClickListener(v -> {
if (!imageList.isEmpty()) {
imageList.remove(imageList.size() - 1);
} else {
System.out.println("The list is empty");
}
imageAdapter.notifyDataSetChanged();
});
nextButton.setOnClickListener(v -> { nextButton.setOnClickListener(v -> {
Intent intent = new Intent(getActivity(), SummaryActivity.class); Intent intent = new Intent(getActivity(), SummaryActivity.class);
startActivity(intent); startActivity(intent);
@ -67,8 +188,225 @@ public class SubStoreFragment extends Fragment {
private void initializeLayout(View view) { private void initializeLayout(View view) {
imagePicker = view.findViewById(R.id.image_picker);
deleteImage = view.findViewById(R.id.delete_image);
nextButton = view.findViewById(R.id.btn_next);
recyclerView = view.findViewById(R.id.recycler_view_substore); recyclerView = view.findViewById(R.id.recycler_view_substore);
imageRecyclerView = view.findViewById(R.id.imageRecyclerView); imageRecyclerView = view.findViewById(R.id.imageRecyclerView);
imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false)); imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
} }
@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<String> perms) {
}
@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this).build().show();
}
}
public void uriToByteArrayAsync(
Context context,
Uri uri,
int targetSizeInKB,
Consumer<byte[]> onSuccess,
Consumer<Exception> 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 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(requireActivity(), perms);
}
private boolean hasCameraPermission() {
String[] perms = {};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
//Log.e("TIRAMISU: ","***");
perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA};
} else {
//Log.e("Not-TIRAMISU: ","***");
perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
}
//Log.e("perms: ",""+perms);
return EasyPermissions.hasPermissions(requireActivity(), 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 = requireActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
filePath = image.getAbsolutePath();
return image;
}
public void showAlertDialog(View view) {
ViewGroup viewGroup = view.findViewById(android.R.id.content);
TextView txt_camera, txt_gallery, txt_cancel;
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());
View view1 = LayoutInflater.from(getActivity()).inflate(R.layout.custom_layout, viewGroup, false);
builder.setCancelable(false);
builder.setView(view1);
txt_camera = view1.findViewById(R.id.txt_camera);
txt_gallery = view1.findViewById(R.id.txt_gallery);
txt_cancel = view1.findViewById(R.id.txt_cancel);
AlertDialog alertDialog = builder.create();
Objects.requireNonNull(alertDialog.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
txt_camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
openCamera();
}
});
txt_gallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
openGallery();
}
});
txt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
}
});
alertDialog.show();
}
@AfterPermissionGranted(CAMERA_REQUEST)
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(requireActivity(),
"com.utopiaindustries.qualitycontrol",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
//startActivityForResult(takePictureIntent, CAMERA_REQUEST);
cameraLauncher.launch(takePictureIntent);
}
} catch (ActivityNotFoundException e) {
Toast.makeText(getContext(), "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, perms);
}
}
@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_camera), GALLERY_REQUEST, perms);
}
}
} }

View File

@ -8,6 +8,7 @@ import android.preference.PreferenceManager;
import android.text.TextUtils; import android.text.TextUtils;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.utopiaindustries.qualitycontrol.models.QualityControlResponse;
public class Helper { public class Helper {
@ -22,4 +23,26 @@ public class Helper {
NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
} }
static public void setPreferenceObject(Context c, Object modal, String key) {
SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(c.getApplicationContext());
SharedPreferences.Editor prefsEditor = appSharedPrefs.edit();
Gson gson = new Gson();
String jsonObject = gson.toJson(modal);
prefsEditor.putString(key, jsonObject);
prefsEditor.commit();
}
static public QualityControlResponse getPreferenceObjectJson(Context c, String key) {
SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(c.getApplicationContext());
String json = appSharedPrefs.getString(key, "");
Gson gson = new Gson();
QualityControlResponse selectedUser = gson.fromJson(json, QualityControlResponse.class);
return selectedUser;
}
} }

View File

@ -0,0 +1,176 @@
package com.utopiaindustries.qualitycontrol.models;
import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Department {
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("companyId")
@Expose
private Integer companyId;
@SerializedName("functionId")
@Expose
private Integer functionId;
@SerializedName("title")
@Expose
private String title;
@SerializedName("organization")
@Expose
private String organization;
@SerializedName("code")
@Expose
private Integer code;
@SerializedName("email")
@Expose
private Object email;
@SerializedName("isActive")
@Expose
private Boolean isActive;
@SerializedName("sections")
@Expose
private Object sections;
@SerializedName("hierarchyString")
@Expose
private Object hierarchyString;
@SerializedName("costCenters")
@Expose
private Object costCenters;
@SerializedName("locationSites")
@Expose
private Object locationSites;
@SerializedName("departmentLocationSites")
@Expose
private Object departmentLocationSites;
@SerializedName("utilitySubMeterDepartments")
@Expose
private List<Object> utilitySubMeterDepartments;
@SerializedName("capitalizedTitle")
@Expose
private String capitalizedTitle;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getCompanyId() {
return companyId;
}
public void setCompanyId(Integer companyId) {
this.companyId = companyId;
}
public Integer getFunctionId() {
return functionId;
}
public void setFunctionId(Integer functionId) {
this.functionId = functionId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getOrganization() {
return organization;
}
public void setOrganization(String organization) {
this.organization = organization;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Object getEmail() {
return email;
}
public void setEmail(Object email) {
this.email = email;
}
public Boolean getIsActive() {
return isActive;
}
public void setIsActive(Boolean isActive) {
this.isActive = isActive;
}
public Object getSections() {
return sections;
}
public void setSections(Object sections) {
this.sections = sections;
}
public Object getHierarchyString() {
return hierarchyString;
}
public void setHierarchyString(Object hierarchyString) {
this.hierarchyString = hierarchyString;
}
public Object getCostCenters() {
return costCenters;
}
public void setCostCenters(Object costCenters) {
this.costCenters = costCenters;
}
public Object getLocationSites() {
return locationSites;
}
public void setLocationSites(Object locationSites) {
this.locationSites = locationSites;
}
public Object getDepartmentLocationSites() {
return departmentLocationSites;
}
public void setDepartmentLocationSites(Object departmentLocationSites) {
this.departmentLocationSites = departmentLocationSites;
}
public List<Object> getUtilitySubMeterDepartments() {
return utilitySubMeterDepartments;
}
public void setUtilitySubMeterDepartments(List<Object> utilitySubMeterDepartments) {
this.utilitySubMeterDepartments = utilitySubMeterDepartments;
}
public String getCapitalizedTitle() {
return capitalizedTitle;
}
public void setCapitalizedTitle(String capitalizedTitle) {
this.capitalizedTitle = capitalizedTitle;
}
}

View File

@ -0,0 +1,65 @@
package com.utopiaindustries.qualitycontrol.models;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class LocationFloor {
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("title")
@Expose
private String title;
@SerializedName("siteId")
@Expose
private Integer siteId;
@SerializedName("unitId")
@Expose
private Integer unitId;
@SerializedName("stores")
@Expose
private Object stores;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Integer getSiteId() {
return siteId;
}
public void setSiteId(Integer siteId) {
this.siteId = siteId;
}
public Integer getUnitId() {
return unitId;
}
public void setUnitId(Integer unitId) {
this.unitId = unitId;
}
public Object getStores() {
return stores;
}
public void setStores(Object stores) {
this.stores = stores;
}
}

View File

@ -0,0 +1,76 @@
package com.utopiaindustries.qualitycontrol.models;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class LocationSite {
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("title")
@Expose
private String title;
@SerializedName("shortTitle")
@Expose
private String shortTitle;
@SerializedName("address")
@Expose
private String address;
@SerializedName("hasColony")
@Expose
private Boolean hasColony;
@SerializedName("units")
@Expose
private Object units;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getShortTitle() {
return shortTitle;
}
public void setShortTitle(String shortTitle) {
this.shortTitle = shortTitle;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Boolean getHasColony() {
return hasColony;
}
public void setHasColony(Boolean hasColony) {
this.hasColony = hasColony;
}
public Object getUnits() {
return units;
}
public void setUnits(Object units) {
this.units = units;
}
}

View File

@ -0,0 +1,32 @@
package com.utopiaindustries.qualitycontrol.models;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class QualityControlProcess {
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("name")
@Expose
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@ -0,0 +1,43 @@
package com.utopiaindustries.qualitycontrol.models;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class QualityControlProcessStep {
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("title")
@Expose
private String title;
@SerializedName("description")
@Expose
private String description;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

View File

@ -1,4 +1,65 @@
package com.utopiaindustries.qualitycontrol.models; package com.utopiaindustries.qualitycontrol.models;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class QualityControlResponse { public class QualityControlResponse {
@SerializedName("locationFloors")
@Expose
private List<LocationFloor> locationFloors;
@SerializedName("qualityControlProcessSteps")
@Expose
private List<QualityControlProcessStep> qualityControlProcessSteps;
@SerializedName("locationSites")
@Expose
private List<LocationSite> locationSites;
@SerializedName("departments")
@Expose
private List<Department> departments;
@SerializedName("qualityControlProcessList")
@Expose
private List<QualityControlProcess> qualityControlProcessList;
public List<LocationFloor> getLocationFloors() {
return locationFloors;
}
public void setLocationFloors(List<LocationFloor> locationFloors) {
this.locationFloors = locationFloors;
}
public List<QualityControlProcessStep> getQualityControlProcessSteps() {
return qualityControlProcessSteps;
}
public void setQualityControlProcessSteps(List<QualityControlProcessStep> qualityControlProcessSteps) {
this.qualityControlProcessSteps = qualityControlProcessSteps;
}
public List<LocationSite> getLocationSites() {
return locationSites;
}
public void setLocationSites(List<LocationSite> locationSites) {
this.locationSites = locationSites;
}
public List<Department> getDepartments() {
return departments;
}
public void setDepartments(List<Department> departments) {
this.departments = departments;
}
public List<QualityControlProcess> getQualityControlProcessList() {
return qualityControlProcessList;
}
public void setQualityControlProcessList(List<QualityControlProcess> qualityControlProcessList) {
this.qualityControlProcessList = qualityControlProcessList;
}
} }

View File

@ -0,0 +1,37 @@
package com.utopiaindustries.qualitycontrol.utils;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import com.utopiaindustries.qualitycontrol.R;
public class ProgressDialogFragment extends DialogFragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_progress, container, false);
}
@Override
public void onStart() {
super.onStart();
if (getDialog() != null && getDialog().getWindow() != null) {
getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);
}
}
@Override
public void onCancel(@NonNull DialogInterface dialog) {
// Prevent the dialog from being canceled when touched outside
setCancelable(false);
}
}

View File

@ -39,9 +39,9 @@ public class LoginViewModel extends ViewModel {
return errorLiveData; return errorLiveData;
} }
public void authenticateUser(String user, String password) { public void getQualityControlData() {
isLoading.setValue(true); isLoading.setValue(true);
apiService.isUserAuthenticated(user, password).enqueue(new Callback<QualityControlResponse>() { apiService.isUserAuthenticated().enqueue(new Callback<QualityControlResponse>() {
@Override @Override
public void onResponse(Call<QualityControlResponse> call, Response<QualityControlResponse> response) { public void onResponse(Call<QualityControlResponse> call, Response<QualityControlResponse> response) {
isLoading.setValue(false); isLoading.setValue(false);

View File

@ -0,0 +1,15 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#80000000"> <!-- Semi-transparent dark background -->
<!-- Blur effect can be enhanced by using drawable with blur effect-->
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:indeterminateTint="@color/black"
android:indeterminate="true" />
</RelativeLayout>