diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser
index afed998..249a98f 100644
Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..61a9130
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 7ac24c7..9bba60d 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -1,8 +1,10 @@
+
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..a5f05cd
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index c0f68ed..cc51e58 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -25,7 +25,7 @@
-
+
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/README.md b/README.md
index 91eebea..cbe0d1a 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ In this demo, I have covered **Mediator Live data, Mutable live data, Observable
## Room and Retrofit using same Model
-I have used same models for Room and Retrofit2 library as both are configured using annotaions.
+I have used same models for Room and Retrofit2 library as both are configured using annotations.
```
@Entity
@@ -277,4 +277,4 @@ public class APIClient {
This is the overall project structure of this project.
-.png)
+.png)
diff --git a/app/build.gradle b/app/build.gradle
index 5f4af37..bc84e2d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,14 +1,14 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 28
+ compileSdkVersion 30
defaultConfig {
applicationId "com.marty.yummy"
- minSdkVersion 17
- targetSdkVersion 28
+ minSdkVersion 22
+ targetSdkVersion 30
versionCode 1
versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
vectorDrawables.useSupportLibrary = true
}
buildTypes {
@@ -21,28 +21,28 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation 'com.android.support:appcompat-v7:28.0.0'
- implementation 'com.android.support:design:28.0.0'
- implementation 'com.android.support.constraint:constraint-layout:1.1.3'
- implementation 'com.android.support:cardview-v7:28.0.0'
- implementation 'com.android.support:recyclerview-v7:28.0.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ implementation 'com.google.android.material:material:1.0.0'
+ implementation 'androidx.appcompat:appcompat:1.0.0'
+ implementation 'androidx.recyclerview:recyclerview:1.0.0'
+ implementation 'androidx.cardview:cardview:1.0.0'
//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
//room
- implementation "android.arch.persistence.room:runtime:1.1.1"
- annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
+ implementation 'androidx.room:room-runtime:2.0.0'
+ annotationProcessor 'androidx.room:room-compiler:2.0.0'
//live data and view modals
- implementation 'android.arch.lifecycle:livedata:1.1.1'
- implementation "android.arch.lifecycle:extensions:1.1.1"
+ implementation 'androidx.lifecycle:lifecycle-livedata:2.0.0'
+ implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
//Glide
implementation 'com.github.bumptech.glide:glide:4.6.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
testImplementation 'junit:junit:4.12'
- androidTestImplementation 'com.android.support.test:runner:1.0.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
testImplementation 'org.mockito:mockito-core:1.10.19'
- androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
}
diff --git a/app/src/androidTest/java/com/marty/yummy/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/marty/yummy/ExampleInstrumentedTest.java
index fed7de1..b0252cf 100644
--- a/app/src/androidTest/java/com/marty/yummy/ExampleInstrumentedTest.java
+++ b/app/src/androidTest/java/com/marty/yummy/ExampleInstrumentedTest.java
@@ -1,8 +1,8 @@
package com.marty.yummy;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index cd8b873..6b8924a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,6 +2,8 @@
+
+
> getFoodData();
}
diff --git a/app/src/main/java/com/marty/yummy/services/repository/FoodRepository.java b/app/src/main/java/com/marty/yummy/services/repository/FoodRepository.java
index 2b33b73..79f4fde 100644
--- a/app/src/main/java/com/marty/yummy/services/repository/FoodRepository.java
+++ b/app/src/main/java/com/marty/yummy/services/repository/FoodRepository.java
@@ -1,6 +1,6 @@
package com.marty.yummy.services.repository;
-import android.arch.lifecycle.MutableLiveData;
+import androidx.lifecycle.MutableLiveData;
import android.content.Context;
import android.util.Log;
@@ -17,13 +17,16 @@
import retrofit2.Callback;
import retrofit2.Response;
+//Singleton Repository instance.
public class FoodRepository {
private static FoodRepository instance;
private static final String TAG = "FoodRepository";
- private YummyAPIServices yummyAPIServices = APIClient.getClient().create(YummyAPIServices.class);
+ //API service for transactions over network.
+ private final YummyAPIServices yummyAPIServices = APIClient.getClient().create(YummyAPIServices.class);
+ //Method to get network response.
public MutableLiveData getFoodMenu(final Context context){
final MutableLiveData isFoodCallOngoing = new MutableLiveData<>();
@@ -48,6 +51,7 @@ public void onFailure(Call> call, Throwable t) {
return isFoodCallOngoing;
}
+ //Singleton implementation getInstance method.
public static FoodRepository getInstance() {
if(instance == null){
synchronized (FoodRepository.class){
@@ -59,6 +63,7 @@ public static FoodRepository getInstance() {
return instance;
}
+ //Populate the database.
public void updateCart(final AppDatabase db, FoodDetails foodDetails) {
new UpdateCart(db).execute(foodDetails);
}
diff --git a/app/src/main/java/com/marty/yummy/ui/CartActivity.java b/app/src/main/java/com/marty/yummy/ui/CartActivity.java
index d9184ac..36c3e27 100644
--- a/app/src/main/java/com/marty/yummy/ui/CartActivity.java
+++ b/app/src/main/java/com/marty/yummy/ui/CartActivity.java
@@ -1,22 +1,24 @@
package com.marty.yummy.ui;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.AppCompatButton;
+import androidx.appcompat.widget.AppCompatImageView;
+import androidx.lifecycle.Observer;
+import androidx.lifecycle.ViewModelProviders;
+
+import android.annotation.SuppressLint;
import android.graphics.Paint;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.design.widget.TextInputEditText;
-import android.support.design.widget.TextInputLayout;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.AppCompatButton;
-import android.support.v7.widget.AppCompatImageView;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
+import com.google.android.material.textfield.TextInputEditText;
+import com.google.android.material.textfield.TextInputLayout;
import com.marty.yummy.R;
import com.marty.yummy.model.CartItem;
import com.marty.yummy.ui.adapters.CartListAdapter;
@@ -116,21 +118,22 @@ public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
});
}
+ @SuppressLint("SetTextI18n")
private void updateUI(Double grandTotal) {
tItemsCost.setText(getString(R.string.rupee_symbol)+" "+cartViewModel.getTotalCost());
- tGrandTotal.setText(getString(R.string.rupee_symbol)+" "+String.valueOf(grandTotal));
+ tGrandTotal.setText(getString(R.string.rupee_symbol)+" "+ grandTotal);
if(cartViewModel.getDiscountAmt()>0){
hDiscount.setVisibility(View.VISIBLE);
tDiscount.setVisibility(View.VISIBLE);
hDiscount.setText(getString(R.string.discount)+" ( 20% )");
- tDiscount.setText(" - "+getString(R.string.rupee_symbol)+" "+String.valueOf(cartViewModel.getDiscountAmt()));
+ tDiscount.setText(" - "+getString(R.string.rupee_symbol)+" "+ cartViewModel.getDiscountAmt());
}else{
hDiscount.setVisibility(View.GONE);
tDiscount.setVisibility(View.GONE);
}
if(cartViewModel.getDeliveryCost()>0){
hDelivery.setText(getString(R.string.delivery_charges));
- tDelivery.setText(" + "+getString(R.string.rupee_symbol)+" "+String.valueOf(cartViewModel.getDeliveryCost()));
+ tDelivery.setText(" + "+getString(R.string.rupee_symbol)+" "+ cartViewModel.getDeliveryCost());
tDelivery.setPaintFlags(0);
}else{
hDelivery.setText(getString(R.string.delivery_charges)+" ( Free )");
diff --git a/app/src/main/java/com/marty/yummy/ui/HomeScreenActivity.java b/app/src/main/java/com/marty/yummy/ui/HomeScreenActivity.java
index 32eb2b0..2c58f20 100644
--- a/app/src/main/java/com/marty/yummy/ui/HomeScreenActivity.java
+++ b/app/src/main/java/com/marty/yummy/ui/HomeScreenActivity.java
@@ -1,17 +1,20 @@
package com.marty.yummy.ui;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.AppCompatButton;
+import androidx.appcompat.widget.PopupMenu;
+import androidx.appcompat.widget.Toolbar;
+import androidx.lifecycle.Observer;
+import androidx.lifecycle.ViewModelProviders;
+
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.AppCompatButton;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.PopupMenu;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.Toolbar;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
@@ -26,6 +29,7 @@
import com.marty.yummy.R;
import com.marty.yummy.model.CartItem;
import com.marty.yummy.model.FoodDetails;
+import com.marty.yummy.network.NetworkConnection;
import com.marty.yummy.ui.adapters.FoodListAdapter;
import com.marty.yummy.utility.ObservableObject;
import com.marty.yummy.viewmodel.FoodViewModel;
@@ -34,8 +38,6 @@
import java.util.List;
import java.util.Observable;
-
-
public class HomeScreenActivity extends AppCompatActivity implements java.util.Observer, PopupMenu.OnMenuItemClickListener {
FoodViewModel foodViewModel;
@@ -45,7 +47,6 @@ public class HomeScreenActivity extends AppCompatActivity implements java.util.O
RecyclerView foodList;
FoodListAdapter foodListAdapter;
AppCompatButton bCart;
- LayoutAnimationController controller;
ImageView infoImage;
TextView tInfo,tTotalCost,tCartQuantity;
Toolbar cartView;
@@ -63,6 +64,7 @@ protected void onCreate(Bundle savedInstanceState) {
toolbar.setTitle(R.string.app_name);
setSupportActionBar(toolbar);
+ //Setting up the view model.
foodViewModel = ViewModelProviders.of(this).get(FoodViewModel.class);
foodList = findViewById(R.id.food_list);
tInfo = findViewById(R.id.t_loading);
@@ -80,9 +82,23 @@ public void onClick(View view) {
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
foodList.setLayoutManager(mLayoutManager);
foodListAdapter = new FoodListAdapter(new ArrayList());
- controller = AnimationUtils.loadLayoutAnimation(foodList.getContext(), R.anim.layout_slide_from_bottom);
foodList.setAdapter(foodListAdapter);
foodList.scheduleLayoutAnimation();
+
+ //Calling checkInternetConnectivity method.
+ checkInternetConnectivity();
+ }
+
+ //Check for the network connections.
+ private void checkInternetConnectivity() {
+ boolean networkAvailable = NetworkConnection.isConnected(this);
+
+ if (!networkAvailable) {
+ tInfo.setText(R.string.no_internet_connection);
+ tInfo.setTextSize(20f);
+ } else {
+ tInfo.setTextSize(14f);
+ }
}
@Override
@@ -153,17 +169,18 @@ public boolean onMenuItemClick(MenuItem menuItem) {
return false;
}
+ @SuppressLint("SetTextI18n")
private void updateCartUI(List cartItems) {
if(cartItems!=null && cartItems.size()>0){
cartView.setVisibility(View.VISIBLE);
- Double cost = 0.0;
+ double cost = 0.0;
int quantity = 0;
for(CartItem cartItem:cartItems){
cost = cost+(cartItem.getPrice()*cartItem.getQuantity());
quantity = quantity+cartItem.getQuantity();
}
tCartQuantity.setText(String.valueOf(quantity));
- tTotalCost.setText(getString(R.string.rupee_symbol)+String.valueOf(cost));
+ tTotalCost.setText(getString(R.string.rupee_symbol)+ cost);
}else{
cartView.setVisibility(View.GONE);
tCartQuantity.setText("0");
diff --git a/app/src/main/java/com/marty/yummy/ui/IndividualActivity.java b/app/src/main/java/com/marty/yummy/ui/IndividualActivity.java
index 129be09..f67adc0 100644
--- a/app/src/main/java/com/marty/yummy/ui/IndividualActivity.java
+++ b/app/src/main/java/com/marty/yummy/ui/IndividualActivity.java
@@ -1,24 +1,27 @@
package com.marty.yummy.ui;
-import android.arch.lifecycle.Observer;
-import android.arch.lifecycle.ViewModelProviders;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.AppCompatButton;
+import androidx.appcompat.widget.AppCompatImageView;
+import androidx.appcompat.widget.Toolbar;
+import androidx.lifecycle.Observer;
+import androidx.lifecycle.ViewModelProviders;
+
+import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.AppCompatButton;
-import android.support.v7.widget.AppCompatImageView;
-import android.support.v7.widget.Toolbar;
+import androidx.annotation.Nullable;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
+import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
+import com.bumptech.glide.request.RequestOptions;
import com.marty.yummy.R;
import com.marty.yummy.model.CartItem;
import com.marty.yummy.model.FoodDetails;
-import com.marty.yummy.utility.GlideApp;
import com.marty.yummy.viewmodel.FoodDetailViewModel;
import java.util.List;
@@ -91,20 +94,24 @@ public boolean onOptionsItemSelected(MenuItem item) {
return true;
}*/
+ @SuppressLint({"CheckResult", "SetTextI18n"})
private void updateUI(FoodDetails foodDetails) {
+ RequestOptions requestOptions = new RequestOptions();
+ requestOptions.placeholder(R.drawable.ic_food);
duplicateFoodDetails = foodDetails;
if(foodDetails==null){
return;
}
tName.setText(foodDetails.getName());
- tCost.setText(getString(R.string.rupee_symbol) + String.valueOf(foodDetails.getPrice()));
- GlideApp.with(this).load(foodDetails.getImageUrl())
+ tCost.setText(getString(R.string.rupee_symbol) + foodDetails.getPrice());
+ Glide.with(this).load(foodDetails.getImageUrl())
.transition(DrawableTransitionOptions.withCrossFade())
- .placeholder(R.drawable.ic_food)
+ .apply(requestOptions)
.into(iFoodImage);
tQuantity.setText(String.valueOf(foodDetails.getQuantity()));
}
+ @SuppressLint("NonConstantResourceId")
@Override
public void onClick(View view) {
int id = view.getId();
@@ -128,17 +135,18 @@ public void onClick(View view) {
}
}
+ @SuppressLint("SetTextI18n")
private void updateCartUI(List cartItems) {
if(cartItems!=null && cartItems.size()>0){
cartView.setVisibility(View.VISIBLE);
- Double cost = 0.0;
+ double cost = 0.0;
int quantity = 0;
for(CartItem cartItem:cartItems){
cost = cost+(cartItem.getPrice()*cartItem.getQuantity());
quantity = quantity+cartItem.getQuantity();
}
tCartQuantity.setText(String.valueOf(quantity));
- tTotalCost.setText(getString(R.string.rupee_symbol)+String.valueOf(cost));
+ tTotalCost.setText(getString(R.string.rupee_symbol)+ cost);
}else{
cartView.setVisibility(View.GONE);
tCartQuantity.setText("0");
diff --git a/app/src/main/java/com/marty/yummy/ui/RatingTextView.java b/app/src/main/java/com/marty/yummy/ui/RatingTextView.java
index a7e4ffa..d0888a2 100644
--- a/app/src/main/java/com/marty/yummy/ui/RatingTextView.java
+++ b/app/src/main/java/com/marty/yummy/ui/RatingTextView.java
@@ -1,11 +1,13 @@
package com.marty.yummy.ui;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
-import android.support.v4.content.ContextCompat;
-import android.support.v7.widget.AppCompatTextView;
+
+import androidx.appcompat.widget.AppCompatTextView;
+import androidx.core.content.ContextCompat;
import android.util.AttributeSet;
import com.marty.yummy.R;
@@ -45,9 +47,10 @@ private void setUpRateStar() {
setCompoundDrawablesRelativeWithIntrinsicBounds(null,null, starImage,null);
}
+ @SuppressLint("SetTextI18n")
private void drawRating() {
setTextColor(getResources().getColor(R.color.white));
- setText(" "+String.valueOf(rating));
+ setText(" "+ rating);
setGravity(CENTER);
setPadding(8,8,8,8);
if(rating>=4){
diff --git a/app/src/main/java/com/marty/yummy/ui/adapters/CartListAdapter.java b/app/src/main/java/com/marty/yummy/ui/adapters/CartListAdapter.java
index 0dfb207..0679b18 100644
--- a/app/src/main/java/com/marty/yummy/ui/adapters/CartListAdapter.java
+++ b/app/src/main/java/com/marty/yummy/ui/adapters/CartListAdapter.java
@@ -2,9 +2,9 @@
import android.annotation.SuppressLint;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.AppCompatImageView;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.NonNull;
+import androidx.appcompat.widget.AppCompatImageView;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -17,30 +17,36 @@
import java.util.ArrayList;
import java.util.List;
+//Adapter for the recyclerview showing foods saved to cart.
public class CartListAdapter extends RecyclerView.Adapter {
private List cartList;
- private CartViewModel cartViewModel;
+ private final CartViewModel cartViewModel;
+ //Parameterized constructor taking the cart item list.
public CartListAdapter(ArrayList cartItems, CartViewModel cartViewModel) {
this.cartList = cartItems;
this.cartViewModel = cartViewModel;
}
+ //Set data method to provide the cart item list.
public void setData(List data) {
this.cartList = data;
}
+ //ViewHolder class.
public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener {
- private AppCompatImageView iDelete;
- private TextView tName,tPrice,tTotalPrice,tQuantity;
+ private final TextView tName;
+ private final TextView tPrice;
+ private final TextView tTotalPrice;
+ private final TextView tQuantity;
RecyclerViewHolders(View itemView) {
super(itemView);
- iDelete = itemView.findViewById(R.id.i_delete);
+ AppCompatImageView iDelete = itemView.findViewById(R.id.i_delete);
tName = itemView.findViewById(R.id.t_name);
tPrice = itemView.findViewById(R.id.t_price);
tTotalPrice = itemView.findViewById(R.id.t_total_price);
@@ -48,6 +54,7 @@ public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View
iDelete.setOnClickListener(this);
}
+ //Deleting a cart item.
@Override
public void onClick(View view) {
if(view.getId()==R.id.i_delete){
@@ -56,6 +63,7 @@ public void onClick(View view) {
}
}
+ //Create/recycle a view to be added to the recycler view.
@NonNull
@Override
public RecyclerViewHolders onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -64,13 +72,15 @@ public RecyclerViewHolders onCreateViewHolder(@NonNull ViewGroup parent, int vie
return new RecyclerViewHolders(layoutView);
}
+ //Populating fields of the views.
+ @SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull final RecyclerViewHolders holder, int position) {
CartItem cartItem = cartList.get(holder.getAdapterPosition());
holder.tName.setText(cartItem.getName());
holder.tPrice.setText("₹ "+cartItem.getPrice());
holder.tQuantity.setText(String.valueOf(cartItem.getQuantity()));
- holder.tTotalPrice.setText("₹ "+String.valueOf(cartItem.getQuantity()*cartItem.getPrice()));
+ holder.tTotalPrice.setText("₹ "+ cartItem.getQuantity() * cartItem.getPrice());
}
diff --git a/app/src/main/java/com/marty/yummy/ui/adapters/FoodListAdapter.java b/app/src/main/java/com/marty/yummy/ui/adapters/FoodListAdapter.java
index c9812e4..f05c99f 100644
--- a/app/src/main/java/com/marty/yummy/ui/adapters/FoodListAdapter.java
+++ b/app/src/main/java/com/marty/yummy/ui/adapters/FoodListAdapter.java
@@ -3,9 +3,9 @@
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Handler;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.AppCompatImageView;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.NonNull;
+import androidx.appcompat.widget.AppCompatImageView;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -13,40 +13,45 @@
import android.widget.RelativeLayout;
import android.widget.TextView;
+import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
+import com.bumptech.glide.request.RequestOptions;
import com.marty.yummy.R;
import com.marty.yummy.dbutilities.AppDatabase;
import com.marty.yummy.model.FoodDetails;
import com.marty.yummy.ui.IndividualActivity;
import com.marty.yummy.ui.RatingTextView;
-import com.marty.yummy.utility.GlideApp;
import com.marty.yummy.utility.ObservableObject;
import java.util.List;
import static com.marty.yummy.ui.HomeScreenActivity.INTENT_UPDATE_FOOD;
-
-public class FoodListAdapter extends RecyclerView.Adapter {
+//Adapter for the recyclerview showing food item to be displayed.
+public class FoodListAdapter extends RecyclerView.Adapter {
private List foodList;
- private Handler handler;
+ private final Handler handler;
+ //Parameterized constructor taking the cart item list.
public void setData(List data) {
this.foodList = data;
}
- public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener {
+ //ViewHolder class.
+ public class FoodItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
- private TextView tName,tPrice,tCount;
- private ImageView iFood;
- private AppCompatImageView iPlus,iMinus;
- private RelativeLayout foodCard;
- private RatingTextView tRating;
+ private final TextView tName;
+ private final TextView tPrice;
+ private final TextView tCount;
+ private final ImageView iFood;
+ private final AppCompatImageView iPlus;
+ private final AppCompatImageView iMinus;
+ private final RatingTextView tRating;
- RecyclerViewHolders(View itemView) {
+ FoodItemViewHolder(View itemView) {
super(itemView);
- foodCard = itemView.findViewById(R.id.food_card);
+ RelativeLayout foodCard = itemView.findViewById(R.id.food_card);
tName = foodCard.findViewById(R.id.t_food_name);
tPrice = foodCard.findViewById(R.id.t_price);
tCount = foodCard.findViewById(R.id.t_count);
@@ -73,22 +78,25 @@ private Intent getUpdateIntent(int position) {
i.putExtra("position",position);
return i;
}
-
+ //Parameterized constructor taking the food item list.
public FoodListAdapter(List listDetails) {
this.foodList = listDetails;
this.handler = new Handler();
}
+ //Create/recycle a view to be added to the recycler view.
@NonNull
@Override
- public RecyclerViewHolders onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ public FoodItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@SuppressLint("InflateParams") View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_food_item, null);
- return new RecyclerViewHolders(layoutView);
+ return new FoodItemViewHolder(layoutView);
}
+ //Populating fields of the views.
+ @SuppressLint("SetTextI18n")
@Override
- public void onBindViewHolder(@NonNull final RecyclerViewHolders holder, int position) {
+ public void onBindViewHolder(@NonNull final FoodItemViewHolder holder, int position) {
final FoodDetails foodDetails = foodList.get(holder.getAdapterPosition());
holder.tName.setText(foodDetails.getName());
holder.tPrice.setText("₹ " + foodDetails.getPrice());
@@ -116,11 +124,12 @@ public FoodDetails getItem(int position){
}
}
+ //LoadImage task to load food item image in the background.
private class LoadImage implements Runnable {
- ImageView imageView;
- TextView tCount;
- AppCompatImageView iPlus,iMinus;
- int position;
+ final ImageView imageView;
+ final TextView tCount;
+ final AppCompatImageView iPlus,iMinus;
+ final int position;
LoadImage(ImageView imageView, AppCompatImageView iMinus, AppCompatImageView iPlus, TextView tCount, int adapterPosition) {
this.imageView = imageView;
@@ -130,11 +139,14 @@ private class LoadImage implements Runnable {
this.position = adapterPosition;
}
+ @SuppressLint("CheckResult")
@Override
public void run() {
- GlideApp.with(imageView.getContext()).load(foodList.get(position).getImageUrl())
+ RequestOptions requestOptions = new RequestOptions();
+ requestOptions.placeholder(R.drawable.ic_food);
+ Glide.with(imageView.getContext()).load(foodList.get(position).getImageUrl())
.transition(DrawableTransitionOptions.withCrossFade())
- .placeholder(R.drawable.ic_food)
+ .apply(requestOptions)
.into(imageView);
int quantity = AppDatabase.getDatabase(imageView.getContext()).cartItemDao().getCartCount(foodList.get(position).getName());
foodList.get(position).setQuantity(quantity);
diff --git a/app/src/main/java/com/marty/yummy/utility/ObservableObject.java b/app/src/main/java/com/marty/yummy/utility/ObservableObject.java
index d845ca0..3482c39 100644
--- a/app/src/main/java/com/marty/yummy/utility/ObservableObject.java
+++ b/app/src/main/java/com/marty/yummy/utility/ObservableObject.java
@@ -3,7 +3,7 @@
import java.util.Observable;
public class ObservableObject extends Observable {
- private static ObservableObject instance = new ObservableObject();
+ private static final ObservableObject instance = new ObservableObject();
public static ObservableObject getInstance() {
return instance;
diff --git a/app/src/main/java/com/marty/yummy/viewmodel/CartViewModel.java b/app/src/main/java/com/marty/yummy/viewmodel/CartViewModel.java
index 38a4214..2775a02 100644
--- a/app/src/main/java/com/marty/yummy/viewmodel/CartViewModel.java
+++ b/app/src/main/java/com/marty/yummy/viewmodel/CartViewModel.java
@@ -1,14 +1,14 @@
package com.marty.yummy.viewmodel;
import android.app.Application;
-import android.arch.lifecycle.AndroidViewModel;
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.MediatorLiveData;
-import android.arch.lifecycle.MutableLiveData;
-import android.arch.lifecycle.Observer;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MediatorLiveData;
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.Observer;
import android.content.Intent;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import com.marty.yummy.dbutilities.AppDatabase;
import com.marty.yummy.model.CartItem;
@@ -22,10 +22,10 @@ public class CartViewModel extends AndroidViewModel {
private AppDatabase db;
private Double totalCost=0.0,discount=0.0,deliveryCost=0.0;
- private MutableLiveData grandTotal = new MutableLiveData<>();
- private MediatorLiveData> mediatorLiveData = new MediatorLiveData<>();
+ private final MutableLiveData grandTotal = new MutableLiveData<>();
+ private final MediatorLiveData> mediatorLiveData = new MediatorLiveData<>();
private String couponApplied="";
- private MutableLiveData errorString = new MutableLiveData<>();
+ private final MutableLiveData errorString = new MutableLiveData<>();
public CartViewModel(@NonNull Application application) {
super(application);
diff --git a/app/src/main/java/com/marty/yummy/viewmodel/FoodDetailViewModel.java b/app/src/main/java/com/marty/yummy/viewmodel/FoodDetailViewModel.java
index c695db7..698581d 100644
--- a/app/src/main/java/com/marty/yummy/viewmodel/FoodDetailViewModel.java
+++ b/app/src/main/java/com/marty/yummy/viewmodel/FoodDetailViewModel.java
@@ -1,9 +1,9 @@
package com.marty.yummy.viewmodel;
import android.app.Application;
-import android.arch.lifecycle.AndroidViewModel;
-import android.arch.lifecycle.LiveData;
-import android.support.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.annotation.NonNull;
import com.marty.yummy.dbutilities.AppDatabase;
import com.marty.yummy.model.CartItem;
diff --git a/app/src/main/java/com/marty/yummy/viewmodel/FoodViewModel.java b/app/src/main/java/com/marty/yummy/viewmodel/FoodViewModel.java
index a87cbc0..2a09122 100644
--- a/app/src/main/java/com/marty/yummy/viewmodel/FoodViewModel.java
+++ b/app/src/main/java/com/marty/yummy/viewmodel/FoodViewModel.java
@@ -1,13 +1,13 @@
package com.marty.yummy.viewmodel;
import android.app.Application;
-import android.arch.lifecycle.AndroidViewModel;
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.MediatorLiveData;
-import android.arch.lifecycle.MutableLiveData;
-import android.arch.lifecycle.Observer;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MediatorLiveData;
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.Observer;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import com.marty.yummy.dbutilities.AppDatabase;
import com.marty.yummy.model.CartItem;
@@ -23,7 +23,7 @@
public class FoodViewModel extends AndroidViewModel {
private AppDatabase db;
- private MediatorLiveData> foodDetailsMediatorLiveData = new MediatorLiveData<>();
+ private final MediatorLiveData> foodDetailsMediatorLiveData = new MediatorLiveData<>();
private LiveData> foodDetailsLiveDataSortPrice;
private LiveData> foodDetailsLiveDataSortRating;
private LiveData> cartItemsLiveData;
diff --git a/app/src/main/java/com/marty/yummy/worker/SaveFoodMenu.java b/app/src/main/java/com/marty/yummy/worker/SaveFoodMenu.java
index d9d7c0b..2cd76ca 100644
--- a/app/src/main/java/com/marty/yummy/worker/SaveFoodMenu.java
+++ b/app/src/main/java/com/marty/yummy/worker/SaveFoodMenu.java
@@ -8,10 +8,12 @@
import java.util.ArrayList;
import java.util.List;
+//Save food item to the database async task.
public class SaveFoodMenu extends AsyncTask {
- private AppDatabase db;
- private List foodDetails;
- public SaveFoodMenu(AppDatabase db,List foodDetails) {
+ private final AppDatabase db;
+ private final List foodDetails;
+ @SuppressWarnings("deprecation")
+ public SaveFoodMenu(AppDatabase db, List foodDetails) {
this.db = db;
this.foodDetails = foodDetails;
}
diff --git a/app/src/main/java/com/marty/yummy/worker/UpdateCart.java b/app/src/main/java/com/marty/yummy/worker/UpdateCart.java
index b9b3f6a..ed54405 100644
--- a/app/src/main/java/com/marty/yummy/worker/UpdateCart.java
+++ b/app/src/main/java/com/marty/yummy/worker/UpdateCart.java
@@ -6,8 +6,10 @@
import com.marty.yummy.model.CartItem;
import com.marty.yummy.model.FoodDetails;
+//Save food to the cart in database async task.
public class UpdateCart extends AsyncTask {
- private AppDatabase db;
+ private final AppDatabase db;
+ @SuppressWarnings("deprecation")
public UpdateCart(AppDatabase db) {
this.db = db;
}
diff --git a/app/src/main/res/layout/activity_cart.xml b/app/src/main/res/layout/activity_cart.xml
index 08a4ac5..08bd80d 100644
--- a/app/src/main/res/layout/activity_cart.xml
+++ b/app/src/main/res/layout/activity_cart.xml
@@ -7,7 +7,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white">
-
-
-
-
+
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_home_screen.xml b/app/src/main/res/layout/activity_home_screen.xml
index 2aa950c..67c1d97 100644
--- a/app/src/main/res/layout/activity_home_screen.xml
+++ b/app/src/main/res/layout/activity_home_screen.xml
@@ -1,5 +1,6 @@
-
-
-
-
+
-
-
-
-
-
+
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/cart_toolbar.xml b/app/src/main/res/layout/cart_toolbar.xml
index c977fe7..29c6213 100644
--- a/app/src/main/res/layout/cart_toolbar.xml
+++ b/app/src/main/res/layout/cart_toolbar.xml
@@ -1,5 +1,5 @@
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/launcher.xml b/app/src/main/res/layout/launcher.xml
index 6c4df13..6b6853b 100644
--- a/app/src/main/res/layout/launcher.xml
+++ b/app/src/main/res/layout/launcher.xml
@@ -1,6 +1,5 @@
-
diff --git a/app/src/main/res/layout/layout_cart_item.xml b/app/src/main/res/layout/layout_cart_item.xml
index de5fc29..69e9999 100644
--- a/app/src/main/res/layout/layout_cart_item.xml
+++ b/app/src/main/res/layout/layout_cart_item.xml
@@ -5,7 +5,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:padding="8dp">
-
-
+
-
-
-
-
-
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/actions.xml b/app/src/main/res/menu/actions.xml
index 4a896b7..deb9f27 100644
--- a/app/src/main/res/menu/actions.xml
+++ b/app/src/main/res/menu/actions.xml
@@ -1,7 +1,6 @@
Coupon
Your Cart
+ No Internet Connection!
diff --git a/build.gradle b/build.gradle
index 8d3ef8e..2deb66d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,7 +7,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.2.1'
+ classpath 'com.android.tools.build:gradle:4.0.1'
// NOTE: Do not place your application dependencies here; they belong
diff --git a/gradle.properties b/gradle.properties
index 743d692..8de5058 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -6,6 +6,8 @@
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
+android.enableJetifier=true
+android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 52b8b1a..e39e449 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
diff --git a/screenshots and demo/Screenshot (114).png b/screenshots and demo/Screenshot (114).png
deleted file mode 100644
index 130ade3..0000000
Binary files a/screenshots and demo/Screenshot (114).png and /dev/null differ
diff --git a/screenshots and demo/Screenshot (115).png b/screenshots and demo/Screenshot (115).png
new file mode 100644
index 0000000..3a51481
Binary files /dev/null and b/screenshots and demo/Screenshot (115).png differ