Add Login API

Add Pick Truck Load API
Add screens
master
saad.siddiq 2024-11-07 12:07:39 +05:00
parent 196aa969d6
commit a5fe014006
28 changed files with 664 additions and 132 deletions

View File

@ -4,7 +4,7 @@
<selectionStates> <selectionStates>
<SelectionState runConfigName="app"> <SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" /> <option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2024-11-05T12:50:05.084508100Z"> <DropdownSelection timestamp="2024-11-06T10:39:51.813244700Z">
<Target type="DEFAULT_BOOT"> <Target type="DEFAULT_BOOT">
<handle> <handle>
<DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\saad.siddiq\.android\avd\Pixel_3_API_35.avd" /> <DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\saad.siddiq\.android\avd\Pixel_3_API_35.avd" />

View File

@ -38,6 +38,7 @@ dependencies {
implementation libs.play.services.maps implementation libs.play.services.maps
implementation libs.retrofit implementation libs.retrofit
implementation libs.converter.gson implementation libs.converter.gson
implementation(libs.preference)
testImplementation libs.junit testImplementation libs.junit
androidTestImplementation libs.ext.junit androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core androidTestImplementation libs.espresso.core

View File

@ -9,9 +9,9 @@
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher" android:icon="@drawable/truck"
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@drawable/truck"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.SelfTruckingApp" android:theme="@style/Theme.SelfTruckingApp"
android:allowClearUserData="true" android:allowClearUserData="true"

View File

@ -1,7 +1,10 @@
package com.utopiaindustries.selftrucking.Activities.dashboardScreens; package com.utopiaindustries.selftrucking.Activities.dashboardScreens;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
@ -12,13 +15,24 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets; import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.ViewModelProvider;
import com.utopiaindustries.selftrucking.Activities.dashboardScreens.viewModels.HomeViewModel;
import com.utopiaindustries.selftrucking.R; import com.utopiaindustries.selftrucking.R;
import com.utopiaindustries.selftrucking.models.ContainerWorkflow;
import com.utopiaindustries.selftrucking.models.PickResponse;
import com.utopiaindustries.selftrucking.models.PickupRequest;
import com.utopiaindustries.selftrucking.utils.ProgressDialogFragment;
public class ContainerDetailActivity extends AppCompatActivity { public class ContainerDetailActivity extends AppCompatActivity {
TextView containerDetailId, containerDestination, driverId, driverName; TextView container_no, container_origin, containerDestination, driverId, driverName;
Button btnMarkPicked; Button btnMarkPicked;
//FoodDetailObj singleList;
ContainerWorkflow containerWorkflow;
String truckerId = "";
String truckerName = "";
HomeViewModel homeViewModel;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -34,21 +48,76 @@ public class ContainerDetailActivity extends AppCompatActivity {
initializeLayout(); initializeLayout();
btnMarkPicked.setOnClickListener(v -> { btnMarkPicked.setOnClickListener(v -> {
PickupRequest request = new PickupRequest(containerWorkflow.getOriginId(),
containerWorkflow.getDestinationId(),
containerWorkflow.getContainerNo(),
50,
"USD",
Integer.parseInt(truckerId));
Log.e("Pick-Request: ", "" + request.toString());
homeViewModel.pickTruckLoad(request);
Toast.makeText(this, "Container marked as picked", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "Container marked as picked", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(ContainerDetailActivity.this, TrackingActivity.class); //Intent intent = new Intent(ContainerDetailActivity.this, TrackingActivity.class);
//intent.putExtra("container_id", container.getContainerId()); //intent.putExtra("container_id", container.getContainerId());
startActivity(intent); //startActivity(intent);
}); });
} }
public void initializeLayout() { public void initializeLayout() {
containerDetailId = findViewById(R.id.container_detail_id); container_no = findViewById(R.id.container_no);
container_origin = findViewById(R.id.container_origin);
containerDestination = findViewById(R.id.container_destination); containerDestination = findViewById(R.id.container_destination);
driverId = findViewById(R.id.driver_Id); driverId = findViewById(R.id.driver_Id);
driverName = findViewById(R.id.driver_name); driverName = findViewById(R.id.driver_name);
btnMarkPicked = findViewById(R.id.btn_mark_picked); btnMarkPicked = findViewById(R.id.btn_mark_picked);
homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class);
containerWorkflow = (ContainerWorkflow) getIntent().getSerializableExtra("SingleContainerInfo");
truckerId = getIntent().getStringExtra("TruckerId");
truckerName = getIntent().getStringExtra("TruckerName");
homeViewModel.getLoadingState().observe(this, isLoading -> {
if (isLoading != null && isLoading) {
showProgressDialog();
} else {
dismissProgressDialog();
}
});
homeViewModel.getPickLiveData().observe(this, pickResponse -> {
if (pickResponse != null) {
Log.d("API", "Message: " + pickResponse.getMessage());
Log.d("API", "Status: " + pickResponse.isStatus());
Toast.makeText(ContainerDetailActivity.this,pickResponse.getMessage(), Toast.LENGTH_SHORT).show();
}
});
setContainerDetail(containerWorkflow);
} }
private void setContainerDetail(ContainerWorkflow containerWorkflow) {
container_no.setText(Html.fromHtml("<b>Container No:</b> " + containerWorkflow.getContainerNo(), Html.FROM_HTML_MODE_LEGACY));
container_origin.setText(Html.fromHtml("<b>Container Origin:</b> " + containerWorkflow.getOrigin(), Html.FROM_HTML_MODE_LEGACY));
containerDestination.setText(Html.fromHtml("<b>Container Destination:</b> " + containerWorkflow.getDestination(), Html.FROM_HTML_MODE_LEGACY));
driverId.setText(Html.fromHtml("<b>Driver Id:</b> " + truckerId, Html.FROM_HTML_MODE_LEGACY));
driverName.setText(Html.fromHtml("<b>Driver Name:</b> " + truckerName, Html.FROM_HTML_MODE_LEGACY));
}
public void showProgressDialog() {
ProgressDialogFragment progressDialog = new ProgressDialogFragment();
progressDialog.setCancelable(false);
progressDialog.show(getSupportFragmentManager(), "progressDialog");
}
public void dismissProgressDialog() {
ProgressDialogFragment progressDialog = (ProgressDialogFragment) getSupportFragmentManager().findFragmentByTag("progressDialog");
if (progressDialog != null) {
progressDialog.dismiss();
}
}
} }

