diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5edb4ee --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.iml +.gradle +/local.properties +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser new file mode 100644 index 0000000..2633a44 Binary files /dev/null and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..30aa626 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..7ac24c7 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..99202cc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..0a1b735 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,37 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "com.example.niket.swipelefttoremoverecyclerview" + minSdkVersion 22 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + implementation 'com.android.support:design:28.0.0' + implementation 'com.android.support:recyclerview-v7:28.0.0' + implementation 'com.android.support:appcompat-v7:28.0.0-alpha1' + // glide image library + implementation 'com.github.bumptech.glide:glide:3.7.0' + + // volley http library + implementation 'com.android.volley:volley:1.0.0' + implementation 'com.google.code.gson:gson:2.6.2' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/example/niket/swipelefttoremoverecyclerview/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/niket/swipelefttoremoverecyclerview/ExampleInstrumentedTest.java new file mode 100644 index 0000000..2e44689 --- /dev/null +++ b/app/src/androidTest/java/com/example/niket/swipelefttoremoverecyclerview/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.niket.swipelefttoremoverecyclerview; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.example.niket.swipelefttoremoverecyclerview", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..83f3aa4 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/CartListAdapter.java b/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/CartListAdapter.java new file mode 100644 index 0000000..571a3da --- /dev/null +++ b/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/CartListAdapter.java @@ -0,0 +1,80 @@ +package com.example.niket.swipelefttoremoverecyclerview; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; + +import java.util.List; + +public class CartListAdapter extends RecyclerView.Adapter { + private Context context; + private List cartList; + + public class MyViewHolder extends RecyclerView.ViewHolder { + public TextView name, description, price; + public ImageView thumbnail; + public RelativeLayout viewBackground, viewForeground; + + public MyViewHolder(View view) { + super(view); + name = view.findViewById(R.id.name); + description = view.findViewById(R.id.description); + price = view.findViewById(R.id.price); + thumbnail = view.findViewById(R.id.thumbnail); + viewBackground = view.findViewById(R.id.view_background); + viewForeground = view.findViewById(R.id.view_foreground); + } + } + + + public CartListAdapter(Context context, List cartList) { + this.context = context; + this.cartList = cartList; + } + + @Override + public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.cart_list_item, parent, false); + + return new MyViewHolder(itemView); + } + + @Override + public void onBindViewHolder(MyViewHolder holder, final int position) { + final Item item = cartList.get(position); + holder.name.setText(item.getName()); + holder.description.setText(item.getDescription()); + holder.price.setText("₹" + item.getPrice()); + + Glide.with(context) + .load(item.getThumbnail()) + .into(holder.thumbnail); + } + + @Override + public int getItemCount() { + return cartList.size(); + } + + public void removeItem(int position) { + cartList.remove(position); + // notify the item removed by position + // to perform recycler view delete animations + // NOTE: don't call notifyDataSetChanged() + notifyItemRemoved(position); + } + + public void restoreItem(Item item, int position) { + cartList.add(position, item); + // notify item added by position + notifyItemInserted(position); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/Item.java b/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/Item.java new file mode 100644 index 0000000..2a7411a --- /dev/null +++ b/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/Item.java @@ -0,0 +1,52 @@ +package com.example.niket.swipelefttoremoverecyclerview; + +public class Item { + int id; + String name; + String description; + double price; + String thumbnail; + + public Item() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + public String getThumbnail() { + return thumbnail; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } +} diff --git a/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/MainActivity.java b/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/MainActivity.java new file mode 100644 index 0000000..00b4048 --- /dev/null +++ b/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/MainActivity.java @@ -0,0 +1,140 @@ +package com.example.niket.swipelefttoremoverecyclerview; + +import android.graphics.Color; +import android.os.Bundle; +import android.support.constraint.ConstraintLayout; +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.DividerItemDecoration; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.support.v7.widget.helper.ItemTouchHelper; +import android.util.Log; +import android.view.Menu; +import android.view.View; +import android.widget.Toast; + +import com.android.volley.Response; +import com.android.volley.VolleyError; +import com.android.volley.toolbox.JsonArrayRequest; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONArray; + +import java.util.ArrayList; +import java.util.List; + +public class MainActivity extends AppCompatActivity implements RecyclerItemTouchHelper.RecyclerItemTouchHelperListener { + + private static final String TAG = MainActivity.class.getSimpleName(); + private RecyclerView recyclerView; + private List cartList; + private CartListAdapter mAdapter; + private ConstraintLayout coordinatorLayout; + + // url to fetch menu json + private static final String URL = "https://api.androidhive.info/json/menu.json"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + recyclerView = findViewById(R.id.recycler_view); + coordinatorLayout = findViewById(R.id.coordinator_layout); + cartList = new ArrayList<>(); + mAdapter = new CartListAdapter(this, cartList); + + RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); + recyclerView.setLayoutManager(mLayoutManager); + recyclerView.setItemAnimator(new DefaultItemAnimator()); + recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); + recyclerView.setAdapter(mAdapter); + + // adding item touch helper + // only ItemTouchHelper.LEFT added to detect Right to Left swipe + // if you want both Right -> Left and Left -> Right + // add pass ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT as param + ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT, this); + new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView); + + + // making http call and fetching menu json + prepareCart(); + } + + /** + * method make volley network call and parses json + */ + private void prepareCart() { + JsonArrayRequest request = new JsonArrayRequest(URL, + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { + if (response == null) { + Toast.makeText(getApplicationContext(), "Couldn't fetch the menu! Pleas try again.", Toast.LENGTH_LONG).show(); + return; + } + + List items = new Gson().fromJson(response.toString(), new TypeToken>() { + }.getType()); + + // adding items to cart list + cartList.clear(); + cartList.addAll(items); + + // refreshing recycler view + mAdapter.notifyDataSetChanged(); + } + }, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + // error in getting json + Log.d(TAG, "Error: " + error.getMessage()); + Toast.makeText(getApplicationContext(), "Error: " + error.getMessage(), Toast.LENGTH_SHORT).show(); + } + }); + + MyApplication.getInstance().addToRequestQueue(request); + } + + /** + * callback when recycler view is swiped + * item will be removed on swiped + * undo option will be provided in snackbar to restore the item + */ + @Override + public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position) { + if (viewHolder instanceof CartListAdapter.MyViewHolder) { + // get the removed item name to display it in snack bar + String name = cartList.get(viewHolder.getAdapterPosition()).getName(); + + // backup of removed item for undo purpose + final Item deletedItem = cartList.get(viewHolder.getAdapterPosition()); + final int deletedIndex = viewHolder.getAdapterPosition(); + + // remove the item from recycler view + mAdapter.removeItem(viewHolder.getAdapterPosition()); + + // showing snack bar with Undo option + Snackbar snackbar = Snackbar + .make(coordinatorLayout, name + " removed from cart!", Snackbar.LENGTH_LONG); + snackbar.setAction("UNDO", new View.OnClickListener() { + @Override + public void onClick(View view) { + + // undo is selected, restore the deleted item + mAdapter.restoreItem(deletedItem, deletedIndex); + } + }); + snackbar.setActionTextColor(Color.YELLOW); + snackbar.show(); + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/MyApplication.java b/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/MyApplication.java new file mode 100644 index 0000000..ae32859 --- /dev/null +++ b/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/MyApplication.java @@ -0,0 +1,53 @@ +package com.example.niket.swipelefttoremoverecyclerview; + +import android.app.Application; +import android.text.TextUtils; + +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.Volley; + +public class MyApplication extends Application { + + public static final String TAG = MyApplication.class + .getSimpleName(); + + private RequestQueue mRequestQueue; + + private static MyApplication mInstance; + + @Override + public void onCreate() { + super.onCreate(); + mInstance = this; + } + + public static synchronized MyApplication getInstance() { + return mInstance; + } + + public RequestQueue getRequestQueue() { + if (mRequestQueue == null) { + mRequestQueue = Volley.newRequestQueue(getApplicationContext()); + } + + return mRequestQueue; + } + + public void addToRequestQueue(Request req, String tag) { + // set the default tag if tag is empty + req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); + getRequestQueue().add(req); + } + + public void addToRequestQueue(Request req) { + req.setTag(TAG); + getRequestQueue().add(req); + } + + public void cancelPendingRequests(Object tag) { + if (mRequestQueue != null) { + mRequestQueue.cancelAll(tag); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/RecyclerItemTouchHelper.java b/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/RecyclerItemTouchHelper.java new file mode 100644 index 0000000..b349aa6 --- /dev/null +++ b/app/src/main/java/com/example/niket/swipelefttoremoverecyclerview/RecyclerItemTouchHelper.java @@ -0,0 +1,72 @@ +package com.example.niket.swipelefttoremoverecyclerview; + +import android.graphics.Canvas; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.helper.ItemTouchHelper; +import android.view.View; + +/** + * Created by ravi on 29/09/17. + */ + +public class RecyclerItemTouchHelper extends ItemTouchHelper.SimpleCallback { + private RecyclerItemTouchHelperListener listener; + + public RecyclerItemTouchHelper(int dragDirs, int swipeDirs, RecyclerItemTouchHelperListener listener) { + super(dragDirs, swipeDirs); + this.listener = listener; + } + + @Override + public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { + return true; + } + + @Override + public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { + if (viewHolder != null) { + final View foregroundView = ((CartListAdapter.MyViewHolder) viewHolder).viewForeground; + + getDefaultUIUtil().onSelected(foregroundView); + } + } + + @Override + public void onChildDrawOver(Canvas c, RecyclerView recyclerView, + RecyclerView.ViewHolder viewHolder, float dX, float dY, + int actionState, boolean isCurrentlyActive) { + final View foregroundView = ((CartListAdapter.MyViewHolder) viewHolder).viewForeground; + getDefaultUIUtil().onDrawOver(c, recyclerView, foregroundView, dX, dY, + actionState, isCurrentlyActive); + } + + @Override + public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { + final View foregroundView = ((CartListAdapter.MyViewHolder) viewHolder).viewForeground; + getDefaultUIUtil().clearView(foregroundView); + } + + @Override + public void onChildDraw(Canvas c, RecyclerView recyclerView, + RecyclerView.ViewHolder viewHolder, float dX, float dY, + int actionState, boolean isCurrentlyActive) { + final View foregroundView = ((CartListAdapter.MyViewHolder) viewHolder).viewForeground; + + getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY, + actionState, isCurrentlyActive); + } + + @Override + public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { + listener.onSwiped(viewHolder, direction, viewHolder.getAdapterPosition()); + } + + @Override + public int convertToAbsoluteDirection(int flags, int layoutDirection) { + return super.convertToAbsoluteDirection(flags, layoutDirection); + } + + public interface RecyclerItemTouchHelperListener { + void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..d5fccc5 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..6fe199f --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/cart_list_item.xml b/app/src/main/res/layout/cart_list_item.xml new file mode 100644 index 0000000..2e2ab47 --- /dev/null +++ b/app/src/main/res/layout/cart_list_item.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a2f5908 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..1b52399 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..ff10afd Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..115a4c7 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..dcd3cd8 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..459ca60 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..8ca12fe Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..8e19b41 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..b824ebd Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..4c19a13 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..e42d9e1 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,9 @@ + + + #111 + #FFF + #ea3732 + #fa315b + #535353 + #a9a9a9 + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..131b7ca --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,7 @@ + + + 16dp + 10dp + 30dp + 90dp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..45f021f --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,7 @@ + + SwipeLeftToRemoveRecyclerVIew + + Settings + My Cart + DELETE + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..048cf03 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,21 @@ + + + + + + + +