diff --git a/app/src/main/java/eu/csc/vehown/services/rest/vehownserver/VehOwnAppClientDummy.java b/app/src/main/java/eu/csc/vehown/services/rest/vehownserver/VehOwnAppClientDummy.java index 4402e6f..8ab5e99 100644 --- a/app/src/main/java/eu/csc/vehown/services/rest/vehownserver/VehOwnAppClientDummy.java +++ b/app/src/main/java/eu/csc/vehown/services/rest/vehownserver/VehOwnAppClientDummy.java @@ -18,7 +18,9 @@ import lombok.var; import retrofit2.Call; import java.io.IOException; +import java.time.Instant; import java.util.ArrayList; +import java.util.Date; import java.util.List; public class VehOwnAppClientDummy implements IVehOwnAppClient { @@ -81,6 +83,7 @@ public class VehOwnAppClientDummy implements IVehOwnAppClient { customerVehicleA.setVin("12345"); customerVehicleA.setLicensePlate("HS-ABC"); customerVehicleA.setPropulsionType("gasoline"); + customerVehicleA.setRegistrationDate(new Date()); customerVehicles = new ArrayList<>(); customerVehicles.add(customerVehicleA); diff --git a/app/src/main/java/eu/csc/vehown/ui/base/ActivityBaseDetailContent.java b/app/src/main/java/eu/csc/vehown/ui/base/ActivityBaseDetailContent.java index d003aea..0fdac7c 100644 --- a/app/src/main/java/eu/csc/vehown/ui/base/ActivityBaseDetailContent.java +++ b/app/src/main/java/eu/csc/vehown/ui/base/ActivityBaseDetailContent.java @@ -9,6 +9,7 @@ import android.util.Log; import eu.csc.vehown.R; import eu.csc.vehown.ui.fragments.UserProfileFragment; import eu.csc.vehown.ui.fragments.details.FragmentDetailDevice; +import eu.csc.vehown.ui.fragments.details.FragmentDetailVehicle; import eu.csc.vehown.ui.registration.device.DeviceRegistrationFragment; import eu.csc.vehown.ui.registration.vehicle.VehicleRegistrationFragment; @@ -81,7 +82,7 @@ public class ActivityBaseDetailContent extends AbstractAppCompatActivity { case ARG_ITEM_TYPE_VEHICLE: Log.d("DATA", id); //switchFragment(R.id.flContent, FragmentDetailVehicle.newInstance(id)); - switchFragment(R.id.flContent, VehicleRegistrationFragment.editCurrentItem(id)); + switchFragment(R.id.flContent, FragmentDetailVehicle.newInstance(id)); break; case ARG_ITEM_TYPE_DEVICE: switchFragment(R.id.flContent, FragmentDetailDevice.newInstance(id)); diff --git a/app/src/main/java/eu/csc/vehown/ui/fragments/details/FragmentDetailVehicle.java b/app/src/main/java/eu/csc/vehown/ui/fragments/details/FragmentDetailVehicle.java index 395630f..d0467a6 100644 --- a/app/src/main/java/eu/csc/vehown/ui/fragments/details/FragmentDetailVehicle.java +++ b/app/src/main/java/eu/csc/vehown/ui/fragments/details/FragmentDetailVehicle.java @@ -9,15 +9,23 @@ import android.widget.EditText; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; + +import eu.csc.vehown.Helper; +import eu.csc.vehown.data.model.Vehicle; import eu.csc.vehown.databinding.FragmentDetailVehicleFragmentBinding; +import eu.csc.vehown.ui.base.AbstractFragment; +import eu.csc.vehown.ui.registration.vehicle.VehicleRegistrationViewModel; +import eu.csc.vehown.ui.viewmodels.AppViewModelFactory; import static eu.csc.vehown.ui.fragments.details.AbstractDetailFragment.ARG_ITEM_ID; -public class FragmentDetailVehicle extends Fragment { +public class FragmentDetailVehicle extends AbstractFragment { private FragmentDetailVehicleViewModel mViewModel; private FragmentDetailVehicleFragmentBinding binding; + private static final String TAG = FragmentDetailVehicle.class.getSimpleName(); public static FragmentDetailVehicle newInstance(String vin) { FragmentDetailVehicle f = new FragmentDetailVehicle(); @@ -34,21 +42,47 @@ public class FragmentDetailVehicle extends Fragment { Bundle args = getArguments(); String vin = args.getString(ARG_ITEM_ID, "NO_VIN"); Log.d("FR", vin); - EditText tv = binding.editVIN; - binding.tvVIN.setText(vin); - binding.editVIN.setText(vin); - binding.editLicensePlate.setText(vin); + + return rootView; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - mViewModel = new ViewModelProvider(this).get(FragmentDetailVehicleViewModel.class); + mViewModel = new ViewModelProvider(this, new AppViewModelFactory(getContext())).get(FragmentDetailVehicleViewModel.class); + Bundle args = getArguments(); String vin = args.getString(ARG_ITEM_ID, "NO_VIN"); - binding.editLicensePlate.setText(vin); - Log.d("FR", vin); + + mViewModel.getMVehicle().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(Vehicle vehicle) { + eu.csc.log.Log.d(TAG, vehicle.toString()); + binding.tfVin.getEditText().setText(vehicle.getVin()); + binding.tfModel.getEditText().setText(vehicle.getModel()); + binding.tfBrand.getEditText().setText(vehicle.getBrand()); + binding.tfLicensePlate.getEditText().setText(vehicle.getLicensePlate()); + binding.tfRegistrationDate.getEditText().setText(Helper.getDateString(vehicle.getRegistrationDate())); + } + }); + + binding.tfRegistrationDate.getEditText().setEnabled(false); + binding.tfModel.getEditText().setEnabled(false); + binding.tfVin.getEditText().setEnabled(false); + binding.tfBrand.getEditText().setEnabled(false); + binding.tfPowertraint.getEditText().setEnabled(false); + binding.tfPropulsion.getEditText().setEnabled(false); + binding.tfLicensePlate.getEditText().setEnabled(false); + + binding.ivVehicleImage.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + + mViewModel.searchVehicleByVin(vin); // TODO: Use the ViewModel } } diff --git a/app/src/main/java/eu/csc/vehown/ui/fragments/details/FragmentDetailVehicleViewModel.java b/app/src/main/java/eu/csc/vehown/ui/fragments/details/FragmentDetailVehicleViewModel.java index 2bd0f8f..04f5b19 100644 --- a/app/src/main/java/eu/csc/vehown/ui/fragments/details/FragmentDetailVehicleViewModel.java +++ b/app/src/main/java/eu/csc/vehown/ui/fragments/details/FragmentDetailVehicleViewModel.java @@ -1,7 +1,27 @@ package eu.csc.vehown.ui.fragments.details; +import android.content.Context; + +import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; -public class FragmentDetailVehicleViewModel extends ViewModel { +import eu.csc.vehown.data.model.Vehicle; +import eu.csc.vehown.ui.viewmodels.AbstractBaseViewModel; +import lombok.Getter; + +public class FragmentDetailVehicleViewModel extends AbstractBaseViewModel { + + @Getter + private final MutableLiveData mVehicle; + + public FragmentDetailVehicleViewModel(Context context) { + super(context); + mVehicle = new MutableLiveData<>(); + } + + + public void searchVehicleByVin(String vin){ + mVehicle.setValue(localStorageClient.findVehicleByVin(vin).orElse(new Vehicle())); + } // TODO: Implement the ViewModel } \ No newline at end of file diff --git a/app/src/main/java/eu/csc/vehown/ui/logs/LogsFragment.java b/app/src/main/java/eu/csc/vehown/ui/logs/LogsFragment.java index 6f89531..62cefff 100644 --- a/app/src/main/java/eu/csc/vehown/ui/logs/LogsFragment.java +++ b/app/src/main/java/eu/csc/vehown/ui/logs/LogsFragment.java @@ -3,6 +3,7 @@ package eu.csc.vehown.ui.logs; import android.content.Context; import android.os.Bundle; +import androidx.lifecycle.Observer; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -11,9 +12,13 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import java.util.List; + import eu.csc.vehown.R; +import eu.csc.vehown.persist.localstorage.entity.EntityLog; import eu.csc.vehown.ui.adapters.LogItemRecyclerViewAdapter; import eu.csc.vehown.ui.base.AbstractFragment; +import lombok.var; /** * A fragment representing a list of Items. @@ -67,6 +72,9 @@ public class LogsFragment extends AbstractFragment { } recyclerView.setAdapter(new LogItemRecyclerViewAdapter(getDatabase().log().getLogs())); } + + + return view; } } \ No newline at end of file diff --git a/app/src/main/java/eu/csc/vehown/ui/main/MainActivity.java b/app/src/main/java/eu/csc/vehown/ui/main/MainActivity.java index 488fb1d..511c06e 100644 --- a/app/src/main/java/eu/csc/vehown/ui/main/MainActivity.java +++ b/app/src/main/java/eu/csc/vehown/ui/main/MainActivity.java @@ -94,14 +94,17 @@ public class MainActivity extends AppCompatActivity { } private void checkRegistration() { - if(SharedPreferencesFactory.isLoggedIn(getApplicationContext())){ - Log.d(TAG, "NOT LOGGED IN"); - }else{ + + if (SharedPreferencesFactory.isLoggedIn(getApplicationContext())) { + Log.d(TAG, "NOT LOGGED IN"); + // startActivity(showLogin()); + } else { + // showProfile(); } //startActivity(ActivityBaseDetailContent.getProfileInstance(this)); -showProfile(); + showProfile(); } private void setup() { @@ -127,7 +130,7 @@ showProfile(); public void menuItemOnClicked(MenuItem item) { - Log.d("MainA", ""+ item.getItemId()+ item.getTitle()); + Log.d("MainA", "" + item.getItemId() + item.getTitle()); Intent intent = null; switch (item.getItemId()) { case R.id.nav_login: @@ -197,6 +200,7 @@ showProfile(); fragmentTransaction.replace(R.id.content_frame, fragment); fragmentTransaction.commit(); } + private void showProfile() { UserProfileFragment fragment = new UserProfileFragment(); fragment.setArguments(new Bundle()); @@ -208,9 +212,10 @@ showProfile(); private Intent showLogin() { return new Intent(this, LoginActivity.class); } + private void showLogs() { - LogsFragment fragment = new LogsFragment(); - fragment.setArguments(new Bundle()); + LogsFragment fragment = LogsFragment.newInstance(1); + //fragment.setArguments(new Bundle()); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.content_frame, fragment); fragmentTransaction.commit(); diff --git a/app/src/main/java/eu/csc/vehown/ui/md/ItemListFragment.java b/app/src/main/java/eu/csc/vehown/ui/md/ItemListFragment.java index 82b7a97..08e55cc 100644 --- a/app/src/main/java/eu/csc/vehown/ui/md/ItemListFragment.java +++ b/app/src/main/java/eu/csc/vehown/ui/md/ItemListFragment.java @@ -25,6 +25,7 @@ import eu.csc.vehown.R; import eu.csc.vehown.databinding.FragmentItemListBinding; import eu.csc.vehown.databinding.ItemListContentBinding; import eu.csc.vehown.persist.sharedPreferences.SharedPreferencesFactory; +import eu.csc.vehown.ui.base.AbstractFragment; import eu.csc.vehown.ui.md.placeholder.PlaceholderContent; import lombok.var; @@ -43,7 +44,7 @@ import static eu.csc.vehown.ui.md.ItemDetailHostActivity.TYPE_ID_VEHICLE; * item details. On larger screens, the Navigation controller presents the list of items and * item details side-by-side using two vertical panes. */ -public class ItemListFragment extends Fragment { +public class ItemListFragment extends AbstractFragment { private static final String TAG = ItemListFragment.class.getSimpleName(); /** diff --git a/app/src/main/java/eu/csc/vehown/ui/registration/data/CustomerContentDataSource.java b/app/src/main/java/eu/csc/vehown/ui/registration/data/CustomerContentDataSource.java index 348993e..5459d05 100644 --- a/app/src/main/java/eu/csc/vehown/ui/registration/data/CustomerContentDataSource.java +++ b/app/src/main/java/eu/csc/vehown/ui/registration/data/CustomerContentDataSource.java @@ -131,6 +131,7 @@ public class CustomerContentDataSource { item.setLicensePlate(remoteItem.getLicensePlate()); item.setPropulsionType(remoteItem.getPropulsionType()); item.setVin(remoteItem.getVin()); + item.setRegistrationDate(remoteItem.getRegistrationDate()); result.add(item); diff --git a/app/src/main/java/eu/csc/vehown/ui/registration/vehicle/VehicleRegistrationFragment.java b/app/src/main/java/eu/csc/vehown/ui/registration/vehicle/VehicleRegistrationFragment.java index dce878d..d1b10b0 100644 --- a/app/src/main/java/eu/csc/vehown/ui/registration/vehicle/VehicleRegistrationFragment.java +++ b/app/src/main/java/eu/csc/vehown/ui/registration/vehicle/VehicleRegistrationFragment.java @@ -3,6 +3,7 @@ package eu.csc.vehown.ui.registration.vehicle; import android.app.Activity; import android.app.AlertDialog; import android.app.DatePickerDialog; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; diff --git a/app/src/main/java/eu/csc/vehown/ui/viewmodels/AppViewModelFactory.java b/app/src/main/java/eu/csc/vehown/ui/viewmodels/AppViewModelFactory.java index 1130306..f899b8e 100644 --- a/app/src/main/java/eu/csc/vehown/ui/viewmodels/AppViewModelFactory.java +++ b/app/src/main/java/eu/csc/vehown/ui/viewmodels/AppViewModelFactory.java @@ -10,6 +10,7 @@ import eu.csc.vehown.persist.sharedPreferences.LocalStorageClient; import eu.csc.vehown.persist.sharedPreferences.SharedPreferencesFactory; import eu.csc.vehown.ui.fragments.UserProfileViewModel; import eu.csc.vehown.ui.fragments.data.LoginRepository; +import eu.csc.vehown.ui.fragments.details.FragmentDetailVehicleViewModel; import eu.csc.vehown.ui.fragments.ui.login.LoginViewModel; import eu.csc.vehown.ui.registration.RegistrationViewModel; import eu.csc.vehown.ui.registration.VehicleAndDevicesViewModel; @@ -64,6 +65,9 @@ public class AppViewModelFactory implements ViewModelProvider.Factory { new CustomerContentDataSource(), localStorage), context); } + else if(modelClass.isAssignableFrom(FragmentDetailVehicleViewModel.class)){ + return (T) new FragmentDetailVehicleViewModel(context); + } else if (modelClass.isAssignableFrom(DeviceRegistrationViewModel.class)) { return (T) new DeviceRegistrationViewModel(localStorage, context, new CustomerContentDataSource()); } diff --git a/app/src/main/res/drawable/ic_baseline_image_search_24.xml b/app/src/main/res/drawable/ic_baseline_image_search_24.xml new file mode 100644 index 0000000..423fe91 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_image_search_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_detail_vehicle_fragment.xml b/app/src/main/res/layout/fragment_detail_vehicle_fragment.xml index 12e4507..016409f 100644 --- a/app/src/main/res/layout/fragment_detail_vehicle_fragment.xml +++ b/app/src/main/res/layout/fragment_detail_vehicle_fragment.xml @@ -11,168 +11,177 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" + > - + + android:hint="@string/vehicle_brand" + > + + + + - + android:layout_below="@+id/tfBrand" + android:hint="@string/vehicle_model" + > - + + + + + + android:layout_below="@+id/tfModel" + android:hint="@string/vehicle_model" + > - + + + + + + + android:layout_below="@+id/tfPowertraint" + android:hint="@string/variant" + > - + + + + + + + android:layout_below="@+id/tfVariant" + android:hint="@string/variant" + > - + + + + + + + + android:layout_below="@+id/tfVin" + android:hint="@string/license_plate" + > - + + + + + + + android:layout_below="@+id/tfLicensePlate" + android:hint="@string/propulsion_type" + > - + + + + + + android:layout_below="@+id/tfPropulsion" + android:hint="@string/registration_date" + > - + + + + + + + - - - - - - - - - - - - - - - + android:layout_below="@id/tfRegistrationDate" + android:scaleType="fitCenter" + android:src="@drawable/ic_baseline_image_search_24" + android:padding="50dp"/> diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index 5cafa6e..49341d6 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -34,6 +34,7 @@ android:layout_marginTop="8dp" android:layout_marginEnd="24dp" android:hint="@string/password" + android:imeActionLabel="@string/action_sign_in_short" android:imeOptions="actionDone" android:inputType="textPassword" diff --git a/app/src/main/res/layout/fragment_show_vehicles_and_devices.xml b/app/src/main/res/layout/fragment_show_vehicles_and_devices.xml index 210cf08..85c5143 100644 --- a/app/src/main/res/layout/fragment_show_vehicles_and_devices.xml +++ b/app/src/main/res/layout/fragment_show_vehicles_and_devices.xml @@ -4,54 +4,53 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="?android:windowBackground" + android:orientation="vertical"> + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_marginStart="5dp" + android:layout_marginTop="5dp" + android:layout_weight="1.0"> + android:id="@+id/tvVehicles" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_toStartOf="@id/btnAddVehicle" + android:text="@string/vehicles" + android:textSize="@dimen/fontL" + android:textStyle="bold" /> + android:id="@+id/btnAddVehicle" + android:layout_width="32dp" + android:layout_height="32dp" + android:layout_alignParentEnd="true" + android:layout_marginEnd="10dp" + android:src="@drawable/ic_baseline_add_24" + app:backgroundTint="@android:color/transparent" + app:tint="@android:color/black" /> + android:id="@+id/listVehicles" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_below="@+id/tvVehicles" + android:layout_marginTop="10dp" + app:layoutManager="LinearLayoutManager" + tools:listitem="@layout/content_vehicle_modern" /> + android:layout_marginTop="5dp" + android:layout_weight="1.0"> + android:id="@+id/btnAddDevice" + android:layout_width="32dp" + android:layout_height="32dp" + android:layout_alignParentEnd="true" + android:layout_marginEnd="10dp" + android:src="@drawable/ic_baseline_add_24" + app:backgroundTint="@android:color/transparent" + app:tint="@android:color/black" /> + app:layoutManager="LinearLayoutManager" + tools:listitem="@layout/content_device_modern" /> diff --git a/app/src/main/res/layout/fragment_vehicle_registration.xml b/app/src/main/res/layout/fragment_vehicle_registration.xml index 79412cb..17415b6 100644 --- a/app/src/main/res/layout/fragment_vehicle_registration.xml +++ b/app/src/main/res/layout/fragment_vehicle_registration.xml @@ -3,8 +3,9 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="?android:windowBackground" - android:layout_alignParentBottom="true" + android:layout_alignParentBottom="true" android:scrollbarFadeDuration="0" android:scrollbarSize="5dip"> diff --git a/libs/AppVehOwnServerClient.jar b/libs/AppVehOwnServerClient.jar index 2166347..9e0e3e8 100644 Binary files a/libs/AppVehOwnServerClient.jar and b/libs/AppVehOwnServerClient.jar differ diff --git a/libs/AppVehOwnServerDto.jar b/libs/AppVehOwnServerDto.jar index da4f668..73826d6 100644 Binary files a/libs/AppVehOwnServerDto.jar and b/libs/AppVehOwnServerDto.jar differ diff --git a/services/core/src/main/java/eu/csc/vehown/Helper.java b/services/core/src/main/java/eu/csc/vehown/Helper.java index 18c92d2..9c70e8d 100644 --- a/services/core/src/main/java/eu/csc/vehown/Helper.java +++ b/services/core/src/main/java/eu/csc/vehown/Helper.java @@ -13,7 +13,8 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Helper { - private static DateFormat dateFormat = new SimpleDateFormat("yyyy/dd/MM HH:mm",Locale.ENGLISH); + private static DateFormat dateTimeFormat = new SimpleDateFormat("yyyy/dd/MM HH:mm",Locale.ENGLISH); + private static DateFormat dateFormat = new SimpleDateFormat("yyyy/dd/MM",Locale.ENGLISH); private static final DecimalFormat df = new DecimalFormat("@@"); public static final ExecutorService executorService = Executors.newFixedThreadPool(4); @@ -53,4 +54,10 @@ public class Helper { public static String getDateString(Long time) { return dateFormat.format(new Date(time)); } + + public static String getDateString(Date date) { + if(date== null) + return ""; + return getDateString(date.getTime()); + } } diff --git a/services/localstorage/src/main/java/eu/csc/vehown/persist/localstorage/dao/EntityLogDao.java b/services/localstorage/src/main/java/eu/csc/vehown/persist/localstorage/dao/EntityLogDao.java index 586d5f1..c3639a2 100644 --- a/services/localstorage/src/main/java/eu/csc/vehown/persist/localstorage/dao/EntityLogDao.java +++ b/services/localstorage/src/main/java/eu/csc/vehown/persist/localstorage/dao/EntityLogDao.java @@ -19,6 +19,9 @@ public interface EntityLogDao extends BaseDao { " LIMIT 2000") LiveData> liveLogs(long from, Integer type); + @Query("SELECT * FROM log") + LiveData> liveLogs(); + @Query("SELECT * FROM log" + " WHERE time > :from" + " AND (:type IS NULL OR type = :type)" +