View File

@ -1,10 +1,20 @@
package com.utopiaindustries.selftrucking.Activities.dashboardScreens; package com.utopiaindustries.selftrucking.Activities.dashboardScreens;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.activity.EdgeToEdge; import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets; import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
@ -18,11 +28,16 @@ import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.
import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiServiceFactory; import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiServiceFactory;
import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.MotiveApiService; import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.MotiveApiService;
import com.utopiaindustries.selftrucking.Activities.dashboardScreens.interfaces.SelectListener; import com.utopiaindustries.selftrucking.Activities.dashboardScreens.interfaces.SelectListener;
import com.utopiaindustries.selftrucking.Activities.dashboardScreens.viewModels.HomeViewModel;
import com.utopiaindustries.selftrucking.Activities.loginScreens.LoginActivity;
import com.utopiaindustries.selftrucking.helper.Helper;
import com.utopiaindustries.selftrucking.helper.Preference;
import com.utopiaindustries.selftrucking.models.Container; import com.utopiaindustries.selftrucking.models.Container;
import com.utopiaindustries.selftrucking.R; import com.utopiaindustries.selftrucking.R;
import com.utopiaindustries.selftrucking.models.ContainerWorkflow; import com.utopiaindustries.selftrucking.models.ContainerWorkflow;
import com.utopiaindustries.selftrucking.models.DriverResponse; import com.utopiaindustries.selftrucking.models.DriverResponse;
import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -42,6 +57,8 @@ public class HomeActivity extends AppCompatActivity implements SelectListener {
ApiService apiService; ApiService apiService;
MotiveApiService motiveApiService; MotiveApiService motiveApiService;
DriverResponse driverResponse; DriverResponse driverResponse;
TextView txtDriverName;
ImageView imgLogout;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -64,6 +81,13 @@ public class HomeActivity extends AppCompatActivity implements SelectListener {
} }
});*/ });*/
imgLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alertLogOut(HomeActivity.this);
}
});
} }
@ -73,13 +97,15 @@ public class HomeActivity extends AppCompatActivity implements SelectListener {
containerRecyclerView.setLayoutManager(new LinearLayoutManager(this)); containerRecyclerView.setLayoutManager(new LinearLayoutManager(this));
apiService = ApiServiceFactory.getApiService(); apiService = ApiServiceFactory.getApiService();
motiveApiService = ApiServiceFactory.getMotiveApiService(); motiveApiService = ApiServiceFactory.getMotiveApiService();
txtDriverName = findViewById(R.id.txt_driver_name);
imgLogout = findViewById(R.id.img_logout);
driverResponse = Helper.getPreferenceObjectJson(this, "DriverResponse");
driverResponse = (DriverResponse) getIntent().getSerializableExtra("driverResponse");
assert driverResponse != null; assert driverResponse != null;
containerList.addAll(driverResponse.getContainerWorkflowData()); containerList.addAll(driverResponse.getContainerWorkflowData());
//dummyData(); //dummyData();
txtDriverName.setText(Html.fromHtml("Welcome: " + driverResponse.getTruckerName(), Html.FROM_HTML_MODE_LEGACY));
adapter = new ContainerAdapter(containerList, this); adapter = new ContainerAdapter(containerList, this);
containerRecyclerView.setAdapter(adapter); containerRecyclerView.setAdapter(adapter);
@ -94,8 +120,11 @@ public class HomeActivity extends AppCompatActivity implements SelectListener {
Toast.makeText(this, String.valueOf(container.getContainerNo()), Toast.LENGTH_SHORT).show(); Toast.makeText(this, String.valueOf(container.getContainerNo()), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(HomeActivity.this, ContainerDetailActivity.class); Intent intent = new Intent(HomeActivity.this, ContainerDetailActivity.class);
intent.putExtra("container_id", container.getContainerNo()); intent.putExtra("TruckerId", driverResponse.getTruckerId().toString());
intent.putExtra("TruckerName", driverResponse.getTruckerName());
intent.putExtra("SingleContainerInfo", (Serializable) container);
startActivity(intent); startActivity(intent);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
} }
@ -150,4 +179,51 @@ public class HomeActivity extends AppCompatActivity implements SelectListener {
} }
}); });
} }
public void alertLogOut(Context con) {
ViewGroup viewGroup = findViewById(android.R.id.content);
TextView dialogOkBtn, dialogCancelBtn;
AlertDialog.Builder builder = new AlertDialog.Builder(con);
View view1 = LayoutInflater.from(con).inflate(R.layout.custom_layout_for_logout, viewGroup, false);
builder.setCancelable(false);
builder.setView(view1);
dialogOkBtn = view1.findViewById(R.id.dialogOkBtn);
dialogCancelBtn = view1.findViewById(R.id.dialogCancelBtn);
AlertDialog alertDialog = builder.create();
alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialogOkBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
//Toast.makeText(con, "Ok", Toast.LENGTH_SHORT).show();
Preference.setMyBooleanPref(Helper.project_file, "isLoggedIn", getApplicationContext(), false);
finish();
Intent i = new Intent(HomeActivity.this, LoginActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
}
});
dialogCancelBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
//Toast.makeText(con, "Cancel", Toast.LENGTH_SHORT).show();
}
});
alertDialog.show();
}
} }

