diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..8d94c58 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..0897082 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0ad17cb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..1d484fd --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,44 @@ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace 'com.utopiaindustries.selftrucking' + compileSdk 34 + + defaultConfig { + applicationId "com.utopiaindustries.selftrucking" + minSdk 24 + targetSdk 34 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation libs.appcompat + implementation libs.material + implementation libs.activity + implementation libs.constraintlayout + implementation libs.recyclerview + implementation libs.play.services.maps + implementation libs.retrofit + implementation libs.converter.gson + testImplementation libs.junit + androidTestImplementation libs.ext.junit + androidTestImplementation libs.espresso.core +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/utopiaindustries/selftrucking/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/utopiaindustries/selftrucking/ExampleInstrumentedTest.java new file mode 100644 index 0000000..f950df8 --- /dev/null +++ b/app/src/androidTest/java/com/utopiaindustries/selftrucking/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.selftrucking; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.utopiaindustries.selftrucking", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..0ffea9a --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/ContainerDetailActivity.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/ContainerDetailActivity.java new file mode 100644 index 0000000..5c5f1e9 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/ContainerDetailActivity.java @@ -0,0 +1,54 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.selftrucking.R; + +public class ContainerDetailActivity extends AppCompatActivity { + + TextView containerDetailId, containerDestination, driverId, driverName; + Button btnMarkPicked; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_container_detail); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + initializeLayout(); + + btnMarkPicked.setOnClickListener(v -> { + Toast.makeText(this, "Container marked as picked", Toast.LENGTH_SHORT).show(); + + Intent intent = new Intent(ContainerDetailActivity.this, TrackingActivity.class); + //intent.putExtra("container_id", container.getContainerId()); + startActivity(intent); + + }); + } + + public void initializeLayout() { + containerDetailId = findViewById(R.id.container_detail_id); + containerDestination = findViewById(R.id.container_destination); + driverId = findViewById(R.id.driver_Id); + driverName = findViewById(R.id.driver_name); + btnMarkPicked = findViewById(R.id.btn_mark_picked); + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeActivity.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeActivity.java new file mode 100644 index 0000000..c2f9739 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeActivity.java @@ -0,0 +1,153 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens; + +import android.content.Intent; +import android.os.Bundle; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.adapters.ContainerAdapter; +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiService; +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiServiceFactory; +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.MotiveApiService; +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.interfaces.SelectListener; +import com.utopiaindustries.selftrucking.models.Container; +import com.utopiaindustries.selftrucking.R; +import com.utopiaindustries.selftrucking.models.ContainerWorkflow; +import com.utopiaindustries.selftrucking.models.DriverResponse; + +import java.util.ArrayList; +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class HomeActivity extends AppCompatActivity implements SelectListener { + + //String[] item = {"Material", "Design", "Components", "Android", "5.0 Lollipop"}; + //AutoCompleteTextView autoCompleteTextView; + //ArrayAdapter adapterItems; + HomeViewModel homeViewModel; + RecyclerView containerRecyclerView; + ContainerAdapter adapter; + List containerList = new ArrayList<>(); + ApiService apiService; + MotiveApiService motiveApiService; + DriverResponse driverResponse; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_home); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + initializeLayout(); + + /*autoCompleteTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int position, long l) { + String item = adapterView.getItemAtPosition(position).toString(); + Log.e("Item: ", ""+ item); + + } + });*/ + } + + + public void initializeLayout() { + homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class); + containerRecyclerView = findViewById(R.id.container_list); + containerRecyclerView.setLayoutManager(new LinearLayoutManager(this)); + apiService = ApiServiceFactory.getApiService(); + motiveApiService = ApiServiceFactory.getMotiveApiService(); + + + driverResponse = (DriverResponse) getIntent().getSerializableExtra("driverResponse"); + assert driverResponse != null; + containerList.addAll(driverResponse.getContainerWorkflowData()); + + //dummyData(); + + adapter = new ContainerAdapter(containerList, this); + containerRecyclerView.setAdapter(adapter); + + /*autoCompleteTextView = findViewById(R.id.auto_complete_textview); + adapterItems = new ArrayAdapter(this, R.layout.list_items, item); + autoCompleteTextView.setAdapter(adapterItems);*/ + } + + @Override + public void onItemClicked(ContainerWorkflow container) { + Toast.makeText(this, String.valueOf(container.getContainerNo()), Toast.LENGTH_SHORT).show(); + + Intent intent = new Intent(HomeActivity.this, ContainerDetailActivity.class); + intent.putExtra("container_id", container.getContainerNo()); + startActivity(intent); + + + } + + /*public void dummyData() { + Container container1 = new Container("1","Karachi To Lahore","Assigned","11","abc"); + Container container2 = new Container("2","Lahore To Lahore","Assigned","11","abc"); + Container container3 = new Container("3","Islamabad To Lahore","Assigned","11","abc"); + Container container4 = new Container("4","Peshawar To Lahore","Assigned","11","abc"); + Container container5 = new Container("5","Multan To Lahore","Assigned","11","abc"); + Container container6 = new Container("6","Faisalabad To Lahore","Assigned","11","abc"); + Container container7 = new Container("7","Quetta To Lahore","Assigned","11","abc"); + + containerList.add(container1); + containerList.add(container2); + containerList.add(container3); + containerList.add(container4); + containerList.add(container5); + containerList.add(container6); + containerList.add(container7); + }*/ + + private void fetchAssignedContainers() { + apiService.fetchAllReports("").enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if( response.isSuccessful() && response.body() != null ){ + + } + else { + + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + System.out.println( t.getMessage() ); + } + }); + } + + private void fetchTruckLocation() { + motiveApiService.getDriverLocation("").enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + + } + + @Override + public void onFailure(Call> call, Throwable t) { + + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeViewModel.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeViewModel.java new file mode 100644 index 0000000..0bf137b --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeViewModel.java @@ -0,0 +1,8 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens; + +import androidx.lifecycle.ViewModel; + +public class HomeViewModel extends ViewModel { + + +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/TrackingActivity.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/TrackingActivity.java new file mode 100644 index 0000000..8980f42 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/TrackingActivity.java @@ -0,0 +1,59 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.OnMapReadyCallback; +import com.google.android.gms.maps.SupportMapFragment; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.MarkerOptions; +import com.utopiaindustries.selftrucking.R; + +public class TrackingActivity extends AppCompatActivity implements OnMapReadyCallback { + + GoogleMap myMap; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_tracking); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + initializeLayout(); + + } + + public void initializeLayout() { + SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); + mapFragment.getMapAsync(TrackingActivity.this); + } + + @Override + public void onMapReady(@NonNull GoogleMap googleMap) { + + myMap = googleMap; + + LatLng sydney = new LatLng(-34, 151); + Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.truck_map); + Bitmap resizedIcon = Bitmap.createScaledBitmap(icon, 150, 150, false); + myMap.addMarker(new MarkerOptions().position(sydney).title("Sydney").icon(BitmapDescriptorFactory.fromBitmap(resizedIcon))); + myMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/adapters/ContainerAdapter.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/adapters/ContainerAdapter.java new file mode 100644 index 0000000..67a1c84 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/adapters/ContainerAdapter.java @@ -0,0 +1,61 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.adapters; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.interfaces.SelectListener; +import com.utopiaindustries.selftrucking.models.Container; +import com.utopiaindustries.selftrucking.R; +import com.utopiaindustries.selftrucking.models.ContainerWorkflow; + +import java.util.List; + +public class ContainerAdapter extends RecyclerView.Adapter { + + private List containerList; + private SelectListener listener; + + public ContainerAdapter(List containerList, SelectListener listener) { + this.containerList = containerList; + this.listener = listener; + } + + @NonNull + @Override + public ContainerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_container, parent, false); + return new ContainerViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ContainerViewHolder holder, int position) { + ContainerWorkflow container = containerList.get(position); + holder.containerId.setText(container.getContainerNo()); + holder.destination.setText(container.getDestination()); + holder.itemView.setOnClickListener(v -> listener.onItemClicked(container)); + } + + @Override + public int getItemCount() { + return containerList.size(); + } + + public interface OnContainerClickListener { + void onContainerClick(Container container); + } + + public static class ContainerViewHolder extends RecyclerView.ViewHolder { + TextView containerId, destination; + + public ContainerViewHolder(@NonNull View itemView) { + super(itemView); + containerId = itemView.findViewById(R.id.container_id); + destination = itemView.findViewById(R.id.container_destination); + } + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiService.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiService.java new file mode 100644 index 0000000..cf49e8a --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiService.java @@ -0,0 +1,35 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice; + +import com.utopiaindustries.selftrucking.models.Container; +import com.utopiaindustries.selftrucking.models.DriverResponse; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; +import retrofit2.http.Query; + +public interface ApiService { + @GET("rest/uic/inspection-report") + Call> fetchAllReports( + @Query("username") String username + ); + + @GET("rest/application/authenticate-user") + Call isUserAuthenticated( + @Query("username") String username, + @Query("password") String password + ); + + /* + * @POST("rest/authentication/authenticate-user") + Call isUserAuthenticated( + @Query("username") String username, + @Query("password") String password, + @Query("roles") String[] roles + ); + * */ +} + + diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiServiceFactory.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiServiceFactory.java new file mode 100644 index 0000000..4d2d710 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiServiceFactory.java @@ -0,0 +1,25 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice; + +import retrofit2.Retrofit; + +public class ApiServiceFactory { + + private static ApiService apiService; + private static MotiveApiService motiveApiService; + + public synchronized static ApiService getApiService() { + if ( apiService == null ) { + Retrofit retrofit = RetrofitClient.getClient(); + apiService = retrofit.create( ApiService.class ); + } + return apiService; + } + + public synchronized static MotiveApiService getMotiveApiService() { + if ( motiveApiService == null ) { + Retrofit retrofit = MotiveClient.getClient(); + motiveApiService = retrofit.create( MotiveApiService.class ); + } + return motiveApiService; + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveApiService.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveApiService.java new file mode 100644 index 0000000..eda1fc2 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveApiService.java @@ -0,0 +1,14 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice; + +import com.utopiaindustries.selftrucking.models.Container; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; + +public interface MotiveApiService { + @GET("api/v1/drivers/{driverId}/location") + Call> getDriverLocation(@Path("driverId") String driverId); +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveClient.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveClient.java new file mode 100644 index 0000000..4ebba92 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveClient.java @@ -0,0 +1,34 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class MotiveClient { + + private final static String BASE_URL = "https://api.gomotive.com/"; + + private static Retrofit retrofit; + + public synchronized static Retrofit getClient() { + + Gson gson = new GsonBuilder() + //.registerTypeAdapter(Boolean.class, new BooleanTypeAdapter()) + .create(); + + if (retrofit == null) { + try { + retrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + //.client( SSLCheckHttpClient.getOkHttpClient() ) + .addConverterFactory(GsonConverterFactory.create(gson)) + .build(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return retrofit; + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/RetrofitClient.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/RetrofitClient.java new file mode 100644 index 0000000..938a136 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/RetrofitClient.java @@ -0,0 +1,34 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class RetrofitClient { + + private final static String BASE_URL = "http://192.168.90.228:8080/cosmos/";//"http://192.168.90.27:8080/uind/"; + + private static Retrofit retrofit; + + public synchronized static Retrofit getClient() { + + Gson gson = new GsonBuilder() + //.registerTypeAdapter(Boolean.class, new BooleanTypeAdapter()) + .create(); + + if (retrofit == null) { + try { + retrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + //.client( SSLCheckHttpClient.getOkHttpClient() ) + .addConverterFactory(GsonConverterFactory.create(gson)) + .build(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return retrofit; + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/interfaces/SelectListener.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/interfaces/SelectListener.java new file mode 100644 index 0000000..c941cc6 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/interfaces/SelectListener.java @@ -0,0 +1,9 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.interfaces; + +import com.utopiaindustries.selftrucking.models.Container; +import com.utopiaindustries.selftrucking.models.ContainerWorkflow; + +public interface SelectListener { + + void onItemClicked(ContainerWorkflow container); +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginActivity.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginActivity.java new file mode 100644 index 0000000..2b8d470 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginActivity.java @@ -0,0 +1,107 @@ +package com.utopiaindustries.selftrucking.Activities.loginScreens; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.lifecycle.ViewModelProvider; + +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.HomeActivity; +import com.utopiaindustries.selftrucking.R; +import com.utopiaindustries.selftrucking.helper.Helper; +import com.utopiaindustries.selftrucking.helper.Preference; + +public class LoginActivity extends AppCompatActivity { + + EditText tfEmail, tfPassword; + Button btnLogin; + LoginViewModel loginViewModel; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_login); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + initializeLayouts(); + + btnLogin.setOnClickListener(v -> { + if (isValidate()) { + loginViewModel.authenticateUser(tfEmail.getText().toString(), tfPassword.getText().toString()); + } + }); + + // Observe the user LiveData for a successful login + loginViewModel.getUser().observe(this, user -> { + if (user != null) { + // Handle successful login (e.g., navigate to another activity) + Preference.setMyBooleanPref(Helper.project_file, "isLoggedIn", getApplicationContext(), true); + Log.e("User-Details: ",""+user.toString()); + Toast.makeText(this, "Welcome " + user.getTruckerName(), Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(this, HomeActivity.class); + intent.putExtra("driverResponse", user.toString()); + startActivity(intent); + } + }); + + // Observe the error LiveData for failed login + loginViewModel.getError().observe(this, error -> { + if (error != null) { + Toast.makeText(this, error, Toast.LENGTH_SHORT).show(); + } + }); + } + + private void initializeLayouts() { + tfEmail = findViewById(R.id.tf_email); + tfPassword = findViewById(R.id.tf_password); + btnLogin = findViewById(R.id.btn_login); + + tfEmail.setText("muhammad.mujtaba"); + tfPassword.setText("Utopia01"); + + loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class); + + } + + public boolean isValidate() { + boolean returnValue = true; + String message = ""; + + if (tfPassword.getText().toString().isEmpty()) { + message = "Please enter password."; + returnValue = false; + } + + /*if (!Helper.isValidEmail(tfEmail.getText().toString())) { + message = "Please enter valid email."; + returnValue = false; + }*/ + + if (tfEmail.getText().toString().isEmpty()) { + message = "Please enter email."; + returnValue = false; + } + + if (!returnValue) { + Toast.makeText(this,message,Toast.LENGTH_SHORT).show(); + + } + + return returnValue; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginViewModel.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginViewModel.java new file mode 100644 index 0000000..b13da0b --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginViewModel.java @@ -0,0 +1,68 @@ +package com.utopiaindustries.selftrucking.Activities.loginScreens; + +import android.text.TextUtils; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiService; +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiServiceFactory; +import com.utopiaindustries.selftrucking.helper.Helper; +import com.utopiaindustries.selftrucking.models.Container; +import com.utopiaindustries.selftrucking.models.DriverResponse; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class LoginViewModel extends ViewModel { + + private final MutableLiveData userLiveData = new MutableLiveData<>(); + private final MutableLiveData errorLiveData = new MutableLiveData<>(); + + // private MutableLiveData driverResponse; + private ApiService apiService; + + public LoginViewModel() { + //driverResponse = new MutableLiveData<>(); + apiService = ApiServiceFactory.getApiService(); + } + + public void authenticateUser(String user, String password) { + + apiService.isUserAuthenticated(user, password).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + userLiveData.setValue(response.body()); + } else { + errorLiveData.setValue(response.message()); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + errorLiveData.setValue(t.getMessage()); + } + }); + } + + public LiveData getUser() { + return userLiveData; + } + + public LiveData getError() { + return errorLiveData; + } + + /*public LiveData getIsValid() { + return isValid; + }*/ + + /*public LiveData getErrorMessage() { + return errorMessage; + }*/ +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/SplashActivity.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/SplashActivity.java new file mode 100644 index 0000000..7332b63 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/SplashActivity.java @@ -0,0 +1,66 @@ +package com.utopiaindustries.selftrucking.Activities.loginScreens; + +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.view.View; +import android.widget.TextView; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.HomeActivity; +import com.utopiaindustries.selftrucking.R; + +public class SplashActivity extends AppCompatActivity { + + private final int TIMER = 1200; + boolean isLoggedIn = false; + TextView txtVersion; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_splash); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + setTheme(R.style.Base_Theme_SelfTruckingApp); + setContentView(R.layout.activity_splash); + + //hideStatusBar(); + txtVersion = findViewById(R.id.txt_version); + txtVersion.setText(getResources().getString(R.string.app_version)); + + //Preference.setMyStringPref(Helper.project_file,"IsRating",this,"False"); + + //isLoggedIn = Preference.getMyBooleanPref(Helper.project_file,"isLoggedIn",getApplicationContext()); + + new Handler().postDelayed(new Runnable() { + public void run() { + + if (isLoggedIn) { + Intent myIntent = new Intent(SplashActivity.this, HomeActivity.class); + startActivity(myIntent); + overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); + finish(); + } + else{ + Intent myIntent = new Intent(SplashActivity.this, LoginActivity.class); + startActivity(myIntent); + overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); + finish(); + } + + } + }, TIMER); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/helper/Helper.java b/app/src/main/java/com/utopiaindustries/selftrucking/helper/Helper.java new file mode 100644 index 0000000..e2b7155 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/helper/Helper.java @@ -0,0 +1,12 @@ +package com.utopiaindustries.selftrucking.helper; + +import android.text.TextUtils; + +public class Helper { + + public static final String project_file = "Self-Trucking"; + + public static boolean isValidEmail(CharSequence target) { + return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches(); + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/helper/Preference.java b/app/src/main/java/com/utopiaindustries/selftrucking/helper/Preference.java new file mode 100644 index 0000000..9514c3e --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/helper/Preference.java @@ -0,0 +1,73 @@ +package com.utopiaindustries.selftrucking.helper; + +import android.content.Context; +import android.content.SharedPreferences; + +public class Preference { + + private static final int PREFERENCE_MODE_PRIVATE = 0; + private static String MY_STRING_PREF = "mystringpref"; + public static String LOGIN_FILE = "login_prefs"; + public static String TEMP_FILE = "temp_prefs"; + + + public static String KEY_PIN_CODE = "pin_code"; + + public static String KEY_CUSTOMER_ID = "cus_id"; + public static String KEY_CUSTOMER_NAME = "cus_name"; + + public static String KEY_USER_IS_MASTER = "user_is_master"; + + public static SharedPreferences getPrefs(String nameOfFile, Context context) { + + return context.getSharedPreferences(nameOfFile, Context.MODE_PRIVATE); + } + + public static String getMyStringPref(String fileName, String key, Context context) { + + return getPrefs(fileName,context).getString(key, "default"); + } + public static boolean getMyBooleanPref(String fileName, String key, Context context) { + + return getPrefs(fileName,context).getBoolean(key,false); + } + public static int getMyIntPref(String fileName, String key, Context context) { + + return getPrefs(fileName,context).getInt(key, 0); + } + + public static long getMyLongPref(String fileName, String key, Context context) { + + return getPrefs(fileName,context).getLong(key, 0); + } + + public static void setMyLongPref(String fileName, String key, Context context, long value) { + // perform validation etc.. + getPrefs(fileName,context).edit().putLong(key, value).apply(); + } + + public static void setMyStringPref(String fileName, String key, Context context, String value) { + // perform validation etc.. + getPrefs(fileName,context).edit().putString(key, value).apply(); + } + + public static void setMyBooleanPref(String fileName, String key, Context context, boolean value) { + // perform validation etc.. + getPrefs(fileName,context).edit().putBoolean(key, value).apply(); + } + + public static void setMyIntPref(String fileName, String key, Context context, int value) { + // perform validation etc.. + getPrefs(fileName,context).edit().putInt(key, value).apply(); + } + + + public static void remove(String fileName, String key, Context context) { + // perform validation etc.. + getPrefs(fileName,context).edit().remove(key).apply(); + } + public static void removeAll(String fileName, Context context) { + // perform validation etc.. + getPrefs(fileName,context).edit().clear().apply(); + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/models/Container.java b/app/src/main/java/com/utopiaindustries/selftrucking/models/Container.java new file mode 100644 index 0000000..d0ba170 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/models/Container.java @@ -0,0 +1,58 @@ +package com.utopiaindustries.selftrucking.models; + +public class Container { + + private String containerId; + private String destination; + private String status; // e.g., "Assigned", "Picked Up", "In Transit", "Delivered", "Returned" + private String assignedDriverId; + private String returnTicketUrl; + + public Container(String containerId, String destination, String status, String assignedDriverId, String returnTicketUrl) { + this.containerId = containerId; + this.destination = destination; + this.status = status; + this.assignedDriverId = assignedDriverId; + this.returnTicketUrl = returnTicketUrl; + } + + public String getContainerId() { + return containerId; + } + + public void setContainerId(String containerId) { + this.containerId = containerId; + } + + public String getDestination() { + return destination; + } + + public void setDestination(String destination) { + this.destination = destination; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getAssignedDriverId() { + return assignedDriverId; + } + + public void setAssignedDriverId(String assignedDriverId) { + this.assignedDriverId = assignedDriverId; + } + + public String getReturnTicketUrl() { + return returnTicketUrl; + } + + public void setReturnTicketUrl(String returnTicketUrl) { + this.returnTicketUrl = returnTicketUrl; + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/models/ContainerWorkflow.java b/app/src/main/java/com/utopiaindustries/selftrucking/models/ContainerWorkflow.java index 76f87c9..1aa5608 100644 --- a/app/src/main/java/com/utopiaindustries/selftrucking/models/ContainerWorkflow.java +++ b/app/src/main/java/com/utopiaindustries/selftrucking/models/ContainerWorkflow.java @@ -1,12 +1,10 @@ package com.utopiaindustries.selftrucking.models; -import javax.annotation.Generated; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; -@Generated("jsonschema2pojo") -public class ContainerWorkflowDatum { +public class ContainerWorkflow { @SerializedName("containerNo") @Expose diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/models/DriverResponse.java b/app/src/main/java/com/utopiaindustries/selftrucking/models/DriverResponse.java index 2152219..3397fbf 100644 --- a/app/src/main/java/com/utopiaindustries/selftrucking/models/DriverResponse.java +++ b/app/src/main/java/com/utopiaindustries/selftrucking/models/DriverResponse.java @@ -2,19 +2,17 @@ package com.utopiaindustries.selftrucking.models; import java.util.List; -import javax.annotation.Generated; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; -@Generated("jsonschema2pojo") -public class Example { +public class DriverResponse { @SerializedName("truckerName") @Expose private String truckerName; @SerializedName("containerWorkflowData") @Expose - private List containerWorkflowData; + private List containerWorkflowData; @SerializedName("message") @Expose private String message; @@ -30,11 +28,11 @@ public class Example { this.truckerName = truckerName; } - public List getContainerWorkflowData() { + public List getContainerWorkflowData() { return containerWorkflowData; } - public void setContainerWorkflowData(List containerWorkflowData) { + public void setContainerWorkflowData(List containerWorkflowData) { this.containerWorkflowData = containerWorkflowData; } diff --git a/app/src/main/res/anim/bs_list_layout_fade_in.xml b/app/src/main/res/anim/bs_list_layout_fade_in.xml new file mode 100644 index 0000000..f967280 --- /dev/null +++ b/app/src/main/res/anim/bs_list_layout_fade_in.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/anim/fade_in.xml b/app/src/main/res/anim/fade_in.xml new file mode 100644 index 0000000..e27221b --- /dev/null +++ b/app/src/main/res/anim/fade_in.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/fade_out.xml b/app/src/main/res/anim/fade_out.xml new file mode 100644 index 0000000..4ebd4e2 --- /dev/null +++ b/app/src/main/res/anim/fade_out.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/grow_from_bottom.xml b/app/src/main/res/anim/grow_from_bottom.xml new file mode 100644 index 0000000..be9e03a --- /dev/null +++ b/app/src/main/res/anim/grow_from_bottom.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/grow_from_top.xml b/app/src/main/res/anim/grow_from_top.xml new file mode 100644 index 0000000..16c36e8 --- /dev/null +++ b/app/src/main/res/anim/grow_from_top.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/popup_hide.xml b/app/src/main/res/anim/popup_hide.xml new file mode 100644 index 0000000..e311d4b --- /dev/null +++ b/app/src/main/res/anim/popup_hide.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/anim/popup_show.xml b/app/src/main/res/anim/popup_show.xml new file mode 100644 index 0000000..d90ef50 --- /dev/null +++ b/app/src/main/res/anim/popup_show.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/anim/slide_down.xml b/app/src/main/res/anim/slide_down.xml new file mode 100644 index 0000000..be798a9 --- /dev/null +++ b/app/src/main/res/anim/slide_down.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_bottom.xml b/app/src/main/res/anim/slide_in_bottom.xml new file mode 100644 index 0000000..ae4e011 --- /dev/null +++ b/app/src/main/res/anim/slide_in_bottom.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_left.xml b/app/src/main/res/anim/slide_in_left.xml new file mode 100644 index 0000000..44e6eb9 --- /dev/null +++ b/app/src/main/res/anim/slide_in_left.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_left_menu.xml b/app/src/main/res/anim/slide_in_left_menu.xml new file mode 100644 index 0000000..bc4f72c --- /dev/null +++ b/app/src/main/res/anim/slide_in_left_menu.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_right.xml b/app/src/main/res/anim/slide_in_right.xml new file mode 100644 index 0000000..740308b --- /dev/null +++ b/app/src/main/res/anim/slide_in_right.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_right_menu.xml b/app/src/main/res/anim/slide_in_right_menu.xml new file mode 100644 index 0000000..bb153b3 --- /dev/null +++ b/app/src/main/res/anim/slide_in_right_menu.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_top.xml b/app/src/main/res/anim/slide_in_top.xml new file mode 100644 index 0000000..a608380 --- /dev/null +++ b/app/src/main/res/anim/slide_in_top.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_bottom.xml b/app/src/main/res/anim/slide_out_bottom.xml new file mode 100644 index 0000000..46b3bf1 --- /dev/null +++ b/app/src/main/res/anim/slide_out_bottom.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/anim/slide_out_left.xml b/app/src/main/res/anim/slide_out_left.xml new file mode 100644 index 0000000..4db9289 --- /dev/null +++ b/app/src/main/res/anim/slide_out_left.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_right.xml b/app/src/main/res/anim/slide_out_right.xml new file mode 100644 index 0000000..73e7bfc --- /dev/null +++ b/app/src/main/res/anim/slide_out_right.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_top.xml b/app/src/main/res/anim/slide_out_top.xml new file mode 100644 index 0000000..6d813cd --- /dev/null +++ b/app/src/main/res/anim/slide_out_top.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_up.xml b/app/src/main/res/anim/slide_up.xml new file mode 100644 index 0000000..57f2be5 --- /dev/null +++ b/app/src/main/res/anim/slide_up.xml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_email.xml b/app/src/main/res/drawable/ic_email.xml new file mode 100644 index 0000000..4c104e9 --- /dev/null +++ b/app/src/main/res/drawable/ic_email.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_password.xml b/app/src/main/res/drawable/ic_password.xml new file mode 100644 index 0000000..1813549 --- /dev/null +++ b/app/src/main/res/drawable/ic_password.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/rounded_border.xml b/app/src/main/res/drawable/rounded_border.xml new file mode 100644 index 0000000..4ca7bc5 --- /dev/null +++ b/app/src/main/res/drawable/rounded_border.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rounded_btn_login.xml b/app/src/main/res/drawable/rounded_btn_login.xml new file mode 100644 index 0000000..0e174d6 --- /dev/null +++ b/app/src/main/res/drawable/rounded_btn_login.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/truck.png b/app/src/main/res/drawable/truck.png new file mode 100644 index 0000000..355d932 Binary files /dev/null and b/app/src/main/res/drawable/truck.png differ diff --git a/app/src/main/res/drawable/truck_map.png b/app/src/main/res/drawable/truck_map.png new file mode 100644 index 0000000..855cb58 Binary files /dev/null and b/app/src/main/res/drawable/truck_map.png differ diff --git a/app/src/main/res/drawable/wave.xml b/app/src/main/res/drawable/wave.xml new file mode 100644 index 0000000..543d16f --- /dev/null +++ b/app/src/main/res/drawable/wave.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_container_detail.xml b/app/src/main/res/layout/activity_container_detail.xml new file mode 100644 index 0000000..254a280 --- /dev/null +++ b/app/src/main/res/layout/activity_container_detail.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + +