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. -![Project Structure](https://github.com/martinraj/MVVM-architecture-lifecycle-components-and-Room-database-project/blob/master/screenshots%20and%20demo/Screenshot%20(114).png) +![Project Structure](https://github.com/AyushGupta0202/Food-ordering-app-like-swiggy-uber-eats-MVVM-and-Room-database-/blob/issue-4/screenshots%20and%20demo/Screenshot%20(115).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 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> Bill Details 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