View File

@ -1,8 +0,0 @@
package com.utopiaindustries.selftrucking.Activities.dashboardScreens;
import androidx.lifecycle.ViewModel;
public class HomeViewModel extends ViewModel {
}

View File

@ -1,5 +1,6 @@
package com.utopiaindustries.selftrucking.Activities.dashboardScreens.adapters; package com.utopiaindustries.selftrucking.Activities.dashboardScreens.adapters;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -35,9 +36,13 @@ public class ContainerAdapter extends RecyclerView.Adapter<ContainerAdapter.Cont
@Override @Override
public void onBindViewHolder(@NonNull ContainerViewHolder holder, int position) { public void onBindViewHolder(@NonNull ContainerViewHolder holder, int position) {
ContainerWorkflow container = containerList.get(position); ContainerWorkflow container = containerList.get(position);
holder.containerId.setText(container.getContainerNo());
holder.destination.setText(container.getDestination()); holder.container_no.setText(Html.fromHtml("<b>Container No:</b> " + container.getContainerNo(), Html.FROM_HTML_MODE_LEGACY));
holder.container_origin.setText(Html.fromHtml("<b>Container Origin:</b> " + container.getOrigin(), Html.FROM_HTML_MODE_LEGACY));
holder.container_destination.setText(Html.fromHtml("<b>Container Destination:</b> " + container.getDestination(), Html.FROM_HTML_MODE_LEGACY));
holder.itemView.setOnClickListener(v -> listener.onItemClicked(container)); holder.itemView.setOnClickListener(v -> listener.onItemClicked(container));
} }
@Override @Override
@ -45,17 +50,14 @@ public class ContainerAdapter extends RecyclerView.Adapter<ContainerAdapter.Cont
return containerList.size(); return containerList.size();
} }
public interface OnContainerClickListener {
void onContainerClick(Container container);
}
public static class ContainerViewHolder extends RecyclerView.ViewHolder { public static class ContainerViewHolder extends RecyclerView.ViewHolder {
TextView containerId, destination; TextView container_no, container_origin, container_destination;
public ContainerViewHolder(@NonNull View itemView) { public ContainerViewHolder(@NonNull View itemView) {
super(itemView); super(itemView);
containerId = itemView.findViewById(R.id.container_id); container_no = itemView.findViewById(R.id.container_no);
destination = itemView.findViewById(R.id.container_destination); container_origin = itemView.findViewById(R.id.container_origin);
container_destination = itemView.findViewById(R.id.container_destination);
} }
} }
} }

