Checkpoint Screen Design

master
saad.siddiq 2026-01-27 18:06:15 +05:00
parent eb02e85eb9
commit b50037625f
17 changed files with 419 additions and 305 deletions

View File

@ -20,7 +20,7 @@
tools:ignore="ScopedStorage" />
<application
android:allowBackup="true"
android:allowBackup="false"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
@ -55,7 +55,7 @@
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.utopiaindustries.qc_android"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data

View File

@ -65,15 +65,12 @@ public class DashboardActivity extends AppCompatActivity {
btnFetchProduct.setOnClickListener(v -> {
if (Helper.isNetworkConnected(this)) {
serviceViewModel.getCheckpointsData(this);
}
});
btnLogout.setOnClickListener(v -> {});
btnAppUpdate.setOnClickListener(v -> {});
btnReportUpload.setOnClickListener(v -> {});
}
public void initializeLayout() {

View File

@ -1,26 +1,43 @@
package com.utopiaindustries.qc_android.activities;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.WindowInsetsControllerCompat;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import com.utopiaindustries.qc_android.R;
import com.utopiaindustries.qc_android.db.CheckpointRepository;
import com.utopiaindustries.qc_android.models.InspectionCheckPoint;
import com.utopiaindustries.qc_android.viewmodels.DataEntryViewModel;
import java.util.ArrayList;
import java.util.List;
public class QCTerryActivity extends AppCompatActivity {
private NavController navController;
private List<InspectionCheckPoint> checkPointList = new ArrayList<>();
private DataEntryViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_qcterry);
setStatusBarColor();
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
@ -32,6 +49,9 @@ public class QCTerryActivity extends AppCompatActivity {
private void initializeLayout() {
viewModel = new ViewModelProvider(this).get(DataEntryViewModel.class);
loadCheckPoints();
// Setup Navigation
navController = Navigation.findNavController(this, R.id.nav_host_fragment);
}
@ -40,4 +60,57 @@ public class QCTerryActivity extends AppCompatActivity {
public boolean onSupportNavigateUp() {
return navController.navigateUp() || super.onSupportNavigateUp();
}
private void loadCheckPoints() {
checkPointList.clear();
CheckpointRepository checkpointRepository = new CheckpointRepository(this);
checkPointList = checkpointRepository.findAll();
/*InspectionCheckPoint item1 = new InspectionCheckPoint(1, "Safety Helmet Check", "Safety");
checkPointList.add(item1);
InspectionCheckPoint item2 = new InspectionCheckPoint(2, "Fire Extinguisher Check", "Safety");
checkPointList.add(item2);
InspectionCheckPoint item3 = new InspectionCheckPoint(3, "Material Quality Inspection", "Quality");
checkPointList.add(item3);
InspectionCheckPoint item4 = new InspectionCheckPoint(4, "Weld Quality Check", "Quality");
checkPointList.add(item4);
InspectionCheckPoint item5 = new InspectionCheckPoint(5, "Electrical Panel Inspection", "Electrical");
checkPointList.add(item5);
InspectionCheckPoint item6 = new InspectionCheckPoint(6, "Wiring Safety Check", "Electrical");
checkPointList.add(item6);
InspectionCheckPoint item8 = new InspectionCheckPoint(8, "Machine Guarding Check", "Mechanical");
checkPointList.add(item8);
InspectionCheckPoint item9 = new InspectionCheckPoint(9, "Structural Integrity", "Civil");
checkPointList.add(item9);
for (int i = 11; i <= 15; i++) {
String[] categories = {"Safety", "Quality", "Electrical", "General"};
String category = categories[(i - 11) % categories.length];
InspectionCheckPoint item = new InspectionCheckPoint(i, "Check Point " + i, category);
checkPointList.add(item);
}*/
viewModel.setCheckPointList(checkPointList);
}
private void setStatusBarColor() {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(ContextCompat.getColor(this, R.color.theme_color));
WindowInsetsControllerCompat controller =
WindowCompat.getInsetsController(window, window.getDecorView());
controller.setAppearanceLightStatusBars(false);
}
}

View File

@ -73,8 +73,7 @@ public class CheckPointAdapter extends RecyclerView.Adapter<CheckPointAdapter.Ch
setupListeners(holder, position);
}
private void setupImagesRecyclerView(CheckPointViewHolder holder, int parentPosition,
InspectionCheckPoint item) {
private void setupImagesRecyclerView(CheckPointViewHolder holder, int parentPosition, InspectionCheckPoint item) {
// Create and setup images adapter
/*ImageAdapter imagesAdapter = new ImageAdapter(item.getImages(),
new ImageAdapter.OnImageClickListener() {

View File

@ -12,10 +12,10 @@ import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitClient {
//Live url
//private final static String BASE_URL = "https://portal.utopiaindustries.pk/uind/";
private final static String BASE_URL = "https://portal.utopiaindustries.pk/uind/";
//Test Url
private final static String BASE_URL = "http://192.168.90.22:8081/uind/";
//private final static String BASE_URL = "http://192.168.90.22:8081/uind/";
private static Retrofit retrofit;
@ -25,19 +25,11 @@ public class RetrofitClient {
//.registerTypeAdapter(Boolean.class, new BooleanTypeAdapter())
.create();
if (retrofit == null) {
try {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
.client(SSLCheckHttpClient.getOkHttpClient())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
} catch (Exception e) {

View File

@ -184,30 +184,30 @@ public class DatabaseHelper extends SQLiteOpenHelper {
db.execSQL( CREATE_PRODUCT_TABLE );
db.execSQL( CREATE_INSPECTION_DIMENSION_TABLE );
//db.execSQL( CREATE_PRODUCT_TABLE );
//db.execSQL( CREATE_INSPECTION_DIMENSION_TABLE );
db.execSQL( CREATE_CHECKPOINT_TABLE );
db.execSQL( CREATE_DEFECT_TABLE );
db.execSQL( CREATE_UNIT_TABLE );
db.execSQL( CREATE_REPORT_TABLE );
db.execSQL( CREATE_DRAFT_REPORT_TABLE);
db.execSQL( CREATE_SKU_CHECKPOINT_TABLE );
db.execSQL( CREATE_INSPECTION_LABEL_TABLE );
db.execSQL( CREATE_QUALITY_LABEL_TABLE );
///db.execSQL( CREATE_DEFECT_TABLE );
//db.execSQL( CREATE_UNIT_TABLE );
//db.execSQL( CREATE_REPORT_TABLE );
//db.execSQL( CREATE_DRAFT_REPORT_TABLE);
//db.execSQL( CREATE_SKU_CHECKPOINT_TABLE );
//db.execSQL( CREATE_INSPECTION_LABEL_TABLE );
//db.execSQL( CREATE_QUALITY_LABEL_TABLE );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL( "DROP TABLE IF EXISTS " + PRODUCT_TABLE_NAME);
db.execSQL( "DROP TABLE IF EXISTS " + INSPECTION_DIMENSION_TABLE_NAME );
//db.execSQL( "DROP TABLE IF EXISTS " + PRODUCT_TABLE_NAME);
//db.execSQL( "DROP TABLE IF EXISTS " + INSPECTION_DIMENSION_TABLE_NAME );
db.execSQL( "DROP TABLE IF EXISTS " + CHECKPOINT_TABLE_NAME );
db.execSQL( "DROP TABLE IF EXISTS " + DEFECT_TABLE_NAME );
db.execSQL( "DROP TABLE IF EXISTS " + UNIT_TABLE_NAME );
db.execSQL( "DROP TABLE IF EXISTS " + REPORT_TABLE_NAME );
db.execSQL( "DROP TABLE IF EXISTS " + DRAFT_REPORT_TABLE_NAME );
db.execSQL( "DROP TABLE IF EXISTS " + CHECKPOINT_SKU_TABLE_NAME );
db.execSQL( "DROP TABLE IF EXISTS " + INSPECTION_LABEL_TABLE_NAME );
db.execSQL( "DROP TABLE IF EXISTS " + QUALITY_LABEL_TABLE_NAME );
//db.execSQL( "DROP TABLE IF EXISTS " + DEFECT_TABLE_NAME );
//db.execSQL( "DROP TABLE IF EXISTS " + UNIT_TABLE_NAME );
//db.execSQL( "DROP TABLE IF EXISTS " + REPORT_TABLE_NAME );
// db.execSQL( "DROP TABLE IF EXISTS " + DRAFT_REPORT_TABLE_NAME );
//db.execSQL( "DROP TABLE IF EXISTS " + CHECKPOINT_SKU_TABLE_NAME );
//db.execSQL( "DROP TABLE IF EXISTS " + INSPECTION_LABEL_TABLE_NAME );
//db.execSQL( "DROP TABLE IF EXISTS " + QUALITY_LABEL_TABLE_NAME );
onCreate(db);
}
}

View File

@ -10,6 +10,7 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -35,6 +36,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.utopiaindustries.qc_android.R;
import com.utopiaindustries.qc_android.adapters.CheckPointAdapter;
import com.utopiaindustries.qc_android.helper.Helper;
import com.utopiaindustries.qc_android.models.InspectionCheckPoint;
import com.utopiaindustries.qc_android.viewmodels.DataEntryViewModel;
@ -66,12 +68,12 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
private static final int PENDING_CAMERA = 1;
private static final int PENDING_GALLERY = 2;
private int pendingAction = 0;
private int currentPosition = -1;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_qc_terry_two, container, false);
initializeLayouts(view);
@ -83,161 +85,6 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
recyclerView = view.findViewById(R.id.check_point_recycler_view);
btnNext = view.findViewById(R.id.btnNext);
// Setup RecyclerView
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter = new CheckPointAdapter(getActivity(), checkPointList, this);
recyclerView.setAdapter(adapter);
//loadCheckPoints();
}
private void loadCheckPoints() {
checkPointList.clear();
// Item 1: Using 7-field constructor
List<byte[]> item1Images = createImages("Helmet", 2);
InspectionCheckPoint item1 = new InspectionCheckPoint(
1, // id
"Safety Helmet Check", // title
"Safety", // category
true, // isOkChecked
false, // isNoChecked
"All workers wearing helmets properly", // remarks
item1Images // images
);
checkPointList.add(item1);
// Item 2: NO checked with single image
List<byte[]> item2Images = new ArrayList<>();
item2Images.add(createSampleImageBytes("Fire_Extinguisher"));
InspectionCheckPoint item2 = new InspectionCheckPoint(
2,
"Fire Extinguisher Check",
"Safety",
false,
true,
"Fire extinguisher expired, needs replacement",
item2Images
);
checkPointList.add(item2);
// Item 3: Quality check with multiple images
List<byte[]> item3Images = createImages("Material", 3);
InspectionCheckPoint item3 = new InspectionCheckPoint(
3,
"Material Quality Inspection",
"Quality",
true,
false,
"Material meets all specifications",
item3Images
);
checkPointList.add(item3);
// Item 4: NO status with many images
List<byte[]> item4Images = createImages("Weld_Defect", 5);
InspectionCheckPoint item4 = new InspectionCheckPoint(
4,
"Weld Quality Check",
"Quality",
false,
true,
"Poor weld quality, needs rework",
item4Images
);
checkPointList.add(item4);
// Item 5: Pending (no status selected), no images
InspectionCheckPoint item5 = new InspectionCheckPoint(
5,
"Electrical Panel Inspection",
"Electrical",
false,
false,
"Awaiting electrician's review",
new ArrayList<>() // Empty images list
);
checkPointList.add(item5);
// Item 6: OK checked with one image
List<byte[]> item6Images = new ArrayList<>();
item6Images.add(createSampleImageBytes("Wiring"));
InspectionCheckPoint item6 = new InspectionCheckPoint(
6,
"Wiring Safety Check",
"Electrical",
true,
false,
"All wiring properly insulated and secured",
item6Images
);
checkPointList.add(item6);
// Item 8: NO checked, no remarks
List<byte[]> item8Images = createImages("Missing_Guard", 2);
InspectionCheckPoint item8 = new InspectionCheckPoint(
8,
"Machine Guarding Check",
"Mechanical",
false,
true,
null, // No remarks
item8Images
);
checkPointList.add(item8);
// Item 9: OK with default empty images
InspectionCheckPoint item9 = new InspectionCheckPoint(
9,
"Structural Integrity",
"Civil",
true,
false,
"Structure stable, no cracks observed",
null // Will be converted to empty list in constructor
);
checkPointList.add(item9);
// Add more items using loops
for (int i = 11; i <= 15; i++) {
String[] categories = {"Safety", "Quality", "Electrical", "General"};
String category = categories[(i - 11) % categories.length];
List<byte[]> images = new ArrayList<>();
int imageCount = (i % 3); // 0, 1, or 2 images
for (int j = 0; j < imageCount; j++) {
images.add(createSampleImageBytes("CP" + i + "_Img" + j));
}
boolean isOkChecked = (i % 2 == 0);
boolean isNoChecked = (i % 3 == 0);
InspectionCheckPoint item = new InspectionCheckPoint(
i,
"Check Point " + i,
category,
isOkChecked,
isNoChecked,
"Remarks for check point " + i,
images
);
checkPointList.add(item);
}
adapter.notifyDataSetChanged();
}
private List<byte[]> createImages(String prefix, int count) {
List<byte[]> images = new ArrayList<>();
for (int i = 1; i <= count; i++) {
images.add(createSampleImageBytes(prefix + "_" + i));
}
return images;
}
private byte[] createSampleImageBytes(String imageName) {
String imageData = "SAMPLE_IMAGE[" + imageName + "]_" + System.currentTimeMillis();
return imageData.getBytes();
}
@Override
@ -246,6 +93,15 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
viewModel = new ViewModelProvider(requireActivity()).get(DataEntryViewModel.class);
checkPointList.addAll(viewModel.getCheckPointList().getValue());
// Setup RecyclerView
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter = new CheckPointAdapter(getActivity(), checkPointList, this);
recyclerView.setAdapter(adapter);
// Initialize Activity Result Launchers
initializeLaunchers();
// Load existing data
/*if (viewModel.getAddress().getValue() != null) {
edtAddress.setText(viewModel.getAddress().getValue());
@ -254,6 +110,8 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
edtCity.setText(viewModel.getCity().getValue());
}*/
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -272,6 +130,7 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
public void onImagePickerClicked(int position) {
// Handle image picker click
//openImagePicker(position);
alertForPictures(getActivity(), position);
}
@Override
@ -294,8 +153,12 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
@Override
public void onRemarksChanged(int position, String remarks) {
// Update remarks in the model
Log.e("Pos: ",""+position);
Log.e("Remarks: ",""+remarks);
InspectionCheckPoint item = checkPointList.get(position);
item.setRemarks(remarks);
viewModel.setCheckPointList(checkPointList);
Log.e("ViewModel: ",""+viewModel.getCheckPointList().getValue());
}
@Override
@ -304,6 +167,7 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
InspectionCheckPoint item = checkPointList.get(position);
item.setOkChecked(isOkChecked);
item.setNoChecked(isNoChecked);
viewModel.setCheckPointList(checkPointList);
}
private void openImagePicker(int position) {
@ -313,7 +177,7 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
// adapter.addImageToCheckPoint(position, imageUri);
}
public void alertForPictures(Context con) {
public void alertForPictures(Context con, int position) {
ViewGroup viewGroup = requireActivity().findViewById(android.R.id.content);
TextView dialogCameraBtn, dialogGalleryBtn;
@ -334,7 +198,7 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
public void onClick(View view) {
alertDialog.dismiss();
checkPermissionAndOpenCamera();
checkPermissionAndOpenCamera(position);
}
});
@ -343,7 +207,7 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
public void onClick(View view) {
alertDialog.dismiss();
checkPermissionAndOpenGallery();
checkPermissionAndOpenGallery(position);
}
});
@ -385,6 +249,25 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
if (result.getResultCode() == getActivity().RESULT_OK && photoUri != null) {
//imageView.setImageURI(photoUri);
viewModel.setSelectedImageUri(photoUri);
Helper.uriToByteArrayAsync(
getContext(),
photoUri,
100,
compressedImage -> {
requireActivity().runOnUiThread(() -> {
checkPointList.get(currentPosition).addImage(compressedImage);
adapter.notifyItemChanged(currentPosition);
viewModel.setCheckPointList(checkPointList);
currentPosition = -1;
});
},
error -> {
requireActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show();
});
}
);
}
});
@ -395,6 +278,25 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
if (uri != null) {
//imageView.setImageURI(uri);
viewModel.setSelectedImageUri(uri);
Helper.uriToByteArrayAsync(
getContext(),
uri,
100,
compressedImage -> {
requireActivity().runOnUiThread(() -> {
checkPointList.get(currentPosition).addImage(compressedImage);
adapter.notifyItemChanged(currentPosition);
viewModel.setCheckPointList(checkPointList);
currentPosition = -1;
});
},
error -> {
requireActivity().runOnUiThread(() -> {
Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show();
});
}
);
}
});
}
@ -402,8 +304,9 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
/**
* Check permissions and open camera
*/
private void checkPermissionAndOpenCamera() {
private void checkPermissionAndOpenCamera(int position) {
String[] requiredPermissions = getRequiredCameraPermissions();
currentPosition = position;
if (hasPermissions(requiredPermissions)) {
openCamera();
@ -416,8 +319,9 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
/**
* Check permissions and open gallery
*/
private void checkPermissionAndOpenGallery() {
private void checkPermissionAndOpenGallery(int position) {
String[] requiredPermissions = getRequiredGalleryPermissions();
currentPosition = position;
if (hasPermissions(requiredPermissions)) {
openGallery();
@ -499,9 +403,9 @@ public class FragmentQcTerryTwo extends Fragment implements CheckPointAdapter.On
File storageDir = requireContext().getExternalFilesDir(null);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
imageFileName,
".jpg",
storageDir
);
return image;

View File

@ -25,6 +25,7 @@ import com.google.gson.reflect.TypeToken;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
@ -456,4 +457,51 @@ public class Helper {
}
});
}*/
public static 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();
}
}

View File

@ -22,14 +22,14 @@ public class InspectionCheckPoint implements Serializable {
public InspectionCheckPoint() {
}
public InspectionCheckPoint(long id, String title, String category, boolean isOkChecked, boolean isNoChecked, String remarks, List<byte[]> images) {
public InspectionCheckPoint(long id, String title, String category) {
this.id = id;
this.title = title;
this.category = category;
this.isOkChecked = isOkChecked;
this.isNoChecked = isNoChecked;
this.remarks = remarks;
this.images = images;
this.images = (images != null) ? images : new ArrayList<>();
}
public long getId() {
@ -113,6 +113,10 @@ public class InspectionCheckPoint implements Serializable {
"id=" + id +
", title='" + title + '\'' +
", category='" + category + '\'' +
", isOkChecked=" + isOkChecked +
", isNoChecked=" + isNoChecked +
", remarks='" + remarks + '\'' +
", images=" + images +
'}';
}
}

View File

@ -6,6 +6,11 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import com.utopiaindustries.qc_android.models.InspectionCheckPoint;
import java.util.ArrayList;
import java.util.List;
public class DataEntryViewModel extends ViewModel {
// Personal Info
@ -23,6 +28,9 @@ public class DataEntryViewModel extends ViewModel {
private MutableLiveData<Uri> selectedImageUri = new MutableLiveData<>();
private MutableLiveData<List<InspectionCheckPoint>> checkPointList =
new MutableLiveData<>(new ArrayList<>());
// Getters and Setters
public LiveData<String> getFirstName() {
return firstName;
@ -87,4 +95,12 @@ public class DataEntryViewModel extends ViewModel {
public void setSelectedImageUri(Uri uri) {
selectedImageUri.setValue(uri);
}
public LiveData<List<InspectionCheckPoint>> getCheckPointList() {
return checkPointList;
}
public void setCheckPointList(List<InspectionCheckPoint> list) {
checkPointList.setValue(list);
}
}

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners android:radius="8dp" />
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="#0D000000" /> </shape>
</item>
<item android:bottom="2dp" android:right="2dp" android:top="1dp" android:left="1dp">
<shape android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="@android:color/white" />
<stroke android:width="1dp" android:color="#E0E0E0"/> </shape>
</item>
</layer-list>

View File

@ -33,7 +33,7 @@
android:layout_marginBottom="20dp"
android:padding="5dp"
android:text="Login Now to Continue"
android:textSize="@dimen/_16sdp" />
android:textSize="@dimen/_14sdp" />
<com.google.android.material.textfield.TextInputLayout
@ -91,7 +91,7 @@
android:padding="5dp"
android:text="Login"
android:textColor="@color/white"
android:textSize="@dimen/_15sdp" />
android:textSize="@dimen/_12sdp" />
</LinearLayout>
<TextView

View File

@ -8,38 +8,42 @@
android:clickable="true"
android:elevation="10dp"
android:focusable="true"
android:padding="4dp"
android:padding="5dp"
app:cardBackgroundColor="@color/white">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp">
android:orientation="vertical">
<TextView
android:id="@+id/check_point_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="@color/grey_200"
android:layout_gravity="center|right"
android:layout_marginBottom="5dp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="horizontal">
<TextView
android:id="@+id/check_point_title"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_weight="4" />
<CheckBox
android:id="@+id/check_point_ok"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_weight="1"
android:layout_weight="0.5"
android:text="OK" />
<CheckBox
android:id="@+id/check_point_no"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_weight="1"
android:layout_weight="10.5"
android:text="NO" />
</LinearLayout>
@ -47,10 +51,11 @@
<EditText
android:id="@+id/check_point_remarks"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="3dp"
android:layout_weight="4"
android:hint="Remarks" />
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@drawable/et_border"
android:hint="Remarks"
android:padding="10dp" />
<LinearLayout
android:layout_width="match_parent"

View File

@ -27,7 +27,7 @@
android:text="Select Image from"
android:textAllCaps="false"
android:textColor="@color/black"
android:textSize="@dimen/_15sdp"
android:textSize="@dimen/_11sdp"
android:textStyle="normal" />
<View
@ -54,7 +54,7 @@
android:text="Camera"
android:textAllCaps="false"
android:textColor="@color/white"
android:textSize="@dimen/_14sdp"
android:textSize="@dimen/_10sdp"
android:textStyle="normal" />
<TextView
@ -77,7 +77,7 @@
android:textAllCaps="false"
android:background="@drawable/custom_button"
android:textColor="@color/white"
android:textSize="@dimen/_14sdp"
android:textSize="@dimen/_10sdp"
android:textStyle="normal" />
</LinearLayout>

View File

@ -1,109 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:text="Personal Information"
android:textSize="20sp"
android:textStyle="bold" />
<com.google.android.material.textfield.TextInputLayout
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:hint="First Name"
app:errorEnabled="true">
android:background="@color/theme_color"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" >
<EditText
android:id="@+id/edtFirstName"
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName" />
</com.google.android.material.textfield.TextInputLayout>
android:text="QC - Terry"
android:layout_gravity="center"
android:gravity="center"
android:padding="5dp"
android:textColor="@color/white"
android:textSize="@dimen/_11sdp" />
</androidx.appcompat.widget.Toolbar>
<com.google.android.material.textfield.TextInputLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:hint="Last Name"
app:errorEnabled="true">
android:layout_height="match_parent"
android:layout_below="@+id/toolbar"
android:layout_above="@+id/btnNext"
android:layout_margin="5dp"
android:padding="10dp"
android:orientation="vertical">
<EditText
android:id="@+id/edtLastName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="32dp"
android:hint="Email"
app:errorEnabled="true">
<EditText
android:id="@+id/edtEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress" />
</com.google.android.material.textfield.TextInputLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerInParent="true"
android:padding="5dp"
android:orientation="vertical"
android:layout_marginBottom="16dp">
android:layout_marginBottom="24dp"
android:text="Personal Information"
android:textSize="20sp"
android:textStyle="bold" />
<Button
android:id="@+id/btnCamera"
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:hint="First Name"
app:errorEnabled="true">
<EditText
android:id="@+id/edtFirstName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:hint="Last Name"
app:errorEnabled="true">
<EditText
android:id="@+id/edtLastName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="32dp"
android:hint="Email"
app:errorEnabled="true">
<EditText
android:id="@+id/edtEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress" />
</com.google.android.material.textfield.TextInputLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Camera" />
android:layout_alignParentStart="true"
android:layout_centerInParent="true"
android:layout_marginBottom="16dp"
android:orientation="vertical"
android:padding="5dp">
<Button
android:id="@+id/btnGallery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Gallery " />
<Button
android:id="@+id/btnCamera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/rounded_btn_login"
android:text="Camera" />
</LinearLayout>
<Button
android:id="@+id/btnGallery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:background="@drawable/rounded_btn_login"
android:text="Gallery " />
<ImageView
android:id="@+id/imageView"
android:layout_width="200dp"
android:layout_height="200dp"
android:padding="5dp"
android:layout_alignParentEnd="true"
android:background="#f0f0f0"
android:scaleType="centerCrop"
android:layout_marginBottom="24dp"/>
</RelativeLayout>
</LinearLayout>
<ImageView
android:id="@+id/imageView"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_alignParentEnd="true"
android:layout_marginBottom="24dp"
android:background="#f0f0f0"
android:padding="5dp"
android:scaleType="centerCrop" />
</RelativeLayout>
</LinearLayout>
<Button
android:id="@+id/btnNext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_alignParentBottom="true"
android:textSize="@dimen/_11sdp"
android:padding="10dp"
android:background="@drawable/rounded_btn_login"
android:text="Next →" />
</LinearLayout>
</RelativeLayout>

View File

@ -5,11 +5,33 @@
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/theme_color"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/actionBarTheme" >
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="QC - Terry"
android:layout_gravity="center"
android:gravity="center"
android:padding="5dp"
android:textColor="@color/white"
android:textSize="@dimen/_11sdp" />
</androidx.appcompat.widget.Toolbar>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/check_point_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/toolbar"
android:layout_above="@+id/btnNext"
android:layout_margin="5dp"
android:padding="8dp" />
<Button
@ -20,6 +42,7 @@
android:layout_alignParentBottom="true"
android:background="@drawable/rounded_btn_login"
android:padding="10dp"
android:textSize="@dimen/_11sdp"
android:text="Next →" />
</RelativeLayout>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Android/data/com.utopiaindustries.qc_android/files/Pictures" />
<external-path name="external_files" path="." />
</paths>