Commit 3fcea11a authored by YONG-LIN SU's avatar YONG-LIN SU

修正部分錯誤

1. 將車色 廠牌加入
2. 新增db匯出功能
3. 新增gps搜尋不到,顯示上一張單的附近車格
parent 9f15cf35
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="QV7218BA3A" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2022-09-12T03:13:53.292563700Z" />
</component>
</project>
\ No newline at end of file
......@@ -29,6 +29,8 @@
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_plate_and_space_confirm.xml" value="0.3654891304347826" />
<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_brand.xml" value="0.36614583333333334" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_vehicle_color.xml" value="0.36614583333333334" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_vehicle_type.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" />
......@@ -56,6 +58,8 @@
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_renew_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_vehicle_brand_item.xml" value="0.36614583333333334" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_vehicle_color_item.xml" value="0.36614583333333334" />
<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/menu/bottom_nav_menu.xml" value="0.36614583333333334" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/mipmap-anydpi-v26/ic_icon_launcher.xml" value="0.2985" />
......
......@@ -10,7 +10,7 @@ android {
minSdk 27
targetSdk 30
versionCode 1
versionName "Dev Ver.1.0.0"
versionName "Dev Ver.1.5.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
......
......@@ -12,7 +12,7 @@
"filters": [],
"attributes": [],
"versionCode": 1,
"versionName": "Dev Ver.1.0.0",
"versionName": "Dev Ver.1.5.0",
"outputFile": "app-release.apk"
}
],
......
......@@ -25,7 +25,6 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- android 11 管理所有檔案權限 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
......@@ -33,11 +32,12 @@
android:icon="@mipmap/ic_icon_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_icon_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
android:requestLegacyExternalStorage="true"
tools:targetApi="31">
<activity
android:name=".view.T02PlateAndSpaceConfirmActivity"
android:exported="false" />
......@@ -79,6 +79,12 @@
<activity
android:name=".view.T02SelectVehicleTypeActivity"
android:exported="false" />
<activity
android:name=".view.T02SelectVehicleColor"
android:exported="false" />
<activity
android:name=".view.T02SelectVehicleBrand"
android:exported="false" />
<activity
android:name=".view.T02SelectSpaceActivity"
android:exported="false" />
......
......@@ -9,7 +9,7 @@
9 1 25 0
10 1 25 0
11 1 25 0
12 1 15 4
12 1 15 2
13 1 15 4
14 1 25 0
1 2 20 0
......@@ -23,6 +23,6 @@
9 2 20 0
10 2 20 0
11 2 20 0
12 2 10 4
12 2 10 2
13 2 10 4
14 2 20 0
......@@ -46,6 +46,7 @@ public class ImportDbAdapter extends ListAdapter<String,ImportDbAdapter.ImportDb
void setBinding(String tableName){
dataBinding.tvDbTable.setText(tableName);
dataBinding.btnUpdateDbTable.setOnClickListener(view -> t01ImportDbViewModel.updateTable(tableName));
dataBinding.btnImportDbTable.setOnClickListener(view -> t01ImportDbViewModel.importTable(tableName));
}
}
......
package ecom.android.newparkapp.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import ecom.android.newparkapp.databinding.RecyclerViewVehicleBrandItemBinding;
import ecom.android.newparkapp.entity.VehicleBrand;
public class SelectVehicleBrandAdapter extends ListAdapter<VehicleBrand, SelectVehicleBrandAdapter.SelectVehicleBrandViewHolder> {
final private OnItemClickListener onItemClickListener;
public SelectVehicleBrandAdapter(OnItemClickListener onItemClickListener){
super(vehicleBrandItemCallback);
this.onItemClickListener = onItemClickListener;
}
public static final DiffUtil.ItemCallback<VehicleBrand> vehicleBrandItemCallback = new DiffUtil.ItemCallback<VehicleBrand>() {
@Override
public boolean areItemsTheSame(@NonNull VehicleBrand oldItem, @NonNull VehicleBrand newItem) {
return oldItem.id == newItem.id;
}
@Override
public boolean areContentsTheSame(@NonNull VehicleBrand oldItem, @NonNull VehicleBrand newItem) {
return oldItem.name.equals(newItem.name);
}
};
@NonNull
@Override
public SelectVehicleBrandViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
RecyclerViewVehicleBrandItemBinding recyclerViewVehicleBrandItemBinding = RecyclerViewVehicleBrandItemBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false);
return new SelectVehicleBrandViewHolder(recyclerViewVehicleBrandItemBinding);
}
@Override
public void onBindViewHolder(@NonNull SelectVehicleBrandViewHolder holder, int position) {
holder.setBinding(getItem(position), onItemClickListener);
}
static class SelectVehicleBrandViewHolder extends RecyclerView.ViewHolder{
private final RecyclerViewVehicleBrandItemBinding dataBinding;
SelectVehicleBrandViewHolder(RecyclerViewVehicleBrandItemBinding dataBinding){
super(dataBinding.getRoot());
this.dataBinding = dataBinding;
}
void setBinding(VehicleBrand vehicleBrand, OnItemClickListener onItemClickListener){
String btnText = vehicleBrand.id + " " + vehicleBrand.name + "" + vehicleBrand.englishName;
dataBinding.btnSelectVehicleBrand.setText(btnText);
dataBinding.btnSelectVehicleBrand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListener.onVehicleBrandClick(vehicleBrand);
}
});
}
}
public interface OnItemClickListener {
void onVehicleBrandClick(VehicleBrand vehicleBrand);
}
}
package ecom.android.newparkapp.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import ecom.android.newparkapp.databinding.RecyclerViewVehicleColorItemBinding;
import ecom.android.newparkapp.entity.VehicleColor;
public class SelectVehicleColorAdapter extends ListAdapter<VehicleColor, SelectVehicleColorAdapter.SelectVehicleColorViewHolder> {
final private SelectVehicleColorAdapter.OnItemClickListener onItemClickListener;
public SelectVehicleColorAdapter(SelectVehicleColorAdapter.OnItemClickListener onItemClickListener) {
super(vehicleColorItemCallback);
this.onItemClickListener = onItemClickListener;
}
@NonNull
@Override
public SelectVehicleColorAdapter.SelectVehicleColorViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
RecyclerViewVehicleColorItemBinding recyclerViewVehicleColorItemBinding = RecyclerViewVehicleColorItemBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false);
return new SelectVehicleColorAdapter.SelectVehicleColorViewHolder(recyclerViewVehicleColorItemBinding);
}
@Override
public void onBindViewHolder(@NonNull SelectVehicleColorAdapter.SelectVehicleColorViewHolder holder, int position) {
holder.setBinding(getItem(position), this.onItemClickListener);
}
public static final DiffUtil.ItemCallback<VehicleColor> vehicleColorItemCallback = new DiffUtil.ItemCallback<VehicleColor>() {
@Override
public boolean areItemsTheSame(@NonNull VehicleColor oldItem, @NonNull VehicleColor newItem) {
return oldItem.id == newItem.id;
}
@Override
public boolean areContentsTheSame(@NonNull VehicleColor oldItem, @NonNull VehicleColor newItem) {
return oldItem.name.equals(newItem.name);
}
};
static class SelectVehicleColorViewHolder extends RecyclerView.ViewHolder {
private final RecyclerViewVehicleColorItemBinding dataBinding;
SelectVehicleColorViewHolder(RecyclerViewVehicleColorItemBinding dataBinding) {
super(dataBinding.getRoot());
this.dataBinding = dataBinding;
}
void setBinding(VehicleColor vehicleColor, SelectVehicleColorAdapter.OnItemClickListener onItemClickListener){
String btnText = vehicleColor.id + " " + vehicleColor.name;
dataBinding.btnSelectVehicleColor.setText(btnText);
dataBinding.btnSelectVehicleColor.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListener.onVehicleColorClick(vehicleColor);
}
});
}
}
public interface OnItemClickListener {
void onVehicleColorClick(VehicleColor VehicleColor);
}
}
......@@ -44,6 +44,9 @@ public interface SpaceDao {
@Query("SELECT * FROM space WHERE road_id=:RoadIds")
LiveData<List<Space>> loadAllLiveDataByRoadId(int RoadIds);
@Query("SELECT * FROM space WHERE id > :spaceId LIMIT :limit")
List<Space> getNextSpaces(String spaceId, int limit);
@Insert
void insertAll(Space... spaces);
......
package ecom.android.newparkapp.entity;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
......@@ -8,7 +11,7 @@ import androidx.room.PrimaryKey;
* 汽車品牌資料表
*/
@Entity
public class VehicleBrand {
public class VehicleBrand implements Parcelable {
@PrimaryKey
public int id;
......@@ -23,4 +26,34 @@ public class VehicleBrand {
this.name = name;
this.englishName = englishName;
}
protected VehicleBrand(Parcel in) {
id = in.readInt();
name = in.readString();
englishName = in.readString();
}
public static final Creator<VehicleBrand> CREATOR = new Creator<VehicleBrand>() {
@Override
public VehicleBrand createFromParcel(Parcel in) {
return new VehicleBrand(in);
}
@Override
public VehicleBrand[] newArray(int size) {
return new VehicleBrand[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(id);
parcel.writeString(name);
parcel.writeString(englishName);
}
}
package ecom.android.newparkapp.entity;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
......@@ -8,7 +11,7 @@ import androidx.room.PrimaryKey;
* 汽車顏色資料表
*/
@Entity
public class VehicleColor {
public class VehicleColor implements Parcelable {
@PrimaryKey
public int id;
......@@ -19,4 +22,32 @@ public class VehicleColor {
this.id = id;
this.name = name;
}
protected VehicleColor(Parcel in) {
id = in.readInt();
name = in.readString();
}
public static final Creator<VehicleColor> CREATOR = new Creator<VehicleColor>() {
@Override
public VehicleColor createFromParcel(Parcel in) {
return new VehicleColor(in);
}
@Override
public VehicleColor[] newArray(int size) {
return new VehicleColor[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(id);
parcel.writeString(name);
}
}
package ecom.android.newparkapp.view;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
......@@ -8,11 +9,13 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.Toast;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.adapter.ImportDbAdapter;
import ecom.android.newparkapp.databinding.ActivityT01ImportDbBinding;
import ecom.android.newparkapp.databinding.AlertDialogProgressBarBinding;
import ecom.android.newparkapp.viewModel.T01ImportDbViewModel;
public class T01ImportDbActivity extends AppCompatActivity {
......@@ -20,6 +23,9 @@ public class T01ImportDbActivity extends AppCompatActivity {
private ActivityT01ImportDbBinding dataBinding;
private T01ImportDbViewModel t01ImportDbViewModel;
private ImportDbAdapter importDbAdapter;
private AlertDialog alertDialogProgress;
private AlertDialogProgressBarBinding alertDialogProgressBarBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......@@ -40,6 +46,51 @@ public class T01ImportDbActivity extends AppCompatActivity {
t01ImportDbViewModel.getToastMessage().observe(this, s -> ToastMessageonChanged(s));
dataBinding.btnImportAll.setOnClickListener(view -> {
setAlertDialogProgressMessage("資料匯入中請稍後");
t01ImportDbViewModel.importAllTable();
});
dataBinding.btnUpdateAll.setOnClickListener(view -> {
setAlertDialogProgressMessage("資料更新中請稍後");
t01ImportDbViewModel.updateAllTable();
});
// progress alert dialog init
initAlertDialogProgress();
t01ImportDbViewModel.getAlertDialogProgressMessage().observe(this, message -> {
setAlertDialogProgressMessage(message);
});
t01ImportDbViewModel.getShowAlertDialogProgress().observe(this, show ->{
if (show){
alertDialogProgress.show();
}else {
alertDialogProgress.dismiss();
}
});
}
@Override
protected void onDestroy() {
// 關閉 Activity 前,須將相關附屬的 windows視窗關閉,避免內存洩漏
if (alertDialogProgress != null){
alertDialogProgress.dismiss();
}
super.onDestroy();
}
private void initAlertDialogProgress(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false); // if you want user to wait for some process to finish,
alertDialogProgressBarBinding = AlertDialogProgressBarBinding.inflate(LayoutInflater.from(this));
builder.setView(alertDialogProgressBarBinding.getRoot());
alertDialogProgress = builder.create();
}
private void setAlertDialogProgressMessage(String message){
alertDialogProgressBarBinding.tvProgressBarMsg.setText(message);
}
public void ToastMessageonChanged(String toastMessage){
......
......@@ -8,6 +8,8 @@ import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.Toast;
......@@ -15,6 +17,7 @@ import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
......@@ -25,6 +28,7 @@ import java.util.List;
import ecom.android.newparkapp.FilesFilter;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.databinding.ActivityT01SettingLayoutBinding;
import ecom.android.newparkapp.databinding.AlertDialogProgressBarBinding;
import ecom.android.newparkapp.entity.User;
import ecom.android.newparkapp.viewModel.T01SettingViewModel;
......@@ -37,6 +41,8 @@ public class T01SettingActivity extends AppCompatActivity {
private ActivityResultLauncher UserResultLauncher;
private List<User> Users;
private AlertDialog alertDialogProgress;
private AlertDialogProgressBarBinding alertDialogProgressBarBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
......@@ -57,6 +63,9 @@ public class T01SettingActivity extends AppCompatActivity {
setListeners();
resultLauncherRegister();
observeBinding();
// progress alert dialog init
initAlertDialogProgress();
}
@Override
......@@ -74,6 +83,16 @@ public class T01SettingActivity extends AppCompatActivity {
t01SettingViewModel.savePrefs();
}
@Override
protected void onDestroy() {
// 關閉 Activity 前,須將相關附屬的 windows視窗關閉,避免內存洩漏
if (alertDialogProgress != null){
alertDialogProgress.dismiss();
}
super.onDestroy();
}
// public static class SettingsFragment extends PreferenceFragmentCompat {
// @Override
// public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
......@@ -81,6 +100,18 @@ public class T01SettingActivity extends AppCompatActivity {
// }
// }
private void initAlertDialogProgress(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false); // if you want user to wait for some process to finish,
alertDialogProgressBarBinding = AlertDialogProgressBarBinding.inflate(LayoutInflater.from(this));
builder.setView(alertDialogProgressBarBinding.getRoot());
alertDialogProgress = builder.create();
}
private void setAlertDialogProgressMessage(String message){
alertDialogProgressBarBinding.tvProgressBarMsg.setText(message);
}
private void setListeners() {
dataBinding.setUserButton.setOnClickListener(selectUser);
dataBinding.setSaveButton.setOnClickListener(SaveSetting);
......@@ -92,12 +123,25 @@ public class T01SettingActivity extends AppCompatActivity {
dataBinding.setGpsSubButton.setOnClickListener(GpsTimeSub);
dataBinding.setFtpPortEditText.addTextChangedListener(PortTextWatcher);
dataBinding.setGpsSearchRange.addTextChangedListener(gpsSearchRangeWatcher);
dataBinding.btnDumpDb.setOnClickListener(btnDumpDbOnClicked);
dataBinding.setGpsSearchRange.setFilters(new InputFilter[]{new GpsSearchRangeInputFilter()});
}
private void observeBinding() {
t01SettingViewModel.getUsers().observe(this, Users -> {
this.Users = Users;
});
t01SettingViewModel.getShowAlertDialogProgress().observe(this,show -> {
if (alertDialogProgress == null){
return;
}
if (show){
alertDialogProgress.show();
}else {
alertDialogProgress.dismiss();
}
});
}
private void resultLauncherRegister() {
......@@ -109,6 +153,10 @@ public class T01SettingActivity extends AppCompatActivity {
}
});
}
private final View.OnClickListener btnDumpDbOnClicked = v -> {
setAlertDialogProgressMessage("資料匯出中請稍後");
t01SettingViewModel.dumpDB();
};
private final Button.OnClickListener selectUser = v -> {
Intent intent = new Intent();
......
......@@ -46,6 +46,7 @@ public class T02PlateAndSpaceConfirmActivity extends AppCompatActivity {
private int userId;
private Shift shift;
private Location location;
private String lastSpaceId;
private ActivityResultLauncher keyInPlateNumberActivityResultLauncher;
private ActivityResultLauncher roadResultLauncher;
......@@ -69,6 +70,7 @@ public class T02PlateAndSpaceConfirmActivity extends AppCompatActivity {
location = bundle.getParcelable("Location");
boxInfo = (BoxInfo) bundle.getSerializable("BoxInfo");
file = (File) bundle.getSerializable("PhotoFile");
lastSpaceId = bundle.getString("LastSpaceId");
}catch (NullPointerException nullPointerException){
nullPointerException.printStackTrace();
}
......@@ -82,7 +84,7 @@ public class T02PlateAndSpaceConfirmActivity extends AppCompatActivity {
t01SettingViewModel = viewModelProvider.get(T01SettingViewModel.class);
t02SelectSpaceViewModel = viewModelProvider.get(T02SelectSpaceViewModel.class);
t02SelectSpaceViewModel.updateGPSPrecision(t01SettingViewModel.getGPSSearchRange());
t02SelectSpaceViewModel.searchNearSpace(location);
t02SelectSpaceViewModel.searchNearSpace(location, lastSpaceId);
infoRepository = new InfoRepository(this.getApplication());
selectSpaceAdapter = new SelectSpaceAdapter(space -> nextStage(space));
......
package ecom.android.newparkapp.view;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.GridLayoutManager;
import android.content.Intent;
import android.os.Bundle;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.adapter.SelectVehicleBrandAdapter;
import ecom.android.newparkapp.databinding.ActivityT02SelectVehicleBrandBinding;
import ecom.android.newparkapp.entity.VehicleBrand;
import ecom.android.newparkapp.entity.VehicleColor;
import ecom.android.newparkapp.repository.InfoRepository;
public class T02SelectVehicleBrand extends AppCompatActivity {
private ActivityT02SelectVehicleBrandBinding dataBinding;
private InfoRepository infoRepository;
private SelectVehicleBrandAdapter selectVehicleBrandAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataBinding = DataBindingUtil.setContentView(this,R.layout.activity_t02_select_vehicle_brand);
infoRepository = new InfoRepository(getApplication());
selectVehicleBrandAdapter = new SelectVehicleBrandAdapter(vehicleBrand -> vehicleBrandSelected(vehicleBrand));
infoRepository.vehicleBrandDao.getAllLiveData().observe(this, vehicleBrands -> selectVehicleBrandAdapter.submitList(vehicleBrands));
dataBinding.rvSelectOption.setLayoutManager(new GridLayoutManager(this,2));
dataBinding.rvSelectOption.setAdapter(selectVehicleBrandAdapter);
dataBinding.btnSelectBack.setOnClickListener(view -> vehicleBrandSelected(null));
}
private void vehicleBrandSelected(VehicleBrand vehicleBrand){
if (vehicleBrand == null){
setResult(RESULT_CANCELED);
}else {
Intent intent = getIntent();
Bundle bundle = new Bundle();
bundle.putParcelable("VehicleBrand",vehicleBrand);
intent.putExtras(bundle);
setResult(RESULT_OK, intent);
}
finish();
}
}
\ No newline at end of file
package ecom.android.newparkapp.view;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.GridLayoutManager;
import android.content.Intent;
import android.os.Bundle;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.adapter.SelectVehicleColorAdapter;
import ecom.android.newparkapp.adapter.SelectVehicleTypeAdapter;
import ecom.android.newparkapp.databinding.ActivityT02SelectVehicleColorBinding;
import ecom.android.newparkapp.entity.VehicleColor;
import ecom.android.newparkapp.entity.VehicleType;
import ecom.android.newparkapp.repository.InfoRepository;
public class T02SelectVehicleColor extends AppCompatActivity {
private ActivityT02SelectVehicleColorBinding dataBinding;
private InfoRepository infoRepository;
private SelectVehicleColorAdapter selectVehicleColorAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_t02_select_vehicle_color);
infoRepository = new InfoRepository(getApplication());
selectVehicleColorAdapter = new SelectVehicleColorAdapter(vehicleColors -> vehicleColorSelected(vehicleColors));
infoRepository.vehicleColorDao.getAllLiveData().observe(this, vehicleColors -> {selectVehicleColorAdapter.submitList(vehicleColors);});
dataBinding.rvSelectOption.setLayoutManager(new GridLayoutManager(this,2));
dataBinding.rvSelectOption.setAdapter(selectVehicleColorAdapter);
dataBinding.btnSelectBack.setOnClickListener(view -> vehicleColorSelected(null));
}
private void vehicleColorSelected(VehicleColor vehicleColor){
if (vehicleColor == null){
setResult(RESULT_CANCELED);
}else {
Intent intent = getIntent();
Bundle bundle = new Bundle();
bundle.putParcelable("VehicleColor",vehicleColor);
intent.putExtras(bundle);
setResult(RESULT_OK, intent);
}
finish();
}
}
\ No newline at end of file
......@@ -53,6 +53,8 @@ import ecom.android.newparkapp.entity.CaseStatus;
import ecom.android.newparkapp.entity.Shift;
import ecom.android.newparkapp.entity.Space;
import ecom.android.newparkapp.entity.User;
import ecom.android.newparkapp.entity.VehicleBrand;
import ecom.android.newparkapp.entity.VehicleColor;
import ecom.android.newparkapp.entity.VehicleType;
import ecom.android.newparkapp.repository.ParkApiRepository;
import ecom.android.newparkapp.viewModel.BlueToothPortViewModel;
......@@ -81,6 +83,8 @@ public class T02StartActivity extends AppCompatActivity {
private ActivityResultLauncher vehicleTypeResultLauncher;
private ActivityResultLauncher spaceResultLauncher;
private ActivityResultLauncher vehicleColorResultLauncher;
private ActivityResultLauncher vehicleBrandResultLauncher;
private ActivityResultLauncher plateNumberResultLauncher;
private ActivityResultLauncher takePhotosActivityResultLauncher;
private ActivityResultLauncher addPhotosActivityResultLauncher;
......@@ -103,7 +107,7 @@ public class T02StartActivity extends AppCompatActivity {
// 自動順序
final private List<Stage> stageSequence = new ArrayList<Stage>(Arrays.asList(Stage.SPACE, Stage.VEHICLE_TYPE, Stage.PLATE_NUMBER));
final private List<Stage> stageSequence = new ArrayList<Stage>(Arrays.asList(Stage.SPACE, Stage.VEHICLE_TYPE, Stage.PLATE_NUMBER, Stage.VEHICLE_COLOR, Stage.VEHICLE_BRAND));
@Override
protected void onCreate(Bundle savedInstanceState) {
......@@ -198,6 +202,9 @@ public class T02StartActivity extends AppCompatActivity {
dataBinding.btnGpsSearchMode.setOnClickListener(v -> btnGpsSearchModeOnClicked());
dataBinding.btnSelectPrinter.setOnClickListener(v -> selectPrinterDialog());
dataBinding.btnAddPhoto.setOnClickListener(v -> btnAddPhotoOnClicked());
dataBinding.btnVehicleColor.setOnClickListener(v -> btnVehicleColorOnClicked());
dataBinding.btnVehicleBrand.setOnClickListener(v -> btnVehicleBrandOnClicked());
// 搜尋是否有相關車格資料
dataBinding.btnParkingSpace.setOnClickListener(v -> btnParkingSpaceOnClicked());
......@@ -387,6 +394,24 @@ public class T02StartActivity extends AppCompatActivity {
t02StartViewModel.addNewPhotos(photoFile);
}
});
vehicleColorResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == RESULT_OK && result.getData() != null){
VehicleColor vehicleColor = result.getData().getParcelableExtra("VehicleColor");
t02StartViewModel.setVehicleColor(vehicleColor);
// 自動下一階段
autoNext(t01SettingViewModel.getAutoNext(), Stage.VEHICLE_COLOR);
}
});
vehicleBrandResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == RESULT_OK && result.getData() != null){
VehicleBrand vehicleBrand = result.getData().getParcelableExtra("VehicleBrand");
t02StartViewModel.setVehicleBrand(vehicleBrand);
// 自動下一階段
autoNext(t01SettingViewModel.getAutoNext(), Stage.VEHICLE_BRAND);
}
});
}
private void observeBinding() {
......@@ -934,6 +959,17 @@ public class T02StartActivity extends AppCompatActivity {
break outerloop;
}
break;
case VEHICLE_COLOR:
if (tempCase.vehicleColor == null){
index = i ;
break outerloop;
}
break;
case VEHICLE_BRAND:
if (tempCase.vehicleBrand == null){{
index = i;
break outerloop;
}}
default:
break;
}
......@@ -959,6 +995,20 @@ public class T02StartActivity extends AppCompatActivity {
autoNext(enable, nextStage);
}
break;
case VEHICLE_COLOR:
if (tempCase.vehicleColor == null){
btnVehicleColorOnClicked();
}else {
autoNext(enable, nextStage);
}
break;
case VEHICLE_BRAND:
if (tempCase.vehicleBrand == null){
btnVehicleBrandOnClicked();
}else {
autoNext(enable, nextStage);
}
break;
case PLATE_NUMBER:
if (tempCase.plateNumber == null || tempCase.plateNumber.trim().isEmpty()){
btnPlateNumberOnClicked();
......@@ -990,6 +1040,13 @@ public class T02StartActivity extends AppCompatActivity {
if (boxInfo != null){
bundle.putSerializable("BoxInfo", boxInfo);
}
// 取得當前案件的車格
Case currentCase = t02StartViewModel.getCurrentCase().getValue();
if(currentCase != null && currentCase.space != null){
String lastSpaceId = currentCase.space.id;
bundle.putString("LastSpaceId", lastSpaceId);
}
bundle.putParcelable("Shift", shift);
bundle.putInt("UserId", currentUser.id);
bundle.putParcelable("Location", fusedGpsViewModel.getLocation().getValue());
......@@ -1002,10 +1059,24 @@ public class T02StartActivity extends AppCompatActivity {
takePhoto(addPhotosActivityResultLauncher);
}
private void btnVehicleBrandOnClicked() {
Intent intent = new Intent();
intent.setClass(this, T02SelectVehicleBrand.class);
vehicleBrandResultLauncher.launch(intent);
}
private void btnVehicleColorOnClicked() {
Intent intent = new Intent();
intent.setClass(this, T02SelectVehicleColor.class);
vehicleColorResultLauncher.launch(intent);
}
enum Stage{
TAKE_PHOTO,
SPACE,
VEHICLE_TYPE,
PLATE_NUMBER;
PLATE_NUMBER,
VEHICLE_COLOR,
VEHICLE_BRAND;
}
}
\ No newline at end of file
......@@ -2,6 +2,8 @@ package ecom.android.newparkapp.viewModel;
import static android.content.Context.MODE_PRIVATE;
import static java.lang.Thread.sleep;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
......@@ -22,6 +24,8 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import ecom.android.newparkapp.Common;
import ecom.android.newparkapp.R;
......@@ -41,6 +45,9 @@ public class T01SettingViewModel extends AndroidViewModel {
private LiveData<List<User>> Users;
private InfoRepository infoRepository;
private ExecutorService executorService;
private MutableLiveData<Boolean> showAlertDialogProgress = new MutableLiveData<>();
public T01SettingViewModel(@NonNull Application application) {
super(application);
......@@ -50,6 +57,8 @@ public class T01SettingViewModel extends AndroidViewModel {
infoRepository = new InfoRepository(application);
Users = infoRepository.userDao.getAllLiveData();
executorService = Executors.newFixedThreadPool(application.getResources().getInteger(R.integer.number_db_thread_pool));
showAlertDialogProgress.setValue(false);
}
public void restorePrefs(){
......@@ -235,4 +244,27 @@ public class T01SettingViewModel extends AndroidViewModel {
return PREF.getValue() != null ? PREF.getValue().pref_UploadT * 60 * 1000: 0;
}
public void dumpDB() {
executorService.execute(new Runnable() {
@Override
public void run() {
showAlertDialogProgress.postValue(true);
List<Case> cases = infoRepository.caseDao.getAll();
String save_path = Environment.getExternalStorageDirectory() + getApplication().getString(R.string.sysDataDB_path);
File dbFile = new File(save_path + "dumpDB.txt" );
if (dbFile.exists()){
dbFile.delete();
}
for (int i = 0; i < cases.size(); i ++){
Case thisCase = cases.get(i);
Common.writeTXT(getApplication(), save_path, "dumpDB.txt", thisCase.getDetailString());
}
showAlertDialogProgress.postValue(false);
}
});
}
public LiveData<Boolean> getShowAlertDialogProgress(){
return showAlertDialogProgress;
}
}
......@@ -62,6 +62,26 @@ public class T02SelectSpaceViewModel extends AndroidViewModel {
getMoreNearSpace(nearSpace);
}
public void searchNearSpace(Location location, String lastSpaceId) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
currentRoad.setValue(null);
List<Space> nearSpace = infoRepository.spaceDao.getAllByLocation(latitude + gpsPrecision, latitude - gpsPrecision, longitude + gpsPrecision, longitude - gpsPrecision);
if (lastSpaceId != null && nearSpace.size() == 0){
List<Space> nextSpace = infoRepository.spaceDao.getNextSpaces(lastSpaceId, 5);
for (int i = 0; i < nextSpace.size(); i++) {
Space space = nextSpace.get(i);
if (nearSpace.stream().noneMatch(s -> s.id.equals(space.id))){
nearSpace.add(space);
}
}
}
getMoreNearSpace(nearSpace);
}
private void getMoreNearSpace(List<Space> nearSpace){
List<Space> moreNearSpace = new ArrayList<>();
if (nearSpace.size() > 0) {
......
......@@ -45,6 +45,8 @@ import ecom.android.newparkapp.entity.Space;
import ecom.android.newparkapp.entity.SpaceFee;
import ecom.android.newparkapp.entity.SpaceType;
import ecom.android.newparkapp.entity.User;
import ecom.android.newparkapp.entity.VehicleBrand;
import ecom.android.newparkapp.entity.VehicleColor;
import ecom.android.newparkapp.entity.VehicleType;
import ecom.android.newparkapp.repository.InfoRepository;
import ecom.android.newparkapp.repository.ParkApiRepository;
......@@ -125,6 +127,7 @@ public class T02StartViewModel extends AndroidViewModel {
public void setCurrentUser(User user){ currentUser.setValue(user);};
public LiveData<Case> getCurrentCase(){return currentCase;}
public void setVehicleType(VehicleType vehicleType){
Case tempCase = currentCase.getValue();
tempCase.vehicleType = vehicleType;
......@@ -133,6 +136,24 @@ public class T02StartViewModel extends AndroidViewModel {
currentCase.setValue(tempCase);
}
public void setVehicleColor(VehicleColor vehicleColor){
Case tempCase = currentCase.getValue();
if (tempCase == null || tempCase.caseStatus != CaseStatus.NEW){
return;
}
tempCase.vehicleColor = vehicleColor;
currentCase.setValue(tempCase);
}
public void setVehicleBrand(VehicleBrand vehicleBrand){
Case tempCase = currentCase.getValue();
if (tempCase == null || tempCase.caseStatus != CaseStatus.NEW){
return;
}
tempCase.vehicleBrand = vehicleBrand;
currentCase.setValue(tempCase);
}
public void setSpace(Space space){
Case tempCase = currentCase.getValue();
if (tempCase.caseStatus != CaseStatus.NEW){
......
......@@ -11,8 +11,44 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_import_db"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/recycler_view_db_table_item" />
android:layout_height="0dp"
android:layout_weight="8"
tools:listitem="@layout/recycler_view_db_table_item">
</androidx.recyclerview.widget.RecyclerView>
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_weight="0.1"
app:srcCompat="@color/black">
</ImageView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:id="@+id/btn_import_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="匯入全部"
android:textSize="20sp"
android:layout_gravity="center"/>
<Button
android:id="@+id/btn_update_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="20sp"
android:text="更新全部"
android:layout_gravity="center"/>
</LinearLayout>
</LinearLayout>
</layout>
\ No newline at end of file
......@@ -374,6 +374,16 @@
android:text="匯入資料"
android:textSize="25sp" />
<Button
android:id="@+id/btn_dump_db"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginTop="5dp"
android:gravity="center"
android:text="資料匯出"
android:textSize="25sp" />
<Button
android:id="@+id/advanced_button"
android:layout_width="match_parent"
......
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".view.T02SelectVehicleBrand">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal"
android:paddingStart="0dp"
android:paddingEnd="5dp">
<TextView
android:id="@+id/tv_select_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.25"
android:gravity="center|center_vertical"
android:text="廠牌"
android:textSize="30sp" />
<Button
android:id="@+id/btn_select_back"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.75"
android:text="@string/label_back"
android:textSize="30sp" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_select_option"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.1"
android:padding="6dp"
app:layoutManager = "androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:spanCount="2"
tools:listitem="@layout/recycler_view_vehicle_brand_item" />
</LinearLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".view.T02SelectVehicleColor">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal"
android:paddingStart="0dp"
android:paddingEnd="5dp">
<TextView
android:id="@+id/tv_select_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.25"
android:gravity="center|center_vertical"
android:text="車色"
android:textSize="30sp" />
<Button
android:id="@+id/btn_select_back"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.75"
android:text="@string/label_back"
android:textSize="30sp" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_select_option"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.1"
android:padding="6dp"
app:layoutManager = "androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:spanCount="2"
tools:listitem="@layout/recycler_view_vehicle_color_item" />
</LinearLayout>
</layout>
\ No newline at end of file
......@@ -323,7 +323,6 @@
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/linearLayout11"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
......@@ -341,10 +340,11 @@
android:textSize="21sp" />
<Button
android:id="@+id/carColor_button"
android:id="@+id/btn_vehicle_color"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.17"
android:text="@{t02StartViewModel.currentCase.vehicleColor.name}"
android:textSize="28sp" />
</LinearLayout>
......@@ -354,7 +354,6 @@
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/linearLayout4"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
......@@ -372,10 +371,11 @@
android:textSize="21sp" />
<Button
android:id="@+id/carBrand_button"
android:id="@+id/btn_vehicle_brand"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.17"
android:text="@{t02StartViewModel.currentCase.vehicleBrand.name}"
android:textSize="28sp" />
</LinearLayout>
......
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:id="@+id/btn_select_vehicle_brand"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button"
android:textSize="20dp"/>
</layout>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:id="@+id/btn_select_vehicle_color"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button"
android:textSize="20dp"/>
</layout>
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