View File

@ -2,11 +2,15 @@ package com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice
import com.utopiaindustries.selftrucking.models.Container; import com.utopiaindustries.selftrucking.models.Container;
import com.utopiaindustries.selftrucking.models.DriverResponse; import com.utopiaindustries.selftrucking.models.DriverResponse;
import com.utopiaindustries.selftrucking.models.PickResponse;
import com.utopiaindustries.selftrucking.models.PickupRequest;
import java.util.List; import java.util.List;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET; import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path; import retrofit2.http.Path;
import retrofit2.http.Query; import retrofit2.http.Query;
@ -22,14 +26,11 @@ public interface ApiService {
@Query("password") String password @Query("password") String password
); );
/*
* @POST("rest/authentication/authenticate-user") @POST("rest/application/pick-truck-load")
Call<Boolean> isUserAuthenticated( Call<PickResponse> pickTruckLoad(
@Query("username") String username, @Body PickupRequest request
@Query("password") String password, );
@Query("roles") String[] roles
);
* */
} }

View File

@ -0,0 +1,74 @@
package com.utopiaindustries.selftrucking.Activities.dashboardScreens.viewModels;
import android.util.Log;
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.models.DriverResponse;
import com.utopiaindustries.selftrucking.models.PickResponse;
import com.utopiaindustries.selftrucking.models.PickupRequest;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class HomeViewModel extends ViewModel {
private ApiService apiService;
private MutableLiveData<String> errorLiveData;
private MutableLiveData<Boolean> isLoading;
private MutableLiveData<PickResponse> userLiveData;
public HomeViewModel() {
apiService = ApiServiceFactory.getApiService();
errorLiveData = new MutableLiveData<>();
isLoading = new MutableLiveData<>();
userLiveData = new MutableLiveData<>();
}
public LiveData<PickResponse> getPickLiveData() {
return userLiveData;
}
public LiveData<Boolean> getLoadingState() {
return isLoading;
}
public void pickTruckLoad(PickupRequest pickupRequest) {
isLoading.setValue(true);
apiService.pickTruckLoad(pickupRequest).enqueue(new Callback<PickResponse>() {
@Override
public void onResponse(Call<PickResponse> call, Response<PickResponse> response) {
isLoading.setValue(false);
if (response.isSuccessful()) {
Log.e("API_CALL", "Successfull.");
if (response.isSuccessful()) {
userLiveData.setValue(response.body());
} else {
errorLiveData.setValue(response.message());
}
} else {
// Handle the case where the server responds with an error
Log.e("API_CALL", "Error: " + response.code());
errorLiveData.setValue(response.message());
}
}
@Override
public void onFailure(Call<PickResponse> call, Throwable t) {
// Handle the failure
Log.e("API_CALL", "Failed", t);
isLoading.setValue(false);
errorLiveData.setValue(t.getMessage());
}
});
}
}

View File

@ -2,8 +2,6 @@ package com.utopiaindustries.selftrucking.Activities.loginScreens;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast; import android.widget.Toast;
@ -16,15 +14,20 @@ import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import com.utopiaindustries.selftrucking.Activities.dashboardScreens.HomeActivity; import com.utopiaindustries.selftrucking.Activities.dashboardScreens.HomeActivity;
import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiService;
import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiServiceFactory;
import com.utopiaindustries.selftrucking.Activities.loginScreens.viewModels.LoginViewModel;
import com.utopiaindustries.selftrucking.R; import com.utopiaindustries.selftrucking.R;
import com.utopiaindustries.selftrucking.helper.Helper; import com.utopiaindustries.selftrucking.helper.Helper;
import com.utopiaindustries.selftrucking.helper.Preference; import com.utopiaindustries.selftrucking.helper.Preference;
import com.utopiaindustries.selftrucking.utils.ProgressDialogFragment;
public class LoginActivity extends AppCompatActivity { public class LoginActivity extends AppCompatActivity {
EditText tfEmail, tfPassword; EditText tfEmail, tfPassword;
Button btnLogin; Button btnLogin;
LoginViewModel loginViewModel; LoginViewModel loginViewModel;
ApiService apiService;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -45,37 +48,41 @@ public class LoginActivity extends AppCompatActivity {
} }
}); });
// 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() { private void initializeLayouts() {
tfEmail = findViewById(R.id.tf_email); tfEmail = findViewById(R.id.tf_email);
tfPassword = findViewById(R.id.tf_password); tfPassword = findViewById(R.id.tf_password);
btnLogin = findViewById(R.id.btn_login); btnLogin = findViewById(R.id.btn_login);
apiService = ApiServiceFactory.getApiService();
tfEmail.setText("muhammad.mujtaba"); tfEmail.setText("muhammad.mujtaba");
tfPassword.setText("Utopia01"); tfPassword.setText("Utopia01");
loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class); loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class);
loginViewModel.getLoadingState().observe(this, isLoading -> {
if (isLoading != null && isLoading) {
showProgressDialog();
} else {
dismissProgressDialog();
}
});
loginViewModel.getUserLiveData().observe(this, user -> {
if (user != null) {
Preference.setMyBooleanPref(Helper.project_file, "isLoggedIn", getApplicationContext(), true);
Helper.setPreferenceObject(getApplicationContext(), user, "DriverResponse");
Toast.makeText(this, "Welcome " + user.getTruckerName(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, HomeActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
finish();
} else {
Toast.makeText(this, "Login Failed", Toast.LENGTH_SHORT).show();
}
});
} }
public boolean isValidate() { public boolean isValidate() {
@ -98,10 +105,22 @@ public class LoginActivity extends AppCompatActivity {
} }
if (!returnValue) { if (!returnValue) {
Toast.makeText(this,message,Toast.LENGTH_SHORT).show(); Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
} }
return returnValue; return returnValue;
} }
public void showProgressDialog() {
ProgressDialogFragment progressDialog = new ProgressDialogFragment();
progressDialog.setCancelable(false);
progressDialog.show(getSupportFragmentManager(), "progressDialog");
}
public void dismissProgressDialog() {
ProgressDialogFragment progressDialog = (ProgressDialogFragment) getSupportFragmentManager().findFragmentByTag("progressDialog");
if (progressDialog != null) {
progressDialog.dismiss();
}
}
} }

View File

@ -1,10 +1,8 @@
package com.utopiaindustries.selftrucking.Activities.loginScreens; package com.utopiaindustries.selftrucking.Activities.loginScreens;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import androidx.activity.EdgeToEdge; import androidx.activity.EdgeToEdge;
@ -15,6 +13,8 @@ import androidx.core.view.WindowInsetsCompat;
import com.utopiaindustries.selftrucking.Activities.dashboardScreens.HomeActivity; import com.utopiaindustries.selftrucking.Activities.dashboardScreens.HomeActivity;
import com.utopiaindustries.selftrucking.R; import com.utopiaindustries.selftrucking.R;
import com.utopiaindustries.selftrucking.helper.Helper;
import com.utopiaindustries.selftrucking.helper.Preference;
public class SplashActivity extends AppCompatActivity { public class SplashActivity extends AppCompatActivity {
@ -36,13 +36,10 @@ public class SplashActivity extends AppCompatActivity {
setTheme(R.style.Base_Theme_SelfTruckingApp); setTheme(R.style.Base_Theme_SelfTruckingApp);
setContentView(R.layout.activity_splash); setContentView(R.layout.activity_splash);
//hideStatusBar();
txtVersion = findViewById(R.id.txt_version); txtVersion = findViewById(R.id.txt_version);
txtVersion.setText(getResources().getString(R.string.app_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());
//isLoggedIn = Preference.getMyBooleanPref(Helper.project_file,"isLoggedIn",getApplicationContext());
new Handler().postDelayed(new Runnable() { new Handler().postDelayed(new Runnable() {
public void run() { public void run() {
@ -52,14 +49,12 @@ public class SplashActivity extends AppCompatActivity {
startActivity(myIntent); startActivity(myIntent);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
finish(); finish();
} } else {
else{
Intent myIntent = new Intent(SplashActivity.this, LoginActivity.class); Intent myIntent = new Intent(SplashActivity.this, LoginActivity.class);
startActivity(myIntent); startActivity(myIntent);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
finish(); finish();
} }
} }
}, TIMER); }, TIMER);
} }

View File

@ -1,6 +1,4 @@
package com.utopiaindustries.selftrucking.Activities.loginScreens; package com.utopiaindustries.selftrucking.Activities.loginScreens.viewModels;
import android.text.TextUtils;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
@ -8,34 +6,41 @@ import androidx.lifecycle.ViewModel;
import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiService; import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiService;
import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiServiceFactory; 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 com.utopiaindustries.selftrucking.models.DriverResponse;
import java.util.List;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response; import retrofit2.Response;
public class LoginViewModel extends ViewModel { public class LoginViewModel extends ViewModel {
private final MutableLiveData<DriverResponse> userLiveData = new MutableLiveData<>(); private MutableLiveData<DriverResponse> userLiveData;
private final MutableLiveData<String> errorLiveData = new MutableLiveData<>(); private MutableLiveData<String> errorLiveData;
private MutableLiveData<Boolean> isLoading;
// private MutableLiveData<DriverResponse> driverResponse;
private ApiService apiService; private ApiService apiService;
public LoginViewModel() { public LoginViewModel() {
//driverResponse = new MutableLiveData<>();
apiService = ApiServiceFactory.getApiService(); apiService = ApiServiceFactory.getApiService();
userLiveData = new MutableLiveData<>();
errorLiveData = new MutableLiveData<>();
isLoading = new MutableLiveData<>();
}
public LiveData<DriverResponse> getUserLiveData() {
return userLiveData;
}
public LiveData<Boolean> getLoadingState() {
return isLoading;
} }
public void authenticateUser(String user, String password) { public void authenticateUser(String user, String password) {
isLoading.setValue(true);
apiService.isUserAuthenticated(user, password).enqueue(new Callback<DriverResponse>() { apiService.isUserAuthenticated(user, password).enqueue(new Callback<DriverResponse>() {
@Override @Override
public void onResponse(Call<DriverResponse> call, Response<DriverResponse> response) { public void onResponse(Call<DriverResponse> call, Response<DriverResponse> response) {
isLoading.setValue(false);
if (response.isSuccessful()) { if (response.isSuccessful()) {
userLiveData.setValue(response.body()); userLiveData.setValue(response.body());
} else { } else {
@ -45,6 +50,7 @@ public class LoginViewModel extends ViewModel {
@Override @Override
public void onFailure(Call<DriverResponse> call, Throwable t) { public void onFailure(Call<DriverResponse> call, Throwable t) {
isLoading.setValue(false);
errorLiveData.setValue(t.getMessage()); errorLiveData.setValue(t.getMessage());
} }
}); });
@ -57,12 +63,4 @@ public class LoginViewModel extends ViewModel {
public LiveData<String> getError() { public LiveData<String> getError() {
return errorLiveData; return errorLiveData;
} }
/*public LiveData<Boolean> getIsValid() {
return isValid;
}*/
/*public LiveData<String> getErrorMessage() {
return errorMessage;
}*/
} }

View File

@ -1,7 +1,14 @@
package com.utopiaindustries.selftrucking.helper; package com.utopiaindustries.selftrucking.helper;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.preference.PreferenceManager;
import com.google.gson.Gson;
import com.utopiaindustries.selftrucking.models.DriverResponse;
public class Helper { public class Helper {
public static final String project_file = "Self-Trucking"; public static final String project_file = "Self-Trucking";
@ -9,4 +16,26 @@ public class Helper {
public static boolean isValidEmail(CharSequence target) { public static boolean isValidEmail(CharSequence target) {
return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches(); return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
} }
static public void setPreferenceObject(Context c, Object modal, String key) {
SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(c.getApplicationContext());
SharedPreferences.Editor prefsEditor = appSharedPrefs.edit();
Gson gson = new Gson();
String jsonObject = gson.toJson(modal);
prefsEditor.putString(key, jsonObject);
prefsEditor.commit();
}
static public DriverResponse getPreferenceObjectJson(Context c, String key) {
SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(c.getApplicationContext());
String json = appSharedPrefs.getString(key, "");
Gson gson = new Gson();
DriverResponse selectedUser = gson.fromJson(json, DriverResponse.class);
return selectedUser;
}
} }

View File

@ -4,14 +4,22 @@ package com.utopiaindustries.selftrucking.models;
import com.google.gson.annotations.Expose; import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
public class ContainerWorkflow { import java.io.Serializable;
public class ContainerWorkflow implements Serializable {
@SerializedName("containerNo") @SerializedName("containerNo")
@Expose @Expose
private String containerNo; private String containerNo;
@SerializedName("originId")
@Expose
private Integer originId;
@SerializedName("origin") @SerializedName("origin")
@Expose @Expose
private String origin; private String origin;
@SerializedName("destinationId")
@Expose
private Integer destinationId;
@SerializedName("destination") @SerializedName("destination")
@Expose @Expose
private String destination; private String destination;
@ -40,4 +48,19 @@ public class ContainerWorkflow {
this.destination = destination; this.destination = destination;
} }
public Integer getOriginId() {
return originId;
}
public void setOriginId(Integer originId) {
this.originId = originId;
}
public Integer getDestinationId() {
return destinationId;
}
public void setDestinationId(Integer destinationId) {
this.destinationId = destinationId;
}
} }

View File

@ -6,7 +6,9 @@ import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
public class DriverResponse { public class DriverResponse {
@SerializedName("truckerId")
@Expose
private Integer truckerId;
@SerializedName("truckerName") @SerializedName("truckerName")
@Expose @Expose
private String truckerName; private String truckerName;
@ -52,4 +54,11 @@ public class DriverResponse {
this.status = status; this.status = status;
} }
public Integer getTruckerId() {
return truckerId;
}
public void setTruckerId(Integer truckerId) {
this.truckerId = truckerId;
}
} }

View File

@ -0,0 +1,24 @@
package com.utopiaindustries.selftrucking.models;
public class PickResponse {
private String message;
private boolean status;
// Getters and setters
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
}

View File

@ -0,0 +1,33 @@
package com.utopiaindustries.selftrucking.models;
public class PickupRequest {
private int pickupLocation;
private int dropoffLocation;
private String loadTypeId;
private double agreedAmount;
private String agreedAmountCurrency;
private int assignedToDriver;
public PickupRequest(int pickupLocation, int dropoffLocation, String loadTypeId,
double agreedAmount, String agreedAmountCurrency, int assignedToDriver) {
this.pickupLocation = pickupLocation;
this.dropoffLocation = dropoffLocation;
this.loadTypeId = loadTypeId;
this.agreedAmount = agreedAmount;
this.agreedAmountCurrency = agreedAmountCurrency;
this.assignedToDriver = assignedToDriver;
}
@Override
public String toString() {
return "PickupRequest{" +
"pickupLocation=" + pickupLocation +
", dropoffLocation=" + dropoffLocation +
", loadTypeId='" + loadTypeId + '\'' +
", agreedAmount=" + agreedAmount +
", agreedAmountCurrency='" + agreedAmountCurrency + '\'' +
", assignedToDriver=" + assignedToDriver +
'}';
}
}

View File

@ -0,0 +1,37 @@
package com.utopiaindustries.selftrucking.utils;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import com.utopiaindustries.selftrucking.R;
public class ProgressDialogFragment extends DialogFragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_progress, container, false);
}
@Override
public void onStart() {
super.onStart();
if (getDialog() != null && getDialog().getWindow() != null) {
getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);
}
}
@Override
public void onCancel(@NonNull DialogInterface dialog) {
// Prevent the dialog from being canceled when touched outside
setCancelable(false);
}
}

View File

@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M17,7l-1.41,1.41L18.17,11H8v2h10.17l-2.58,2.58L17,17l5,-5zM4,5h8V3H4c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h8v-2H4V5z"/>
</vector>

View File

@ -4,5 +4,5 @@
android:shape="rectangle"> android:shape="rectangle">
<solid android:color="@color/grey_50" /> <solid android:color="@color/grey_50" />
<corners android:radius="0dp" /> <corners android:radius="0dp" />
<stroke android:color="@color/black" android:width="0.5dp" /> <stroke android:color="@color/black" android:width="0.1dp" />
</shape> </shape>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white" />
<stroke
android:width="2dp"
android:color="@color/white" />
<corners android:radius="10dp" />
<padding
android:bottom="0dp"
android:left="0dp"
android:right="0dp"
android:top="0dp" />
</shape>

View File

@ -41,20 +41,6 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar2"> app:layout_constraintTop_toBottomOf="@+id/toolbar2">
<TextView
android:id="@+id/container_detail_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="Container ID: 1234" />
<TextView
android:id="@+id/container_destination"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="Destination: Warehouse" />
<TextView <TextView
android:id="@+id/driver_Id" android:id="@+id/driver_Id"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -69,6 +55,29 @@
android:padding="5dp" android:padding="5dp"
android:text="Driver Name: John Doe" /> android:text="Driver Name: John Doe" />
<TextView
android:id="@+id/container_no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="Container ID: 1234" />
<TextView
android:id="@+id/container_origin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="Origin: Warehouse" />
<TextView
android:id="@+id/container_destination"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="Destination: Warehouse" />
<Button <Button
android:id="@+id/btn_mark_picked" android:id="@+id/btn_mark_picked"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@ -22,7 +22,7 @@
android:id="@+id/textView" android:id="@+id/textView"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Home Screen" android:text="Assigned Containers"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="@dimen/_15sdp" android:textSize="@dimen/_15sdp"
app:layout_constraintBottom_toBottomOf="@+id/toolbar" app:layout_constraintBottom_toBottomOf="@+id/toolbar"
@ -31,11 +31,11 @@
app:layout_constraintTop_toTopOf="@+id/toolbar" /> app:layout_constraintTop_toTopOf="@+id/toolbar" />
<TextView <TextView
android:id="@+id/textView2" android:id="@+id/txt_driver_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="@dimen/_16sdp" android:textSize="@dimen/_14sdp"
android:text="Assigned Container" android:text="Welcome"
android:padding="5dp" android:padding="5dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@ -50,7 +50,17 @@
android:layout_marginEnd="1dp" android:layout_marginEnd="1dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" /> app:layout_constraintTop_toBottomOf="@+id/txt_driver_name" />
<ImageView
android:id="@+id/img_logout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
app:layout_constraintBottom_toBottomOf="@+id/toolbar"
app:layout_constraintEnd_toEndOf="@+id/toolbar"
app:layout_constraintTop_toTopOf="@+id/toolbar"
app:srcCompat="@drawable/ic_logout" />
<!--<com.google.android.material.textfield.TextInputLayout <!--<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"

View File

@ -49,7 +49,7 @@
android:drawableStart="@drawable/ic_email" android:drawableStart="@drawable/ic_email"
android:drawablePadding="5dp" android:drawablePadding="5dp"
android:drawableTint="@color/grey_700" android:drawableTint="@color/grey_700"
android:hint="Email" android:hint="User"
android:inputType="textEmailAddress" /> android:inputType="textEmailAddress" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>

View File

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="@drawable/rounded_white"
android:orientation="vertical"
android:paddingTop="15dp">
<TextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="15dp"
android:layout_marginBottom="15dp"
android:gravity="center_horizontal"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:text="Are you sure you want to sign out?"
android:textAllCaps="false"
android:textColor="@color/black"
android:textSize="15sp"
android:textStyle="normal" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginTop="7dp"
android:background="@color/grey_400" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="3">
<TextView
android:id="@+id/dialogCancelBtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.495"
android:gravity="center"
android:paddingTop="15dp"
android:paddingBottom="15dp"
android:text="No"
android:textAllCaps="false"
android:textColor="@color/theme_color"
android:textSize="16sp"
android:textStyle="normal" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.009"
android:background="@color/grey_400"
android:paddingTop="15dp"
android:paddingBottom="15dp" />
<TextView
android:id="@+id/dialogOkBtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.495"
android:gravity="center"
android:paddingTop="15dp"
android:paddingBottom="15dp"
android:text="Yes"
android:textAllCaps="false"
android:textColor="@color/theme_color"
android:textSize="16sp"
android:textStyle="normal" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,14 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#80000000"> <!-- Semi-transparent dark background -->
<!-- Blur effect can be enhanced by using drawable with blur effect-->
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:indeterminate="true" />
</RelativeLayout>

View File

@ -1,27 +1,39 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:layout_margin="5dp"
android:weightSum="1" app:cardBackgroundColor="@color/grey_50"
android:background="@drawable/rounded_border" app:cardPreventCornerOverlap="true"
android:layout_margin="2dp" app:cardUseCompatPadding="true">
android:padding="8dp">
<TextView <RelativeLayout
android:id="@+id/container_id" android:layout_width="match_parent"
android:layout_width="0dp" android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:layout_weight="0.1"
android:padding="5dp"
android:text="Container ID"/>
<TextView <TextView
android:id="@+id/container_destination" android:id="@+id/container_no"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="0.9" android:padding="5dp"
android:padding="5dp" android:text="Container ID" />
android:text="Destination"/>
<TextView
android:id="@+id/container_origin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/container_no"
android:padding="5dp"
android:text="Origin" />
<TextView
android:id="@+id/container_destination"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/container_origin"
android:padding="5dp"
android:text="Destination" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>

View File

@ -8,6 +8,7 @@ material = "1.12.0"
activity = "1.9.2" activity = "1.9.2"
constraintlayout = "2.1.4" constraintlayout = "2.1.4"
playServicesMaps = "19.0.0" playServicesMaps = "19.0.0"
preference = "1.2.1"
recyclerview = "1.3.2" recyclerview = "1.3.2"
retrofit = "2.9.0" retrofit = "2.9.0"
@ -21,6 +22,7 @@ material = { group = "com.google.android.material", name = "material", version.r
activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
play-services-maps = { module = "com.google.android.gms:play-services-maps", version.ref = "playServicesMaps" } play-services-maps = { module = "com.google.android.gms:play-services-maps", version.ref = "playServicesMaps" }
preference = { module = "androidx.preference:preference", version.ref = "preference" }
recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" } recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" }
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }