Commit b2a2fe6d authored by YONG-LIN SU's avatar YONG-LIN SU

功能初步完善

parent 88785ac4
......@@ -12,6 +12,6 @@
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2022-08-04T00:44:36.745181400Z" />
<timeTargetWasSelectedWithDropDown value="2022-08-05T01:02:16.862069400Z" />
</component>
</project>
\ No newline at end of file
......@@ -24,6 +24,7 @@
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t01_bulletin_board.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t01_import_db.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_key_in_plate_number.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_key_in_plate_number_reverse.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_road.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_space.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_vehicle_type.xml" value="0.34375" />
......@@ -31,11 +32,13 @@
<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_list_files.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t03_searching_parking_space.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t03_total.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/alert_dialog_progress_bar.xml" value="0.29957264957264956" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/alert_dialog_t02_device_list.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_large_list_files_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/list_view_device_name_item.xml" value="0.34375" />
......
......@@ -46,6 +46,9 @@ dependencies {
implementation 'androidx.navigation:navigation-fragment:2.5.0'
implementation 'androidx.navigation:navigation-ui:2.5.0'
implementation 'com.google.android.gms:play-services-location:20.0.0'
implementation 'com.squareup.retrofit2:retrofit:2.8.1'
implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
......
......@@ -23,6 +23,7 @@
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:networkSecurityConfig="@xml/network_security_config"
android:icon="@mipmap/ic_icon_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_icon_launcher_round"
......@@ -39,6 +40,7 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".view.T01SettingActivity"
android:exported="false"
......@@ -53,10 +55,12 @@
android:exported="false"
android:label="系統公告"
android:theme="@style/Theme.AppCompat.Light" />
<activity
android:name=".view.T02KeyInPlateNumberActivity"
android:exported="false" />
<activity
android:name=".view.T02KeyInPlateNumberReverseActivity"
android:exported="false" />
<activity
android:name=".view.T02SelectRoadActivity"
android:exported="false" />
......@@ -72,18 +76,22 @@
<activity
android:name=".view.T02SelectUserActivity"
android:exported="false" />
<activity
android:name=".view.T03ImgViewerActivity"
android:exported="false" />
<activity
android:name=".view.T03TotalActivity"
android:exported="false"
android:label="累計"/>
android:label="累計" />
<activity
android:name=".view.T03ListFilesActivity"
android:exported="false" />
<activity
android:name=".view.T03SearchingParkingSpaceActivity"
android:exported="false"
android:label="案件搜尋"
android:theme="@style/Theme.AppCompat.Light"
/>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="ecom.android.newparkapp.fileprovider"
......
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.converter.CaseStatusConverter;
import ecom.android.newparkapp.databinding.CardViewLargeListFilesItemBinding;
import ecom.android.newparkapp.entity.CaseAndAllCasePhoto;
public class LargeCaseListAdapter extends ListAdapter<CaseAndAllCasePhoto, LargeCaseListAdapter.CaseListViewHolder> {
final private OnItemClickListener onItemClickListener;
public LargeCaseListAdapter(OnItemClickListener onItemClickListener){
super(caseItemCallback);
this.onItemClickListener = onItemClickListener;
}
@NonNull
@Override
public CaseListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
CardViewLargeListFilesItemBinding cardViewListFilesItemBinding = CardViewLargeListFilesItemBinding.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 CardViewLargeListFilesItemBinding dataBinding;
CaseListViewHolder(CardViewLargeListFilesItemBinding 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.txvLargePlateNumber.setText(caseAndAllCasePhoto.thisCase.plateNumber);
// 單號 billingNumber2
dataBinding.txvLargeBillingNumber.setText(caseAndAllCasePhoto.thisCase.billingNumber2);
// 狀態
dataBinding.txvStatus.setText(CaseStatusConverter.toString(caseAndAllCasePhoto.thisCase.caseStatus));
// 時數
dataBinding.txvHours.setText(String.valueOf(caseAndAllCasePhoto.thisCase.periodHour));
// 第一張 照片
// 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(caseAndAllCasePhoto.thisCase.billingNumber2);
});
}
}
public interface OnItemClickListener{
void onCaseClick(String billingNumber2);
void onZoomClick(String billingNumber2);
}
}
\ No newline at end of file
......@@ -18,6 +18,9 @@ public interface CaseDao {
@Query("SELECT * FROM `case`")
List<CaseAndAllCasePhoto> getAllWithCasePhoto();
@Query("SELECT * FROM `case` WHERE space_id=:spaceId")
List<CaseAndAllCasePhoto> getAllWithCasePhotoBySpace(String spaceId);
@Query("SELECT * FROM `case`")
List<Case> getAll();
......
package ecom.android.newparkapp.dao;
import android.location.Location;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
......@@ -18,6 +20,12 @@ public interface SpaceDao {
@Query("SELECT * FROM space")
LiveData<List<Space>> getAllLiveData();
@Query("SELECT * FROM space WHERE latitude>:latitudeSmaller AND latitude < :latitudeBigger AND longitude > :longitudeSmaller AND longitude < :longitudeBigger")
LiveData<List<Space>> getAllLiveDataByLocation(double latitudeBigger, double latitudeSmaller, double longitudeBigger , double longitudeSmaller);
@Query("SELECT * FROM space WHERE latitude>:latitudeSmaller AND latitude < :latitudeBigger AND longitude > :longitudeSmaller AND longitude < :longitudeBigger")
List<Space> getAllByLocation(double latitudeBigger, double latitudeSmaller, double longitudeBigger , double longitudeSmaller);
@Query("SELECT * FROM space WHERE id IN (:Ids)")
List<Space> loadAllByIds(int[] Ids);
......
......@@ -78,10 +78,10 @@ public class Case {
public Date finalTime; // 最後一次續單時間
@ColumnInfo(name = "auto_pay")
public Boolean autoPay = false; // 自動扣款
public Boolean autoPay = false; // 是否自動扣款
@ColumnInfo(name = "agency")
public int agency;
public String agency; // 自動扣款代收單位
@ColumnInfo(name = "shift")
public Shift shift; // 早班或晚班
......@@ -101,7 +101,7 @@ public class Case {
@Ignore
public String uploadPath;
public Case(String billingNumber2, String billingNumber1, User user, Date terminateDate, Date caseTime, Space space, String plateNumber, VehicleType vehicleType, VehicleColor vehicleColor, VehicleBrand vehicleBrand, float periodHour, int finalExpenses, Location location, int photoCount, Date updateDate, Date finalTime, Boolean autoPay, int agency, Shift shift, CaseStatus caseStatus) {
public Case(String billingNumber2, String billingNumber1, User user, Date terminateDate, Date caseTime, Space space, String plateNumber, VehicleType vehicleType, VehicleColor vehicleColor, VehicleBrand vehicleBrand, float periodHour, int finalExpenses, Location location, int photoCount, Date updateDate, Date finalTime, Boolean autoPay, String agency, Shift shift, CaseStatus caseStatus) {
this.billingNumber2 = billingNumber2;
this.billingNumber1 = billingNumber1;
this.user = user;
......
package ecom.android.newparkapp.repository;
import android.app.Application;
import java.util.concurrent.TimeUnit;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.service.ParkApiService;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ParkApiRepository {
public ParkApiService parkApiService;
public ParkApiRepository(Application application){
// 嘉義API
String baseUrl = "http://" + application.getString(R.string.api_default_ip);
// 測試台中API
//String baseUrl = "http://192.168.5.107:5000";
// 建立 OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(3, TimeUnit.SECONDS) // 設置連線Timeout
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC))
.build();
// 指定使用 OkHttpClient
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
// Retrofit retrofit = new Retrofit.Builder()
// .baseUrl(baseUrl)
// .addConverterFactory(GsonConverterFactory.create())
// .build();
parkApiService = retrofit.create(ParkApiService.class);
}
public enum ParkApiStatus{
REQUEST,
RESPONSE,
TIME_OUT
}
}
package ecom.android.newparkapp.service;
public class AutoDeduction {
private String vehlicType;
private boolean autoDeduction;
private String startDate;
private String agency;
public AutoDeduction(String vehlicType, boolean autoDeduction, String startDate, String agency) {
this.vehlicType = vehlicType;
this.autoDeduction = autoDeduction;
this.startDate = startDate;
this.agency = agency;
}
public AutoDeduction(boolean autoDeduction) {
this.autoDeduction = autoDeduction;
}
public String getVehlicType() {
return vehlicType;
}
public boolean isAutoDeduction() {
return autoDeduction;
}
public String getStartDate() {
return startDate;
}
public String getAgency() {
return agency;
}
}
package ecom.android.newparkapp.service;
/**
* 測試API用的資料
*/
public class CarData {
private String carName;
private String brand;
private String color;
public CarData(String carName, String brand, String color) {
this.carName = carName;
this.brand = brand;
this.color = color;
}
public String getCarName() {
return carName;
}
public String getBrand() {
return brand;
}
public String getColor() {
return color;
}
}
package ecom.android.newparkapp.service;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Path;
public interface ParkApiService {
@GET("/ccg/booc/{plateNumber}/mobile")
Call<AutoDeduction> getAutoDeduction(@Path("plateNumber") String plateNumber);
// 測試用,fake 模擬
// @FormUrlEncoded
// @POST("/api/GetCarData/GetCarData")
// Call<CarData> getCarData(@Field("plt_no") String plateNumber);
}
package ecom.android.newparkapp.view;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import ecom.android.newparkapp.Common;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.databinding.ActivityT02KeyInPlateNumberBinding;
public class T02KeyInPlateNumberActivity extends AppCompatActivity {
private ActivityT02KeyInPlateNumberBinding dataBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_t02_key_in_plate_number);
eventBinding();
}
private void eventBinding() {
......
package ecom.android.newparkapp.view;
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import ecom.android.newparkapp.Common;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.databinding.ActivityT02KeyInPlateNumberReverseBinding;
public class T02KeyInPlateNumberReverseActivity extends AppCompatActivity {
private ActivityT02KeyInPlateNumberReverseBinding dataBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_t02_key_in_plate_number_reverse);
eventBinding();
}
private void eventBinding() {
dataBinding.btn0.setOnClickListener(view -> keyIn("0"));
dataBinding.btn1.setOnClickListener(view -> keyIn("1"));
dataBinding.btn2.setOnClickListener(view -> keyIn("2"));
dataBinding.btn3.setOnClickListener(view -> keyIn("3"));
dataBinding.btn4.setOnClickListener(view -> keyIn("4"));
dataBinding.btn5.setOnClickListener(view -> keyIn("5"));
dataBinding.btn6.setOnClickListener(view -> keyIn("6"));
dataBinding.btn7.setOnClickListener(view -> keyIn("7"));
dataBinding.btn8.setOnClickListener(view -> keyIn("8"));
dataBinding.btn9.setOnClickListener(view -> keyIn("9"));
dataBinding.btnA.setOnClickListener(view -> keyIn("A"));
dataBinding.btnB.setOnClickListener(view -> keyIn("B"));
dataBinding.btnC.setOnClickListener(view -> keyIn("C"));
dataBinding.btnD.setOnClickListener(view -> keyIn("D"));
dataBinding.btnE.setOnClickListener(view -> keyIn("E"));
dataBinding.btnF.setOnClickListener(view -> keyIn("F"));
dataBinding.btnG.setOnClickListener(view -> keyIn("G"));
dataBinding.btnH.setOnClickListener(view -> keyIn("H"));
dataBinding.btnI.setOnClickListener(view -> keyIn("I"));
dataBinding.btnJ.setOnClickListener(view -> keyIn("J"));
dataBinding.btnK.setOnClickListener(view -> keyIn("K"));
dataBinding.btnL.setOnClickListener(view -> keyIn("L"));
dataBinding.btnM.setOnClickListener(view -> keyIn("M"));
dataBinding.btnN.setOnClickListener(view -> keyIn("N"));
dataBinding.btnO.setOnClickListener(view -> keyIn("O"));
dataBinding.btnP.setOnClickListener(view -> keyIn("P"));
dataBinding.btnQ.setOnClickListener(view -> keyIn("Q"));
dataBinding.btnR.setOnClickListener(view -> keyIn("R"));
dataBinding.btnS.setOnClickListener(view -> keyIn("S"));
dataBinding.btnT.setOnClickListener(view -> keyIn("T"));
dataBinding.btnU.setOnClickListener(view -> keyIn("U"));
dataBinding.btnV.setOnClickListener(view -> keyIn("V"));
dataBinding.btnW.setOnClickListener(view -> keyIn("W"));
dataBinding.btnX.setOnClickListener(view -> keyIn("X"));
dataBinding.btnY.setOnClickListener(view -> keyIn("Y"));
dataBinding.btnZ.setOnClickListener(view -> keyIn("Z"));
dataBinding.btnDash.setOnClickListener(view -> keyIn("-"));
dataBinding.btnArmyPltno.setOnClickListener(view -> KeyInSpecial("軍"));
dataBinding.btnTempPltno.setOnClickListener(view -> KeyInSpecial("臨"));
dataBinding.btnDelete.setOnClickListener(view -> backSpace());
dataBinding.btnInputConfirm.setOnClickListener(view -> confirm());
}
private void keyIn(String word){
String newPlateNumber = dataBinding.editText.getText().toString() + word;
if (Common.plateRuleCheck(newPlateNumber)){
dataBinding.editText.setText(newPlateNumber);
}
}
private void KeyInSpecial(String word){
String currentSpecialString = dataBinding.isSpecial.getText().toString();
switch (word){
case "軍":
if (currentSpecialString.equals("軍")){
dataBinding.isSpecial.setText("");
}else {
dataBinding.isSpecial.setText("軍");
}
break;
case "臨":
if (currentSpecialString.equals("臨")){
dataBinding.isSpecial.setText("");
}else {
dataBinding.isSpecial.setText("臨");
}
break;
default:
break;
}
}
private void backSpace(){
String currentPlateNumber = dataBinding.editText.getText().toString();
if (currentPlateNumber.length() > 0){
String newPlateNumber = currentPlateNumber.substring(0, currentPlateNumber.length() - 1);
dataBinding.editText.setText(newPlateNumber);
}
}
private void confirm(){
Intent intent = getIntent();
intent.putExtra("PlateNumber", dataBinding.editText.getText().toString());
setResult(RESULT_OK, intent);
finish();
}
}
\ No newline at end of file
......@@ -8,6 +8,7 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.GridLayoutManager;
import android.content.Intent;
import android.location.Location;
import android.os.Bundle;
import ecom.android.newparkapp.R;
......@@ -24,6 +25,8 @@ public class T02SelectSpaceActivity extends AppCompatActivity {
private SelectSpaceAdapter selectSpaceAdapter;
private ActivityResultLauncher roadResultLauncher;
private boolean enableNearbyLocation = false;
private Location location;
@Override
protected void onCreate(Bundle savedInstanceState) {
......@@ -31,12 +34,20 @@ public class T02SelectSpaceActivity extends AppCompatActivity {
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_t02_select_space);
t02SelectSpaceViewModel = new ViewModelProvider(this).get(T02SelectSpaceViewModel.class);
enableNearbyLocation = getIntent().getBooleanExtra("EnableNearbyLocation", false);
location = getIntent().getParcelableExtra("Location");
selectSpaceAdapter = new SelectSpaceAdapter(space -> spaceSelected(space));
dataBinding.rvSpaceOption.setLayoutManager(new GridLayoutManager(this,3));
dataBinding.rvSpaceOption.setAdapter(selectSpaceAdapter);
t02SelectSpaceViewModel.updateCurrentRoad(null);
if (enableNearbyLocation && location != null){
t02SelectSpaceViewModel.searchNearSpace(location);
}else {
t02SelectSpaceViewModel.updateCurrentRoad(null);
}
eventBinding();
resultLauncherRegister();
......@@ -70,7 +81,9 @@ public class T02SelectSpaceActivity extends AppCompatActivity {
dataBinding.btnSelectRoad.setText(roadString);
});
t02SelectSpaceViewModel.getCurrentSpace().observe(this, spaces -> {selectSpaceAdapter.submitList(spaces);});
t02SelectSpaceViewModel.getCurrentSpace().observe(this, spaces -> {
selectSpaceAdapter.submitList(spaces);
});
}
private void spaceSelected(Space space){
......
......@@ -31,7 +31,10 @@ import androidx.lifecycle.ViewModelProvider;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import ecom.android.newparkapp.R;
......@@ -45,6 +48,7 @@ import ecom.android.newparkapp.entity.Shift;
import ecom.android.newparkapp.entity.Space;
import ecom.android.newparkapp.entity.User;
import ecom.android.newparkapp.entity.VehicleType;
import ecom.android.newparkapp.repository.ParkApiRepository;
import ecom.android.newparkapp.viewModel.BlueToothViewModel;
import ecom.android.newparkapp.viewModel.FusedGpsViewModel;
import ecom.android.newparkapp.viewModel.T01SettingViewModel;
......@@ -74,6 +78,7 @@ public class T02StartActivity extends AppCompatActivity {
private ActivityResultLauncher inventoryActivityResultLauncher;
private ActivityResultLauncher requestMultiplePermissions;
private ActivityResultLauncher requestBluetooth;
private ActivityResultLauncher searchingParkingSpaceActivityResultLauncher;
private User currentUser;
private Shift shift;
......@@ -82,6 +87,9 @@ public class T02StartActivity extends AppCompatActivity {
private AlertDialog alertDialogProgress;
private AlertDialogProgressBarBinding alertDialogProgressBarBinding;
// 自動順序
final private List<Stage> stageSequence = new ArrayList<Stage>(Arrays.asList(Stage.SPACE, Stage.VEHICLE_TYPE, Stage.PLATE_NUMBER));
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......@@ -133,6 +141,7 @@ public class T02StartActivity extends AppCompatActivity {
dataBinding.btnInventory.setOnClickListener(v -> btnInventoryOnClicked());
dataBinding.btnMonthlyReport.setOnClickListener(v -> btnMonthlyReportOnClicked());
dataBinding.btnPrint.setOnClickListener(v -> btnPrintOnClicked());
dataBinding.btnSearchingParkingSpace.setOnClickListener(v -> btnSearchingParkingSpaceOnClicked());
dataBinding.btnStartBack.setOnClickListener(v -> {
finish();
......@@ -147,6 +156,9 @@ public class T02StartActivity extends AppCompatActivity {
Toast.makeText(this, selectedVehicleType.id + " " + selectedVehicleType.name, Toast.LENGTH_SHORT).show();
t02StartViewModel.setVehicleType(selectedVehicleType);
// 自動下一階段
autoNext(t01SettingViewModel.getAutoNext(), Stage.VEHICLE_TYPE);
}
});
......@@ -156,6 +168,9 @@ public class T02StartActivity extends AppCompatActivity {
Toast.makeText(this, selectedSpace.road.name + " " + selectedSpace.id, Toast.LENGTH_SHORT).show();
t02StartViewModel.setSpace(selectedSpace);
// 自動下一階段
autoNext(t01SettingViewModel.getAutoNext(), Stage.SPACE);
}
});
......@@ -163,7 +178,10 @@ public class T02StartActivity extends AppCompatActivity {
if (result.getResultCode() == RESULT_OK && result.getData() != null) {
String plateNumber = result.getData().getStringExtra("PlateNumber");
t02StartViewModel.setPlateNumber(plateNumber);
t02StartViewModel.setPlateNumber(plateNumber, t01SettingViewModel.getAutoDeduction());
// 自動下一階段
autoNext(t01SettingViewModel.getAutoNext(), Stage.PLATE_NUMBER);
}
});
......@@ -214,6 +232,26 @@ public class T02StartActivity extends AppCompatActivity {
selectPrinterDialog();
}
});
searchingParkingSpaceActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == RESULT_OK){
// TODO: 2022/8/4 跳至該案件
if ( result.getData() == null){
// 無相關資料
Toast.makeText(this, "沒有相關檔案,請開單", Toast.LENGTH_SHORT).show();
}else {
// 跳至選擇的該案件
String selectedBillingNumber2 = result.getData().getStringExtra("BillingNumber2");
boolean hasCase = false;
hasCase = t02StartViewModel.go2Page(selectedBillingNumber2);
if (!hasCase) {
Toast.makeText(this, "指標索引錯誤", Toast.LENGTH_SHORT).show();
}
}
}
});
}
private void observeBinding() {
......@@ -256,12 +294,24 @@ public class T02StartActivity extends AppCompatActivity {
}
});
t02StartViewModel.getParkApiStatus().observe(this, parkApiStatus -> {
if (parkApiStatus == ParkApiRepository.ParkApiStatus.REQUEST){
setAlertDialogProgressMessage("自動扣款請求中,請稍後");
alertDialogProgress.show();
}else {
alertDialogProgress.dismiss();
}
});
}
private void btnParkingSpaceOnClicked() {
Intent intent = new Intent();
Bundle bundle = new Bundle();
intent.setClass(this, T02SelectSpaceActivity.class);
boolean enableNearbyLocation = t01SettingViewModel.getEnableNearbyLocation();
bundle.putBoolean("EnableNearbyLocation", enableNearbyLocation);
bundle.putParcelable("Location",fusedGpsViewModel.getLocation().getValue());
intent.putExtras(bundle);
spaceResultLauncher.launch(intent);
......@@ -292,7 +342,12 @@ public class T02StartActivity extends AppCompatActivity {
private void btnPlateNumberOnClicked() {
Intent intent = new Intent();
intent.setClass(this, T02KeyInPlateNumberActivity.class);
if (t01SettingViewModel.getKeyBoardDrev()){
intent.setClass(this, T02KeyInPlateNumberReverseActivity.class);
}else {
intent.setClass(this, T02KeyInPlateNumberActivity.class);
}
plateNumberResultLauncher.launch(intent);
}
......@@ -590,4 +645,73 @@ public class T02StartActivity extends AppCompatActivity {
private void setAlertDialogProgressMessage(String message){
alertDialogProgressBarBinding.tvProgressBarMsg.setText(message);
}
private void btnSearchingParkingSpaceOnClicked(){
Case tempCase = t02StartViewModel.getCurrentCase().getValue();
if (tempCase == null){
return;
}
if (tempCase.space != null)
{
// 有選車格,查找當日案件
Intent intent = new Intent();
intent.setClass(this, T03SearchingParkingSpaceActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("Space", tempCase.space);
intent.putExtras(bundle);
searchingParkingSpaceActivityResultLauncher.launch(intent);
}else {
// 無車格,直接進入手動選取車格
btnParkingSpaceOnClicked();
}
}
private void autoNext(boolean enable, Stage previousStage){
if (!enable){
return;
}
// 選車格 車種 車牌
int index = stageSequence.indexOf(previousStage);
// 找到下一階段
int nextIndex = index + 1 ;
if (index < 0 || nextIndex >= stageSequence.size()){
return;
}
Stage nextStage = stageSequence.get(nextIndex);
Case tempCase = t02StartViewModel.getCurrentCase().getValue();
switch (nextStage){
case SPACE:
// 檢查是否設置
if (tempCase.space == null){
btnParkingSpaceOnClicked();
}else {
autoNext(enable, nextStage);
}
break;
case VEHICLE_TYPE:
if (tempCase.vehicleType == null){
btnVehicleTypeOnClicked();
}else {
autoNext(enable, nextStage);
}
break;
case PLATE_NUMBER:
if (tempCase.plateNumber == null || tempCase.plateNumber.trim().isEmpty()){
btnPlateNumberOnClicked();
}else {
autoNext(enable, nextStage);
}
break;
default:
break;
}
}
enum Stage{
TAKE_PHOTO,
SPACE,
VEHICLE_TYPE,
PLATE_NUMBER;
}
}
\ No newline at end of file
......@@ -21,6 +21,7 @@ public class T03ListFilesActivity extends AppCompatActivity {
private CaseListAdapter caseListAdapter;
private InfoRepository infoRepository;
private List<CaseAndAllCasePhoto> caseAndAllCasePhotos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......
package ecom.android.newparkapp.view;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.LinearLayoutManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import java.util.List;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.adapter.LargeCaseListAdapter;
import ecom.android.newparkapp.databinding.ActivityT03SearchingParkingSpaceBinding;
import ecom.android.newparkapp.entity.Case;
import ecom.android.newparkapp.entity.CaseAndAllCasePhoto;
import ecom.android.newparkapp.entity.Space;
import ecom.android.newparkapp.repository.InfoRepository;
public class T03SearchingParkingSpaceActivity extends AppCompatActivity {
private ActivityT03SearchingParkingSpaceBinding dataBinding;
private Space selectedSpace;
private LargeCaseListAdapter largeCaseListAdapter;
private InfoRepository infoRepository;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_t03_searching_parking_space);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null){
actionBar.setDisplayHomeAsUpEnabled(true);
}
selectedSpace = getIntent().getParcelableExtra("Space");
if (selectedSpace == null){
emptyResult();
}
infoRepository = new InfoRepository(getApplication());
largeCaseListAdapter = new LargeCaseListAdapter(new LargeCaseListAdapter.OnItemClickListener() {
@Override
public void onCaseClick(String billingNumber2) {
// 回傳選取的案件
Intent intent = getIntent();
intent.putExtra("BillingNumber2", billingNumber2);
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);
}
});
List<CaseAndAllCasePhoto> caseAndAllCasePhotos = infoRepository.caseDao.getAllWithCasePhotoBySpace(selectedSpace.id);
if (caseAndAllCasePhotos.size() == 0){
emptyResult();
}
largeCaseListAdapter.submitList(caseAndAllCasePhotos);
dataBinding.rvCaseList.setLayoutManager(new LinearLayoutManager(this));
dataBinding.rvCaseList.setAdapter(largeCaseListAdapter);
}
/**
* 複寫上一頁按鈕選取事件
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void emptyResult(){
Intent intent = getIntent();
intent.putExtra("BillingNumber2", " ");
setResult(RESULT_OK);
finish();
}
}
\ No newline at end of file
......@@ -144,6 +144,10 @@ public class T01SettingViewModel extends AndroidViewModel {
public String get_autoNext(){
return PREF.getValue().pref_autoNext ? "True" : "False";
}
public boolean getEnableNearbyLocation(){
return PREF.getValue().pref_nearbyLocation;
}
public String get_ftp_port(){
return String.valueOf(PREF.getValue().pref_FtpPort);
}
......@@ -159,4 +163,14 @@ public class T01SettingViewModel extends AndroidViewModel {
return Users;
}
public User getCurrentUser(){return mUser;}
public boolean getAutoDeduction() {
return PREF.getValue().pref_autoDeduction;
}
public boolean getKeyBoardDrev(){
return PREF.getValue().pref_keyboardrev;
}
public boolean getAutoNext(){return PREF.getValue().pref_autoNext;}
}
......@@ -2,6 +2,7 @@ package ecom.android.newparkapp.viewModel;
import android.app.Application;
import android.icu.text.IDNA;
import android.location.Location;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
......@@ -19,8 +20,6 @@ import ecom.android.newparkapp.repository.InfoRepository;
public class T02SelectSpaceViewModel extends AndroidViewModel {
private InfoRepository infoRepository;
private LiveData<List<Space>> spaces;
private LiveData<List<Road>> roads;
private MutableLiveData<Road> currentRoad = new MutableLiveData<>();
private MutableLiveData<List<Space>> currentSpace = new MutableLiveData<>();
......@@ -28,12 +27,8 @@ public class T02SelectSpaceViewModel extends AndroidViewModel {
super(application);
infoRepository = new InfoRepository(application);
spaces = infoRepository.spaceDao.getAllLiveData();
roads = infoRepository.roadDao.getAllLiveData();
}
public LiveData<List<Space>> getSpaces(){return spaces;}
public LiveData<List<Road>> getRoads(){return roads;}
public void updateCurrentRoad(Road road){
if (road == null){
currentRoad.setValue(null);
......@@ -45,4 +40,12 @@ public class T02SelectSpaceViewModel extends AndroidViewModel {
}
public LiveData<Road> getCurrentRoad(){return currentRoad;}
public LiveData<List<Space>> getCurrentSpace(){return currentSpace;}
public void searchNearSpace(Location location) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
double precision = 0.0002;
currentRoad.setValue(null);
currentSpace.setValue(infoRepository.spaceDao.getAllByLocation(latitude + precision, latitude - precision, longitude + precision, longitude - precision));
}
}
......@@ -4,7 +4,6 @@ import android.app.Application;
import android.location.Location;
import android.media.MediaScannerConnection;
import android.os.Environment;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
......@@ -12,11 +11,12 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import ecom.android.newparkapp.Common;
import ecom.android.newparkapp.ModifyPhoto;
......@@ -30,6 +30,12 @@ import ecom.android.newparkapp.entity.Space;
import ecom.android.newparkapp.entity.User;
import ecom.android.newparkapp.entity.VehicleType;
import ecom.android.newparkapp.repository.InfoRepository;
import ecom.android.newparkapp.repository.ParkApiRepository;
import ecom.android.newparkapp.service.AutoDeduction;
import ecom.android.newparkapp.service.CarData;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class T02StartViewModel extends AndroidViewModel {
......@@ -42,14 +48,19 @@ public class T02StartViewModel extends AndroidViewModel {
private LiveData<List<Road>> roads;
private LiveData<List<Space>> spaces;
private InfoRepository infoRepository;
private ParkApiRepository parkApiRepository;
private MutableLiveData<User> currentUser = new MutableLiveData<>();
private MutableLiveData<Shift> shift = new MutableLiveData<>();
private List<CasePhoto> tempCasePhoto = new ArrayList<>();
private MutableLiveData<ParkApiRepository.ParkApiStatus> parkApiStatusMutableLiveData = new MutableLiveData<>();
public T02StartViewModel(@NonNull Application application) {
super(application);
infoRepository = new InfoRepository(application);
parkApiRepository = new ParkApiRepository(application);
parkApiStatusMutableLiveData.setValue(ParkApiRepository.ParkApiStatus.RESPONSE);
vehicleTypes = infoRepository.vehicleTypeDao.getAllLiveData();
roads = infoRepository.roadDao.getAllLiveData();
......@@ -63,6 +74,7 @@ public class T02StartViewModel extends AndroidViewModel {
}
public LiveData<ParkApiRepository.ParkApiStatus> getParkApiStatus(){return parkApiStatusMutableLiveData;}
public LiveData<List<VehicleType>> getVehicleTypes(){
return vehicleTypes;
}
......@@ -126,23 +138,62 @@ public class T02StartViewModel extends AndroidViewModel {
currentCase.setValue(tempCase);
}
public void setPlateNumber(String plateNumber) {
public void setPlateNumber(String plateNumber){
setPlateNumber(plateNumber, false);
}
public void setPlateNumber(String plateNumber, boolean checkAutoDeduction) {
Case tempCase = currentCase.getValue();
tempCase.plateNumber = plateNumber;
// TODO: 2022/8/4 檢查自動扣款
tempCase.autoPay = checkAutoPay(plateNumber);
if (checkAutoDeduction){
Call<AutoDeduction> autoDeductionCall = parkApiRepository.parkApiService.getAutoDeduction(plateNumber);
parkApiStatusMutableLiveData.setValue(ParkApiRepository.ParkApiStatus.REQUEST);
autoDeductionCall.enqueue(new Callback<AutoDeduction>() {
@Override
public void onResponse(Call<AutoDeduction> call, Response<AutoDeduction> response) {
// 更新autoPay = true
if (response.isSuccessful()){
// 請求成功
AutoDeduction autoDeduction = response.body();
setAutoPay(autoDeduction);
}else {
// 請求失敗,設定自動扣款為 false
AutoDeduction autoDeduction = new AutoDeduction(false);
setAutoPay(autoDeduction);
}
parkApiStatusMutableLiveData.postValue(ParkApiRepository.ParkApiStatus.RESPONSE);
}
@Override
public void onFailure(Call<AutoDeduction> call, Throwable t) {
// 更新autoPay = false
AutoDeduction autoDeduction = new AutoDeduction(false);
setAutoPay(autoDeduction);
parkApiStatusMutableLiveData.postValue(ParkApiRepository.ParkApiStatus.RESPONSE);
}
});
}else {
tempCase.autoPay = false;
}
currentCase.setValue(tempCase);
}
private void setAutoPay(AutoDeduction autoDeduction){
Case tempCase = currentCase.getValue();
if (tempCase == null){
return;
}
tempCase.autoPay = autoDeduction.isAutoDeduction();
if (autoDeduction.isAutoDeduction()){
tempCase.agency = autoDeduction.getAgency();
}
currentCase.postValue(tempCase);
/**
* @param plateNumber 車牌號碼
* @return 是否有自動扣款
*/
private boolean checkAutoPay(String plateNumber){
boolean autoPay = false;
return autoPay;
}
public void initCurrentCase(){
......@@ -429,6 +480,22 @@ public class T02StartViewModel extends AndroidViewModel {
}
public boolean go2Page(String billingNumber2){
int newCaseCursor = -1;
for (int i = 0; i < cases.size(); i++){
if (cases.get(i).billingNumber2.equals(billingNumber2)){
newCaseCursor = i;
break;
}
}
if (newCaseCursor == -1){
return false;
}
return go2Page(newCaseCursor);
}
public boolean go2Page(int newCaseCursor){
if (newCaseCursor > cases.size()){
return false;
......
......@@ -155,6 +155,9 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@color/keyboradNumberButton"
android:backgroundTintMode="src_atop"
android:shadowColor="#F44336"
android:text="7"
android:textSize="32sp"
tools:ignore="ButtonStyle,HardcodedText" />
......@@ -164,6 +167,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@color/keyboradNumberButton"
android:backgroundTintMode="src_atop"
android:text="8"
android:textSize="32sp"
tools:ignore="ButtonStyle,HardcodedText" />
......@@ -173,6 +178,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@color/keyboradNumberButton"
android:backgroundTintMode="src_atop"
android:text="9"
android:textSize="32sp"
tools:ignore="ButtonStyle,HardcodedText" />
......@@ -216,6 +223,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@color/keyboradNumberButton"
android:backgroundTintMode="src_atop"
android:text="4"
android:textSize="32sp"
tools:ignore="ButtonStyle,HardcodedText" />
......@@ -225,6 +234,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@color/keyboradNumberButton"
android:backgroundTintMode="src_atop"
android:text="5"
android:textSize="32sp"
tools:ignore="ButtonStyle,HardcodedText" />
......@@ -234,6 +245,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@color/keyboradNumberButton"
android:backgroundTintMode="src_atop"
android:text="6"
android:textSize="32sp"
tools:ignore="ButtonStyle,HardcodedText" />
......@@ -277,6 +290,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@color/keyboradNumberButton"
android:backgroundTintMode="src_atop"
android:text="1"
android:textSize="32sp"
tools:ignore="ButtonStyle,HardcodedText" />
......@@ -286,6 +301,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@color/keyboradNumberButton"
android:backgroundTintMode="src_atop"
android:text="2"
android:textSize="32sp"
tools:ignore="ButtonStyle,HardcodedText" />
......@@ -295,6 +312,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@color/keyboradNumberButton"
android:backgroundTintMode="src_atop"
android:text="3"
android:textSize="32sp"
tools:ignore="ButtonStyle,HardcodedText" />
......@@ -347,6 +366,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@color/keyboradNumberButton"
android:backgroundTintMode="src_atop"
android:text="0"
android:textSize="32sp"
tools:ignore="ButtonStyle,HardcodedText" />
......
<?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.T03SearchingParkingSpaceActivity">
<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_large_list_files_item" />
</LinearLayout>
</layout>
\ No newline at end of file
<?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">
<androidx.cardview.widget.CardView
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" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ConstraintLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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="340dp"
android:background="@color/gray"
android:scaleType="center"
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/txv_parking_space"
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="30sp"
app:layout_constraintBottom_toTopOf="@+id/imageId"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<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="wrap_content"
android:baselineAligned="false"
android:orientation="horizontal">
<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="2dp"
android:paddingBottom="2dp">
<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:textSize="30sp" />
<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="30sp"
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:textSize="30sp" />
<TextView
android:id="@+id/txv_large_plate_number"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="ABCD-1234"
android:textSize="30sp"
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:layout_weight="0.2"
android:gravity="center_vertical"
android:text="單號:"
android:textSize="14sp" />
<TextView
android:id="@+id/txv_large_billing_number"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:textSize="14sp"
tools:ignore="NestedWeights" />
<TextView
android:id="@+id/txv_5"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:gravity="center_vertical"
android:text="時數:"
android:textSize="14sp" />
<TextView
android:id="@+id/txv_hours"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0.5"
android:gravity="center_vertical"
android:textSize="14sp" />
<TextView
android:id="@+id/txv_4"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:gravity="center_vertical"
android:text="狀態:"
android:textSize="14sp"
tools:ignore="NestedWeights" />
<TextView
android:id="@+id/txv_status"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0.5"
android:gravity="center_vertical"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
</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"
<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">
<androidx.cardview.widget.CardView
android:id="@+id/cardview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="6dp"
......@@ -101,7 +101,7 @@ android:padding="6dp">
android:text="時間:"
android:textAllCaps="false"
android:textColor="#000000"
android:textSize="28sp" />
android:textSize="22sp" />
<TextView
android:id="@+id/txv_time"
......@@ -111,7 +111,7 @@ android:padding="6dp">
android:gravity="center"
android:text="12:34"
android:textColor="@color/yellow_2"
android:textSize="28sp"
android:textSize="22sp"
android:textStyle="bold"
tools:ignore="NestedWeights" />
</LinearLayout>
......@@ -165,7 +165,7 @@ android:padding="6dp">
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:textSize="22sp"
android:textSize="20sp"
tools:ignore="NestedWeights" />
</LinearLayout>
......@@ -179,7 +179,6 @@ android:padding="6dp">
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"
......@@ -188,17 +187,25 @@ android:padding="6dp">
<TextView
android:id="@+id/txv_status"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="啟用"
android:textSize="22sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">
<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"
......@@ -206,14 +213,15 @@ android:padding="6dp">
<TextView
android:id="@+id/txv_hours"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="20.0"
android:textSize="22sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
......
......@@ -33,4 +33,6 @@
<color name="transp">#00000000</color>
<color name="sys_LTGRAY">#FFCCCCCC</color>
<color name="sys_RED">#FFFF0000</color>
<color name="keyboradNumberButton">#80008080</color>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
\ No newline at end of file
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