Commit 2f612abc authored by YONG-LIN SU's avatar YONG-LIN SU

清冊功能完成

parent ce06c300
...@@ -12,6 +12,6 @@ ...@@ -12,6 +12,6 @@
</deviceKey> </deviceKey>
</Target> </Target>
</runningDeviceTargetSelectedWithDropDown> </runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2022-08-01T01:49:20.422744100Z" /> <timeTargetWasSelectedWithDropDown value="2022-08-02T03:29:02.338878300Z" />
</component> </component>
</project> </project>
\ No newline at end of file
...@@ -30,12 +30,15 @@ ...@@ -30,12 +30,15 @@
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_start.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_start.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t03_cumulative.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t03_cumulative.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t03_img_viewer.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t03_img_viewer.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t03_list_files.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/alert_dialog_t03_cumulative_time.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/alert_dialog_t03_cumulative_time.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/card_view_image_plate_number_item.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/card_view_image_plate_number_item.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/card_view_list_files_item.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/content_t02_select_road.xml" value="0.1875" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/content_t02_select_road.xml" value="0.1875" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_bulletin_board_item.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_bulletin_board_item.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_db_table_item.xml" value="0.33" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_db_table_item.xml" value="0.33" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_item.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_item.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_list_files_item.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_road_item.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_road_item.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_space_item.xml" value="0.24954710144927536" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_space_item.xml" value="0.24954710144927536" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_vehicle_type_item.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_vehicle_type_item.xml" value="0.34375" />
......
...@@ -27,7 +27,9 @@ ...@@ -27,7 +27,9 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" android:theme="@style/Theme.AppCompat.Light.NoActionBar"
tools:targetApi="31"> tools:targetApi="31">
<activity
android:name=".view.T03ListFilesActivity"
android:exported="false" />
<activity <activity
android:name=".view.MainActivity" android:name=".view.MainActivity"
android:exported="true"> android:exported="true">
...@@ -37,8 +39,6 @@ ...@@ -37,8 +39,6 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".view.T01SettingActivity" android:name=".view.T01SettingActivity"
android:exported="false" android:exported="false"
...@@ -53,9 +53,6 @@ ...@@ -53,9 +53,6 @@
android:exported="false" android:exported="false"
android:label="系統公告" android:label="系統公告"
android:theme="@style/Theme.AppCompat.Light" /> android:theme="@style/Theme.AppCompat.Light" />
<activity <activity
android:name=".view.T02KeyInPlateNumberActivity" android:name=".view.T02KeyInPlateNumberActivity"
android:exported="false" /> android:exported="false" />
...@@ -74,8 +71,6 @@ ...@@ -74,8 +71,6 @@
<activity <activity
android:name=".view.T02SelectUserActivity" android:name=".view.T02SelectUserActivity"
android:exported="false" /> android:exported="false" />
<activity <activity
android:name=".view.T03ImgViewerActivity" android:name=".view.T03ImgViewerActivity"
android:exported="false" /> android:exported="false" />
......
...@@ -590,7 +590,7 @@ public class Common { ...@@ -590,7 +590,7 @@ public class Common {
public static boolean plateRuleCheck(String plateNumber) { public static boolean plateRuleCheck(String plateNumber) {
boolean isLegal = true; boolean isLegal = true;
// 空字串處理 // 空字串處理
if (plateNumber == null || plateNumber.length() == 0 || plateNumber.trim().isEmpty() || plateNumber.length() > 7){ if (plateNumber == null || plateNumber.length() == 0 || plateNumber.trim().isEmpty() || plateNumber.length() > 8){
isLegal = false; isLegal = false;
} }
return isLegal; return isLegal;
......
package ecom.android.newparkapp.adapter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import java.io.File;
import java.text.SimpleDateFormat;
import ecom.android.newparkapp.databinding.CardViewListFilesItemBinding;
import ecom.android.newparkapp.entity.CaseAndAllCasePhoto;
public class CaseListAdapter extends ListAdapter<CaseAndAllCasePhoto, CaseListAdapter.CaseListViewHolder> {
final private OnItemClickListener onItemClickListener;
public CaseListAdapter(OnItemClickListener onItemClickListener){
super(caseItemCallback);
this.onItemClickListener = onItemClickListener;
}
@NonNull
@Override
public CaseListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
CardViewListFilesItemBinding cardViewListFilesItemBinding = CardViewListFilesItemBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false);
return new CaseListViewHolder(cardViewListFilesItemBinding);
}
@Override
public void onBindViewHolder(@NonNull CaseListViewHolder holder, int position) {
holder.setBinding(getItem(position), position, onItemClickListener);
}
public static final DiffUtil.ItemCallback<CaseAndAllCasePhoto> caseItemCallback = new DiffUtil.ItemCallback<CaseAndAllCasePhoto>() {
@Override
public boolean areItemsTheSame(@NonNull CaseAndAllCasePhoto oldItem, @NonNull CaseAndAllCasePhoto newItem) {
return oldItem.thisCase.billingNumber2.equals(newItem.thisCase.billingNumber2);
}
@Override
public boolean areContentsTheSame(@NonNull CaseAndAllCasePhoto oldItem, @NonNull CaseAndAllCasePhoto newItem) {
return false;
}
};
static class CaseListViewHolder extends RecyclerView.ViewHolder {
private CardViewListFilesItemBinding dataBinding;
CaseListViewHolder(CardViewListFilesItemBinding dataBinding) {
super(dataBinding.getRoot());
this.dataBinding = dataBinding;
}
void setBinding(CaseAndAllCasePhoto caseAndAllCasePhoto, int position, OnItemClickListener onItemClickListener){
// 車格編號
dataBinding.txvParkingSpace.setText(caseAndAllCasePhoto.thisCase.space.id);
// 時間
SimpleDateFormat simpleDate = new SimpleDateFormat("HH:mm");
dataBinding.txvTime.setText(simpleDate.format(caseAndAllCasePhoto.thisCase.caseTime));
// 車牌
dataBinding.txvPlateNumber.setText(caseAndAllCasePhoto.thisCase.plateNumber);
// 單號 billingNumber2
dataBinding.txvBillingNumber2.setText(caseAndAllCasePhoto.thisCase.billingNumber2);
// 狀態
dataBinding.txvStatus.setText(String.valueOf(caseAndAllCasePhoto.thisCase.billStatus));
// 時數
dataBinding.txvHours.setText(String.valueOf(caseAndAllCasePhoto.thisCase.periodHour));
// 第一張 照片
// TODO: 2022/8/1 取得第一張 照片作為展示之用途
File file = null;
for (int i = 0; i < caseAndAllCasePhoto.casePhotos.size(); i ++){
file = new File(caseAndAllCasePhoto.casePhotos.get(i).photoPath);
if (file.isFile()){
break;
}
}
if (file != null && file.isFile()){
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
dataBinding.imageId.setImageBitmap(bitmap);
}
// 設置當前 index
dataBinding.txvItemIndex.setText(String.valueOf(position));
// 設置放大按鈕 顯示圖片
dataBinding.imgZoom.setOnClickListener(view -> {
onItemClickListener.onZoomClick(caseAndAllCasePhoto.thisCase.billingNumber2);
});
// 設置案件選取事件
dataBinding.cardview.setOnClickListener(view -> {
onItemClickListener.onCaseClick(position);
});
}
}
public interface OnItemClickListener{
void onCaseClick(int position);
void onZoomClick(String billingNumber2);
}
}
...@@ -10,9 +10,14 @@ import androidx.room.Update; ...@@ -10,9 +10,14 @@ import androidx.room.Update;
import java.util.List; import java.util.List;
import ecom.android.newparkapp.entity.Case; import ecom.android.newparkapp.entity.Case;
import ecom.android.newparkapp.entity.CaseAndAllCasePhoto;
@Dao @Dao
public interface CaseDao { public interface CaseDao {
@Query("SELECT * FROM `case`")
List<CaseAndAllCasePhoto> getAllWithCasePhoto();
@Query("SELECT * FROM `case`") @Query("SELECT * FROM `case`")
List<Case> getAll(); List<Case> getAll();
......
...@@ -9,11 +9,12 @@ import androidx.room.TypeConverters; ...@@ -9,11 +9,12 @@ import androidx.room.TypeConverters;
import ecom.android.newparkapp.dao.CaseDao; import ecom.android.newparkapp.dao.CaseDao;
import ecom.android.newparkapp.entity.Case; import ecom.android.newparkapp.entity.Case;
import ecom.android.newparkapp.entity.CasePhoto;
import ecom.android.newparkapp.entity.LocationConverter; import ecom.android.newparkapp.entity.LocationConverter;
import ecom.android.newparkapp.entity.TimestampConverter; import ecom.android.newparkapp.entity.TimestampConverter;
import ecom.android.newparkapp.R; import ecom.android.newparkapp.R;
@Database(entities = {Case.class}, version = 1) @Database(entities = {Case.class, CasePhoto.class}, version = 1)
@TypeConverters({LocationConverter.class, TimestampConverter.class}) @TypeConverters({LocationConverter.class, TimestampConverter.class})
public abstract class CaseDatabase extends RoomDatabase { public abstract class CaseDatabase extends RoomDatabase {
public abstract CaseDao caseDao(); public abstract CaseDao caseDao();
......
package ecom.android.newparkapp.entity;
import androidx.room.Embedded;
import androidx.room.Relation;
import java.util.List;
public class CaseAndAllCasePhoto {
@Embedded
public Case thisCase;
@Relation(parentColumn = "billingNumber2",
entityColumn = "case_billing_number2")
public List<CasePhoto> casePhotos;
}
...@@ -43,6 +43,7 @@ public class T02StartActivity extends AppCompatActivity { ...@@ -43,6 +43,7 @@ public class T02StartActivity extends AppCompatActivity {
private ActivityResultLauncher plateNumberResultLauncher; private ActivityResultLauncher plateNumberResultLauncher;
private ActivityResultLauncher takePhotosActivityResultLauncher; private ActivityResultLauncher takePhotosActivityResultLauncher;
private ActivityResultLauncher cumulativeTimeActivityResultLauncher; private ActivityResultLauncher cumulativeTimeActivityResultLauncher;
private ActivityResultLauncher inventoryActivityResultLauncher;
private User currentUser; private User currentUser;
private File photoFile; private File photoFile;
...@@ -78,6 +79,7 @@ public class T02StartActivity extends AppCompatActivity { ...@@ -78,6 +79,7 @@ public class T02StartActivity extends AppCompatActivity {
dataBinding.btnPageUp.setOnClickListener(v -> btnPageUpOnClicked()); dataBinding.btnPageUp.setOnClickListener(v -> btnPageUpOnClicked());
dataBinding.btnPhotoCount.setOnClickListener(v -> btnPhotoCountOnClicked()); dataBinding.btnPhotoCount.setOnClickListener(v -> btnPhotoCountOnClicked());
dataBinding.btnCumulativeTime.setOnClickListener(v -> btnCumulativeTimeOnClicked()); dataBinding.btnCumulativeTime.setOnClickListener(v -> btnCumulativeTimeOnClicked());
dataBinding.btnInventory.setOnClickListener(v -> btnInventoryOnClicked());
dataBinding.btnStartBack.setOnClickListener(v -> {finish();}); dataBinding.btnStartBack.setOnClickListener(v -> {finish();});
...@@ -129,6 +131,20 @@ public class T02StartActivity extends AppCompatActivity { ...@@ -129,6 +131,20 @@ public class T02StartActivity extends AppCompatActivity {
} }
}); });
inventoryActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == RESULT_OK && result.getData() != null){
int position = result.getData().getIntExtra("Position", -1);
boolean hasCase = false;
if (position >= 0){
hasCase = t02StartViewModel.go2Page(position);
}
if (!hasCase){
Toast.makeText(this, "指標索引錯誤", Toast.LENGTH_SHORT).show();
}
}
});
} }
private void observeBinding(){ private void observeBinding(){
...@@ -266,14 +282,15 @@ public class T02StartActivity extends AppCompatActivity { ...@@ -266,14 +282,15 @@ public class T02StartActivity extends AppCompatActivity {
startActivity(intent); startActivity(intent);
} }
private void btnCumulativeTimeOnClicked(){ private void btnCumulativeTimeOnClicked(){
Case tempCase = t02StartViewModel.getCurrentCase().getValue(); Case tempCase = t02StartViewModel.getCurrentCase().getValue();
if (tempCase == null){return;} if (tempCase == null){return;}
// if (tempCase.caseStatus == CaseStatus.NEW){ if (tempCase.caseStatus == CaseStatus.NEW){
// Toast.makeText(this, "請先設定格位", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "請先設定格位", Toast.LENGTH_SHORT).show();
// return; return;
// } }
AlertDialogT03CumulativeTimeBinding t03CumulativeTimeDataBinding = AlertDialogT03CumulativeTimeBinding.inflate(LayoutInflater.from(this)); AlertDialogT03CumulativeTimeBinding t03CumulativeTimeDataBinding = AlertDialogT03CumulativeTimeBinding.inflate(LayoutInflater.from(this));
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
...@@ -327,4 +344,10 @@ public class T02StartActivity extends AppCompatActivity { ...@@ -327,4 +344,10 @@ public class T02StartActivity extends AppCompatActivity {
tempDialog.show(); tempDialog.show();
} }
private void btnInventoryOnClicked(){
Intent intent = new Intent();
intent.setClass(this, T03ListFilesActivity.class);
inventoryActivityResultLauncher.launch(intent);
}
} }
\ No newline at end of file
package ecom.android.newparkapp.view;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.content.Intent;
import android.os.Bundle;
import java.util.List;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.adapter.CaseListAdapter;
import ecom.android.newparkapp.databinding.ActivityT03ListFilesBinding;
import ecom.android.newparkapp.entity.Case;
import ecom.android.newparkapp.entity.CaseAndAllCasePhoto;
import ecom.android.newparkapp.repository.InfoRepository;
public class T03ListFilesActivity extends AppCompatActivity {
private ActivityT03ListFilesBinding dataBinding;
private CaseListAdapter caseListAdapter;
private InfoRepository infoRepository;
private List<CaseAndAllCasePhoto> caseAndAllCasePhotos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_t03_list_files);
caseListAdapter = new CaseListAdapter(new CaseListAdapter.OnItemClickListener() {
@Override
public void onCaseClick(int position) {
// 回傳選取的案件
Intent intent = getIntent();
intent.putExtra("Position", position);
setResult(RESULT_OK, intent);
finish();
}
@Override
public void onZoomClick(String billingNumber2) {
// 顯示案件圖片
Intent intent = new Intent();
intent.setClass(getApplication(), T03ImgViewerActivity.class);
intent.putExtra("BillingNumber2", billingNumber2);
startActivity(intent);
}
});
infoRepository = new InfoRepository(getApplication());
caseAndAllCasePhotos = infoRepository.caseDao.getAllWithCasePhoto();
caseListAdapter.submitList(caseAndAllCasePhotos);
dataBinding.rvCaseList.setLayoutManager(new LinearLayoutManager(this));
dataBinding.rvCaseList.setAdapter(caseListAdapter);
}
}
\ No newline at end of file
...@@ -57,6 +57,7 @@ public class T02StartViewModel extends AndroidViewModel { ...@@ -57,6 +57,7 @@ public class T02StartViewModel extends AndroidViewModel {
} }
caseCursor.setValue(cases.size()); caseCursor.setValue(cases.size());
} }
public LiveData<List<VehicleType>> getVehicleTypes(){ public LiveData<List<VehicleType>> getVehicleTypes(){
...@@ -191,6 +192,14 @@ public class T02StartViewModel extends AndroidViewModel { ...@@ -191,6 +192,14 @@ public class T02StartViewModel extends AndroidViewModel {
} }
tempCasePhoto.clear(); tempCasePhoto.clear();
// 更新併檔用文字檔
// TODO: 2022/8/1 更新併檔用文字檔
//Common.updateTXT(getApplication(), tempCase.datePath + tempCase.userDateFileName, tempCase.billingNumber2, tempCase.getDetailString());
//Common.writeTXT(getApplication(), tempCase.uploadPath, tempCase.getUploadFileName(), tempCase.getDetailString());
// TODO: 2022/8/1 判斷 是否 為 註銷
tempCase.caseStatus = CaseStatus.LIST; //saveBills
// 更新當前list結果 // 更新當前list結果
cases.set(caseCursor.getValue(), tempCase); cases.set(caseCursor.getValue(), tempCase);
}); });
...@@ -388,6 +397,21 @@ public class T02StartViewModel extends AndroidViewModel { ...@@ -388,6 +397,21 @@ public class T02StartViewModel extends AndroidViewModel {
} }
public boolean go2Page(int newCaseCursor){
if (newCaseCursor > cases.size()){
return false;
}
Case tempCase = cases.get(newCaseCursor);
if (tempCase == null){
return false;
}
currentCase.setValue(tempCase);
caseCursor.setValue(newCaseCursor);
return true;
}
/** /**
* 累加時間處理 * 累加時間處理
* @param photoFile 拍照傳回 * @param photoFile 拍照傳回
......
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="60dp"
android:height="60dp"
android:tint="@color/colorPrimary"
android:viewportWidth="40"
android:viewportHeight="40">
<group
android:translateX="15"
android:translateY="15">
<path
android:fillColor="@android:color/white"
android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" />
<path
android:fillColor="@android:color/white"
android:pathData="M12,10h-2v2H9v-2H7V9h2V7h1v2h2v1z" />
</group>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".view.T03ListFilesActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_case_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/card_view_list_files_item" />
</LinearLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cardview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="6dp"
android:padding="6dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/txv_item_index"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
android:paddingStart="5dp"
android:paddingEnd="0dp"
android:text="001"
android:textSize="12sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:orientation="horizontal">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ConstraintLayout"
android:layout_width="match_parent"
android:layout_height="230dp"
android:layout_margin="2dp"
android:layout_weight="0.6"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/imageId"
android:layout_width="0dp"
android:layout_height="185dp"
android:background="@color/gray"
android:scaleType="center"
app:layout_constraintBottom_toTopOf="@+id/txv_parking_space"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_texture_black_24dp"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/txv_parking_space"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="A217"
android:textColor="@color/green_3"
android:textSize="28sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageId" />
<ImageView
android:id="@+id/imgZoom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@+id/imageId"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@drawable/ic_baseline_zoom_in_24" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="2dp"
android:layout_weight="0.4"
android:orientation="vertical"
android:paddingStart="10dp"
android:paddingEnd="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal"
tools:ignore="NestedWeights">
<TextView
android:id="@+id/txv_1"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="時間:"
android:textAllCaps="false"
android:textColor="#000000"
android:textSize="28sp" />
<TextView
android:id="@+id/txv_time"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="12:34"
android:textColor="@color/yellow_2"
android:textSize="28sp"
android:textStyle="bold"
tools:ignore="NestedWeights" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:id="@+id/txv_2"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="車牌:"
android:textColor="#000000"
android:textSize="22sp" />
<TextView
android:id="@+id/txv_plate_number"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="ABCD-1234"
android:textSize="22sp"
android:textStyle="bold"
tools:ignore="NestedWeights" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:id="@+id/txv_3"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="單號:"
android:textColor="#000000"
android:textSize="22sp" />
<TextView
android:id="@+id/txv_billing_number2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:textSize="22sp"
tools:ignore="NestedWeights" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:id="@+id/txv_4"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="狀態:"
android:textColor="#000000"
android:textSize="22sp"
tools:ignore="NestedWeights" />
<TextView
android:id="@+id/txv_status"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:textSize="22sp" />
<TextView
android:id="@+id/txv_5"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="時數:"
android:textColor="#000000"
android:textSize="22sp" />
<TextView
android:id="@+id/txv_hours"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:textSize="22sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
</layout>
\ No newline at end of file
package ecom.android.newparkapp; package ecom.android.newparkapp;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static ecom.android.newparkapp.Common.plateModifyByRule; import static ecom.android.newparkapp.Common.plateModifyByRule;
import static ecom.android.newparkapp.Common.plateRuleCheck;
import org.junit.Test; import org.junit.Test;
...@@ -11,6 +14,8 @@ public class PlateModifyByRuleUnitTest { ...@@ -11,6 +14,8 @@ public class PlateModifyByRuleUnitTest {
String plateNumber = "AXV-5918"; String plateNumber = "AXV-5918";
String newPlateNumber = plateModifyByRule(plateNumber); String newPlateNumber = plateModifyByRule(plateNumber);
assertEquals(newPlateNumber, plateNumber); assertEquals(newPlateNumber, plateNumber);
assertTrue(plateRuleCheck(newPlateNumber));
} }
@Test @Test
...@@ -18,6 +23,8 @@ public class PlateModifyByRuleUnitTest { ...@@ -18,6 +23,8 @@ public class PlateModifyByRuleUnitTest {
String plateNumber = "8052-LZ"; String plateNumber = "8052-LZ";
String newPlateNumber = plateModifyByRule(plateNumber); String newPlateNumber = plateModifyByRule(plateNumber);
assertEquals(newPlateNumber, plateNumber); assertEquals(newPlateNumber, plateNumber);
assertTrue(plateRuleCheck(newPlateNumber));
} }
@Test @Test
...@@ -25,6 +32,8 @@ public class PlateModifyByRuleUnitTest { ...@@ -25,6 +32,8 @@ public class PlateModifyByRuleUnitTest {
String plateNumber = "0X-2532"; String plateNumber = "0X-2532";
String newPlateNumber = plateModifyByRule(plateNumber); String newPlateNumber = plateModifyByRule(plateNumber);
assertEquals(newPlateNumber, "OX-2532"); assertEquals(newPlateNumber, "OX-2532");
assertTrue(plateRuleCheck(newPlateNumber));
} }
@Test @Test
...@@ -32,14 +41,31 @@ public class PlateModifyByRuleUnitTest { ...@@ -32,14 +41,31 @@ public class PlateModifyByRuleUnitTest {
String plateNumber = "1F-5545"; String plateNumber = "1F-5545";
String newPlateNumber = plateModifyByRule(plateNumber); String newPlateNumber = plateModifyByRule(plateNumber);
assertEquals(newPlateNumber, "IF-5545"); assertEquals(newPlateNumber, "IF-5545");
assertTrue(plateRuleCheck(newPlateNumber));
} }
@Test @Test
public void over_seven_number_plate(){ public void over_seven_number_plate(){
String plateNumber = "AXV-59187"; String plateNumber = "AXV-59187";
String newPlateNumber = plateModifyByRule(plateNumber); String newPlateNumber = plateModifyByRule(plateNumber);
assertEquals(newPlateNumber, "AXV-5918"); assertEquals(newPlateNumber, "AXV-5918");
assertFalse(plateRuleCheck(plateNumber));
assertTrue(plateRuleCheck(newPlateNumber));
}
@Test
public void empty_plate(){
String emptyPlate = "";
assertFalse(plateRuleCheck(emptyPlate));
}
@Test
public void space_string_plate(){
String spaceStringPlate = " ";
assertFalse(plateRuleCheck(spaceStringPlate));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment