From 292d2d506c484814890e0953c59e56e0594e188f Mon Sep 17 00:00:00 2001 From: ArunKBabu Date: Fri, 11 May 2018 15:50:20 +0530 Subject: [PATCH 1/5] Cities Fragment Implementation --- .../ui/StatesWithCities/CityData.java | 25 +++ .../MajorCitiesSliderAdapter.java | 64 +++++++ .../StatesWithCities/SmallCitiesAdapter.java | 58 ++++++ .../StatesWithCitiesActivity.java | 51 +++++- .../StatesWithCitiesFragment.java | 171 ++++++++++++++++++ .../exploreindia/ui/home/HomeActivity.java | 9 +- .../layout/activity_states_with_cities.xml | 15 +- .../res/layout/cardview_location_layout.xml | 4 +- .../layout/fragment_states_with_cities.xml | 66 +++++++ .../layout/states_with_cities_bottom_item.xml | 43 +++++ .../layout/states_with_cities_top_item.xml | 44 +++++ app/src/main/res/values/colors.xml | 5 + local.properties | 4 +- 13 files changed, 547 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/CityData.java create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/MajorCitiesSliderAdapter.java create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/SmallCitiesAdapter.java create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java create mode 100644 app/src/main/res/layout/fragment_states_with_cities.xml create mode 100644 app/src/main/res/layout/states_with_cities_bottom_item.xml create mode 100644 app/src/main/res/layout/states_with_cities_top_item.xml diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/CityData.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/CityData.java new file mode 100644 index 0000000..68d0adc --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/CityData.java @@ -0,0 +1,25 @@ +package com.udacity.exploreindia.ui.StatesWithCities; + +// TODO: This class can be deleted after linking with real data + +/** + * Used for saving the dummy data for StatesWithCitiesScreen + */ +public class CityData +{ + private int mImageId; + private String mPlaceName; + + public CityData(int imageResourceId, String placeName) { + mImageId = imageResourceId; + mPlaceName = placeName; + } + + public int getImageResourceId() { + return mImageId; + } + + public String getPlaceName() { + return mPlaceName; + } +} diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/MajorCitiesSliderAdapter.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/MajorCitiesSliderAdapter.java new file mode 100644 index 0000000..e694747 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/MajorCitiesSliderAdapter.java @@ -0,0 +1,64 @@ +package com.udacity.exploreindia.ui.StatesWithCities; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v4.view.PagerAdapter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.squareup.picasso.Picasso; +import com.udacity.exploreindia.R; + +import java.util.ArrayList; + +public class MajorCitiesSliderAdapter extends PagerAdapter +{ + private Context mContext; + private ArrayList mMajorCitiesData; + + public MajorCitiesSliderAdapter (Context context, ArrayList majorCitiesData) { + mContext = context; + mMajorCitiesData = majorCitiesData; + } + + @Override + public int getCount() { + return mMajorCitiesData.size(); + } + + @Override + public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { + return view == object; + } + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int position) { + View view = LayoutInflater.from(mContext).inflate(R.layout.states_with_cities_top_item, container, false); + + ImageView cityImage = view.findViewById(R.id.iv_city_photo); + TextView cityName = view.findViewById(R.id.tv_city_name); + + CityData cityData = mMajorCitiesData.get(position); + + Picasso.with(mContext) + .load(cityData.getImageResourceId()) + .placeholder(R.drawable.ic_search) // TODO: Set the placeholder image if no image loaded + .error(R.drawable.ic_add_box) // TODO: Set the error image in-case load fails + .into(cityImage); + + cityName.setText(cityData.getPlaceName()); + + container.addView(view); + + return view; + } + + @Override + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + container.removeView((View) object); + } +} diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/SmallCitiesAdapter.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/SmallCitiesAdapter.java new file mode 100644 index 0000000..0065261 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/SmallCitiesAdapter.java @@ -0,0 +1,58 @@ +package com.udacity.exploreindia.ui.StatesWithCities; + +import android.support.annotation.NonNull; +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.TextView; + +import com.udacity.exploreindia.R; + +import java.util.ArrayList; + +public class SmallCitiesAdapter extends RecyclerView.Adapter +{ + private ArrayList mSmallCitiesData; + + public SmallCitiesAdapter(ArrayList smallCitiesData) { + mSmallCitiesData = smallCitiesData; + } + + @NonNull + @Override + public SmallCitiesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.states_with_cities_top_item, parent, false); + return new SmallCitiesViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull SmallCitiesViewHolder holder, int position) { + CityData cityData = mSmallCitiesData.get(position); + + holder.smallCityImageView.setImageResource(cityData.getImageResourceId()); + holder.smallCityTextView.setText(cityData.getPlaceName()); + } + + @Override + public int getItemCount() { + return mSmallCitiesData.size(); + } + + + /** + * Recycler view adapter requires a ViewHolder. So it's created as an inner class + */ + class SmallCitiesViewHolder extends RecyclerView.ViewHolder + { + private ImageView smallCityImageView; + private TextView smallCityTextView; + + public SmallCitiesViewHolder(View itemView) { + super(itemView); + this.smallCityImageView = itemView.findViewById(R.id.iv_small_city_photo); + this.smallCityTextView = itemView.findViewById(R.id.tv_small_city_name); + } + } +} diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesActivity.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesActivity.java index a650e89..c501cc0 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesActivity.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesActivity.java @@ -1,19 +1,36 @@ package com.udacity.exploreindia.ui.StatesWithCities; import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; import com.udacity.exploreindia.R; import com.udacity.exploreindia.base.BaseActivity; import com.udacity.exploreindia.databinding.ActivityStatesWithCitiesBinding; -public class StatesWithCitiesActivity extends BaseActivity implements StatesWithCitiesContract.View { +import java.util.ArrayList; +import java.util.List; + +public class StatesWithCitiesActivity extends BaseActivity implements StatesWithCitiesContract.View +{ + private ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_states_with_cities); + + // TODO: Needs to be deleted after proper implementation of TabLayout + viewPager = findViewById(R.id.vp_cities_fragment_container); + ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); + viewPagerAdapter.addFragment(StatesWithCitiesFragment.newInstance(), "Cities"); + viewPager.setAdapter(viewPagerAdapter); + + } @Override @@ -30,4 +47,34 @@ protected void init(@Nullable Bundle savedInstanceState) { protected void beforeView(@Nullable Bundle savedInstanceState) { } + + // TODO: Needs to be deleted after proper implementation of TabLayout + class ViewPagerAdapter extends FragmentPagerAdapter { + private final List mFragmentList = new ArrayList<>(); + private final List mFragmentTitleList = new ArrayList<>(); + + public ViewPagerAdapter(FragmentManager manager) { + super(manager); + } + + @Override + public Fragment getItem(int position) { + return mFragmentList.get(position); + } + + @Override + public int getCount() { + return mFragmentList.size(); + } + + public void addFragment(Fragment fragment, String title) { + mFragmentList.add(fragment); + mFragmentTitleList.add(title); + } + + @Override + public CharSequence getPageTitle(int position) { + return mFragmentTitleList.get(position); + } + } } diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java new file mode 100644 index 0000000..1afa518 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java @@ -0,0 +1,171 @@ +package com.udacity.exploreindia.ui.StatesWithCities; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.support.annotation.Nullable; +import android.support.v4.view.ViewPager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.udacity.exploreindia.R; +import com.udacity.exploreindia.base.BaseFragment; +import com.udacity.exploreindia.databinding.FragmentStatesWithCitiesBinding; + +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; + +public class StatesWithCitiesFragment extends BaseFragment implements StatesWithCitiesContract.View +{ + private ViewPager mCitySliderViewPager; + private LinearLayout mDotsLayout; + private TextView[] mDots; + private RecyclerView mSmallCityRecyclerView; + private MajorCitiesSliderAdapter mMajorCitiesSliderAdapter; + private Context mContext; + private int position; + private Handler handler; + + // TODO: Delete this after linking with real data + private ArrayList mDummyDataSmallCities; + private ArrayList mDummyDataMajorCities; + + + Runnable slidePositionRunnable = new Runnable() { + public void run() { + if (position == mDummyDataMajorCities.size()) { + position = 0; + } else { + position = position + 1; + } + mCitySliderViewPager.setCurrentItem(position, true); + } + }; + + public StatesWithCitiesFragment(){} // Required public constructor + + public static StatesWithCitiesFragment newInstance() { + StatesWithCitiesFragment frag = new StatesWithCitiesFragment(); + Bundle bundle = new Bundle(); + frag.setArguments(bundle); + return frag; + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) + { + mContext = getContext(); + View view = inflater.inflate(R.layout.fragment_states_with_cities, container, false); + + mCitySliderViewPager = view.findViewById(R.id.vp_major_cities_slider); + mDotsLayout = view.findViewById(R.id.dotsLayout); + mSmallCityRecyclerView = view.findViewById(R.id.rv_small_cities_view); + + // Populating with dummy data + mDummyDataSmallCities = new ArrayList<>(); + mDummyDataMajorCities = new ArrayList<>(); + + for (int i=0; i<4; i++) { + mDummyDataMajorCities.add(new CityData(R.drawable.ahmedabad, "Ahmedabad")); + } + for (int i=0; i<9; i++) { + mDummyDataSmallCities.add(new CityData(R.drawable.image3, "Taj Mahal")); + } + + + // TODO: Pass in the current position of the card to the cardNumber variable. + // Like if you are showing the 3rd card from the Adapter or similar then pass it in here so that the 3rd dot will be highlighted + // Also call this method where ever you are updating the position of the page to update the dot position like onPageScrolled() + // callback in PageAdapter + int cardNumber = 3; + addDotsIndicator(cardNumber); + + this.handler = new Handler(); + + new Timer().schedule(new TimerTask() { + @Override + public void run() { + handler.post(slidePositionRunnable); + } + }, 100, 5000); + + return view; + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + // Populate the Top SlideView with data + mMajorCitiesSliderAdapter = new MajorCitiesSliderAdapter(mContext, mDummyDataMajorCities); + mCitySliderViewPager.setAdapter(mMajorCitiesSliderAdapter); + mCitySliderViewPager.addOnPageChangeListener(pageChangeListener); + + // Populate the Bottom Small City view with data + mSmallCityRecyclerView.setHasFixedSize(true); + mSmallCityRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL)); + mSmallCityRecyclerView.setAdapter(new SmallCitiesAdapter(mDummyDataSmallCities)); + } + + @Override + protected int getContentResource() { + return 0; + } + + @Override + protected void init(View view, @Nullable Bundle savedInstanceState) { + + } + + ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + } + + @Override + public void onPageSelected(int position) { + addDotsIndicator(position); + } + + @Override + public void onPageScrollStateChanged(int state) { + } + }; + + /** + * Adds progress dots right below the states_with_cities_top_item view + * @param position The current position of the card. This position is used to determine which dot to highlight + */ + public void addDotsIndicator(int position) { + // TODO: Specify the total number of cards or cities here (Ex: 5) + // The size of this mDots array defines the number of dots that will be displayed + mDots = new TextView[5]; + + mDotsLayout.removeAllViews(); + + for (int i = 0; i < mDots.length; i++) { + mDots[i] = new TextView(mContext); + mDots[i].setText(Html.fromHtml("•")); // ASCII Code for Bullet + mDots[i].setTextSize(35); + // Set the color of the dot to light grey to indicate inactive dots + mDots[i].setTextColor(getResources().getColor(R.color.colorDotInactive)); + + mDotsLayout.addView(mDots[i]); + } + + // Set the color of the dot to grey to indicate the currently active card position + if (mDots.length > 0) { + mDots[position].setTextColor(getResources().getColor(R.color.colorDotActive)); + mDots[position].setTextSize(40); + } + } +} diff --git a/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java b/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java index 8b21266..1554927 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java @@ -14,6 +14,8 @@ import com.udacity.exploreindia.base.BaseActivity; import com.udacity.exploreindia.databinding.ActivityHomBinding; import com.udacity.exploreindia.helper.FragmentAdapter; +import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesActivity; +import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesFragment; import com.udacity.exploreindia.ui.home.fragments.likedplaces.LikedPlacesFragment; import com.udacity.exploreindia.ui.home.fragments.main.MainFragment; import com.udacity.exploreindia.ui.home.fragments.place.PlaceFragment; @@ -89,9 +91,10 @@ public boolean onOptionsItemSelected(MenuItem item) { int selectedId = item.getItemId(); switch (selectedId) { case R.id.action_logout : - FirebaseAuth.getInstance().signOut(); - Intent loginIntent = new Intent(this, LoginActivity.class); - startActivity(loginIntent); +// FirebaseAuth.getInstance().signOut(); +// Intent loginIntent = new Intent(this, LoginActivity.class); +// startActivity(loginIntent); + startActivity(new Intent(this, StatesWithCitiesActivity.class)); return true; default: diff --git a/app/src/main/res/layout/activity_states_with_cities.xml b/app/src/main/res/layout/activity_states_with_cities.xml index e579a2e..2647f7d 100644 --- a/app/src/main/res/layout/activity_states_with_cities.xml +++ b/app/src/main/res/layout/activity_states_with_cities.xml @@ -3,13 +3,24 @@ - + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/cardview_location_layout.xml b/app/src/main/res/layout/cardview_location_layout.xml index 5ef5e88..f60283e 100644 --- a/app/src/main/res/layout/cardview_location_layout.xml +++ b/app/src/main/res/layout/cardview_location_layout.xml @@ -5,9 +5,7 @@ android:id="@+id/card_view" android:layout_width="wrap_content" android:layout_height="wrap_content" - card_view:cardUseCompatPadding="true" - card_view:cardCornerRadius="8dp" - > + card_view:cardUseCompatPadding="true"> + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/states_with_cities_bottom_item.xml b/app/src/main/res/layout/states_with_cities_bottom_item.xml new file mode 100644 index 0000000..cd62478 --- /dev/null +++ b/app/src/main/res/layout/states_with_cities_bottom_item.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/states_with_cities_top_item.xml b/app/src/main/res/layout/states_with_cities_top_item.xml new file mode 100644 index 0000000..b0e6e25 --- /dev/null +++ b/app/src/main/res/layout/states_with_cities_top_item.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2ebc371..de9c7f1 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -31,4 +31,9 @@ + + #81000000 + #D6D6D6 + #5E5E5E + diff --git a/local.properties b/local.properties index 4c058d7..3e156a2 100644 --- a/local.properties +++ b/local.properties @@ -4,5 +4,5 @@ # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. -#Sun May 06 01:09:56 IST 2018 -sdk.dir=D\:\\Dependices\\Android +#Wed May 09 14:50:21 IST 2018 +sdk.dir=C\:\\Android_SDK From 0804a6f84bcd6ce2be888166e862dfa8a595c0e8 Mon Sep 17 00:00:00 2001 From: ArunKBabu Date: Fri, 11 May 2018 22:18:56 +0530 Subject: [PATCH 2/5] Fully Implemented Cities Fragment --- .../exploreindia/base/PresenterFactory.java | 10 +++- .../ui/StatesWithCities/CityData.java | 4 ++ .../MajorCitiesSliderAdapter.java | 4 ++ .../StatesWithCities/SmallCitiesAdapter.java | 6 +- .../StatesWithCitiesFragment.java | 42 +++++++++----- .../exploreindia/ui/home/HomeActivity.java | 11 ++-- .../layout/fragment_states_with_cities.xml | 38 +++++------- .../layout/states_with_cities_bottom_item.xml | 58 +++++++++++-------- .../layout/states_with_cities_top_item.xml | 2 +- 9 files changed, 102 insertions(+), 73 deletions(-) diff --git a/app/src/main/java/com/udacity/exploreindia/base/PresenterFactory.java b/app/src/main/java/com/udacity/exploreindia/base/PresenterFactory.java index d9cf456..4c7a589 100644 --- a/app/src/main/java/com/udacity/exploreindia/base/PresenterFactory.java +++ b/app/src/main/java/com/udacity/exploreindia/base/PresenterFactory.java @@ -1,6 +1,9 @@ package com.udacity.exploreindia.base; import com.udacity.exploreindia.injection.InjectionUtils; +import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesActivity; +import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesFragment; +import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesPresenter; import com.udacity.exploreindia.ui.home.HomeActivity; import com.udacity.exploreindia.ui.home.HomePresenter; import com.udacity.exploreindia.ui.home.fragments.likedplaces.LikedPlacesFragment; @@ -38,6 +41,8 @@ public static S getPresente return presenter; } else if (claxx instanceof LikedPlacesFragment) { presenter = (S) new LikedPlacesPresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx.getContext()); + } else if (claxx instanceof StatesWithCitiesFragment) { + presenter = (S) new StatesWithCitiesPresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx.getContext()); } else { throw new IllegalStateException("Activity presenter not supported yet"); } @@ -55,7 +60,10 @@ public static S getPresente presenter = (S) new LoginPresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx); } else if (claxx instanceof HomeActivity) { presenter = (S) new HomePresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx); - } else { + } else if (claxx instanceof StatesWithCitiesActivity) { + presenter = (S) new StatesWithCitiesPresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx); + } + else { throw new IllegalStateException("Activity presenter not supported yet"); } diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/CityData.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/CityData.java index 68d0adc..38710ed 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/CityData.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/CityData.java @@ -1,5 +1,9 @@ package com.udacity.exploreindia.ui.StatesWithCities; +/** + * Created by Arun K Babu on 10-May-18. + */ + // TODO: This class can be deleted after linking with real data /** diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/MajorCitiesSliderAdapter.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/MajorCitiesSliderAdapter.java index e694747..801db65 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/MajorCitiesSliderAdapter.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/MajorCitiesSliderAdapter.java @@ -14,6 +14,10 @@ import java.util.ArrayList; +/** + * Created by Arun K Babu on 10-May-18. + */ + public class MajorCitiesSliderAdapter extends PagerAdapter { private Context mContext; diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/SmallCitiesAdapter.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/SmallCitiesAdapter.java index 0065261..0eb431e 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/SmallCitiesAdapter.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/SmallCitiesAdapter.java @@ -12,6 +12,10 @@ import java.util.ArrayList; +/** + * Created by Arun K Babu on 10-May-18. + */ + public class SmallCitiesAdapter extends RecyclerView.Adapter { private ArrayList mSmallCitiesData; @@ -23,7 +27,7 @@ public SmallCitiesAdapter(ArrayList smallCitiesData) { @NonNull @Override public SmallCitiesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.states_with_cities_top_item, parent, false); + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.states_with_cities_bottom_item, parent, false); return new SmallCitiesViewHolder(view); } diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java index 1afa518..6b7fed2 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java @@ -7,7 +7,6 @@ import android.support.v4.view.ViewPager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; -import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -22,6 +21,10 @@ import java.util.Timer; import java.util.TimerTask; +/** + * Created by Arun K Babu on 10-May-18. + */ + public class StatesWithCitiesFragment extends BaseFragment implements StatesWithCitiesContract.View { @@ -31,7 +34,7 @@ public class StatesWithCitiesFragment extends BaseFragment(); mDummyDataMajorCities = new ArrayList<>(); - for (int i=0; i<4; i++) { + // TODO: Delete this after linking with real data + for (int i=0; i<5; i++) { mDummyDataMajorCities.add(new CityData(R.drawable.ahmedabad, "Ahmedabad")); } - for (int i=0; i<9; i++) { + for (int i=0; i<12; i++) { mDummyDataSmallCities.add(new CityData(R.drawable.image3, "Taj Mahal")); } - // TODO: Pass in the current position of the card to the cardNumber variable. + // TODO: Pass in the current mPosition of the card to the cardNumber variable. // Like if you are showing the 3rd card from the Adapter or similar then pass it in here so that the 3rd dot will be highlighted - // Also call this method where ever you are updating the position of the page to update the dot position like onPageScrolled() + // Also call this method where ever you are updating the mPosition of the page to update the dot mPosition like onPageScrolled() // callback in PageAdapter int cardNumber = 3; addDotsIndicator(cardNumber); @@ -96,7 +100,7 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, public void run() { handler.post(slidePositionRunnable); } - }, 100, 5000); + }, 0, 5000); return view; } @@ -134,6 +138,8 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse @Override public void onPageSelected(int position) { addDotsIndicator(position); + mPosition = position; + } @Override @@ -143,7 +149,7 @@ public void onPageScrollStateChanged(int state) { /** * Adds progress dots right below the states_with_cities_top_item view - * @param position The current position of the card. This position is used to determine which dot to highlight + * @param position The current mPosition of the card. This mPosition is used to determine which dot to highlight */ public void addDotsIndicator(int position) { // TODO: Specify the total number of cards or cities here (Ex: 5) @@ -152,20 +158,24 @@ public void addDotsIndicator(int position) { mDotsLayout.removeAllViews(); + int textPadding = 26; + for (int i = 0; i < mDots.length; i++) { mDots[i] = new TextView(mContext); - mDots[i].setText(Html.fromHtml("•")); // ASCII Code for Bullet - mDots[i].setTextSize(35); + mDots[i].setText("•"); + mDots[i].setPadding(textPadding, 0, textPadding, 0); + mDots[i].setTextSize(30); // Set the color of the dot to light grey to indicate inactive dots mDots[i].setTextColor(getResources().getColor(R.color.colorDotInactive)); mDotsLayout.addView(mDots[i]); } - // Set the color of the dot to grey to indicate the currently active card position + // Set the color of the dot to grey to indicate the currently active card mPosition if (mDots.length > 0) { mDots[position].setTextColor(getResources().getColor(R.color.colorDotActive)); - mDots[position].setTextSize(40); + mDots[position].setTextSize(35); + mDots[position].setPadding(textPadding, 0, textPadding, 0); } } } diff --git a/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java b/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java index 1554927..0f6d657 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java @@ -16,6 +16,7 @@ import com.udacity.exploreindia.helper.FragmentAdapter; import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesActivity; import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesFragment; +import com.udacity.exploreindia.ui.StatesWithPlaces.StatesWithPlacesActivity; import com.udacity.exploreindia.ui.home.fragments.likedplaces.LikedPlacesFragment; import com.udacity.exploreindia.ui.home.fragments.main.MainFragment; import com.udacity.exploreindia.ui.home.fragments.place.PlaceFragment; @@ -56,6 +57,7 @@ private void populateViewPager() { fragmentAdapter.addFragment(PlaceFragment.newInstance(), R.id.bnv_add); fragmentAdapter.addFragment(LikedPlacesFragment.newInstance(), R.id.bnv_favorite); fragmentAdapter.addFragment(UserDetailFragment.newInstance(), R.id.bnv_profile); + fragmentAdapter.addFragment(StatesWithCitiesFragment.newInstance(), R.id.bnv_profile); viewPager.setAdapter(fragmentAdapter); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override @@ -91,10 +93,9 @@ public boolean onOptionsItemSelected(MenuItem item) { int selectedId = item.getItemId(); switch (selectedId) { case R.id.action_logout : -// FirebaseAuth.getInstance().signOut(); -// Intent loginIntent = new Intent(this, LoginActivity.class); -// startActivity(loginIntent); - startActivity(new Intent(this, StatesWithCitiesActivity.class)); + FirebaseAuth.getInstance().signOut(); + Intent loginIntent = new Intent(this, LoginActivity.class); + startActivity(loginIntent); return true; default: @@ -129,7 +130,7 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) { break; case R.id.bnv_profile: - viewPager.setCurrentItem(4); + viewPager.setCurrentItem(5); break; } return true; diff --git a/app/src/main/res/layout/fragment_states_with_cities.xml b/app/src/main/res/layout/fragment_states_with_cities.xml index 15f6e38..3fe03f4 100644 --- a/app/src/main/res/layout/fragment_states_with_cities.xml +++ b/app/src/main/res/layout/fragment_states_with_cities.xml @@ -1,29 +1,28 @@ - - + @@ -39,11 +38,6 @@ android:id="@+id/dotsLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:layout_marginEnd="16dp" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:layout_marginStart="16dp" android:orientation="horizontal" app:layout_constraintEnd_toEndOf="@+id/relativeLayout" app:layout_constraintStart_toStartOf="@+id/relativeLayout" @@ -51,13 +45,9 @@ diff --git a/app/src/main/res/layout/states_with_cities_bottom_item.xml b/app/src/main/res/layout/states_with_cities_bottom_item.xml index cd62478..12551e5 100644 --- a/app/src/main/res/layout/states_with_cities_bottom_item.xml +++ b/app/src/main/res/layout/states_with_cities_bottom_item.xml @@ -1,43 +1,51 @@ - + android:layout_width="wrap_content" + android:layout_height="wrap_content" + card_view:cardElevation="0dp"> - - - - - + android:layout_marginBottom="20dp" + android:layout_marginEnd="30dp" + android:layout_marginStart="30dp"> + + + + + + - + \ No newline at end of file diff --git a/app/src/main/res/layout/states_with_cities_top_item.xml b/app/src/main/res/layout/states_with_cities_top_item.xml index b0e6e25..8a23f7f 100644 --- a/app/src/main/res/layout/states_with_cities_top_item.xml +++ b/app/src/main/res/layout/states_with_cities_top_item.xml @@ -26,7 +26,7 @@ android:background="@color/colorDescriptionBackground" android:layout_alignParentBottom="true" android:scaleType="fitXY" - android:padding="16dp"> + android:padding="14dp"> Date: Fri, 11 May 2018 23:36:17 +0530 Subject: [PATCH 3/5] Fixed Cities Fragment bottom layout bug --- .../GridSpacingItemDecoration.java | 29 ++++++++++++++ .../StatesWithCitiesFragment.java | 10 +++-- .../layout/fragment_states_with_cities.xml | 40 +++++++------------ .../layout/states_with_cities_bottom_item.xml | 8 ++-- 4 files changed, 54 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java new file mode 100644 index 0000000..dee55d2 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java @@ -0,0 +1,29 @@ +package com.udacity.exploreindia.ui.StatesWithCities; + +import android.graphics.Rect; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { + private int space; + + public GridSpacingItemDecoration(int space) { + this.space = space; + } + + @Override + public void getItemOffsets(Rect outRect, View view, + RecyclerView parent, RecyclerView.State state) { + outRect.left = space; + outRect.right = space; + outRect.bottom = space; + outRect.top = 0; + + // Add top margin only for the first item to avoid double space between items +// if (parent.getChildLayoutPosition(view) == 0) { +// outRect.top = space; +// } else { +// outRect.top = 0; +// } + } +} diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java index 6b7fed2..a2d7288 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java @@ -5,11 +5,13 @@ import android.os.Handler; import android.support.annotation.Nullable; import android.support.v4.view.ViewPager; +import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.GridLayout; import android.widget.LinearLayout; import android.widget.TextView; @@ -81,7 +83,7 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, for (int i=0; i<5; i++) { mDummyDataMajorCities.add(new CityData(R.drawable.ahmedabad, "Ahmedabad")); } - for (int i=0; i<12; i++) { + for (int i=0; i<16; i++) { mDummyDataSmallCities.add(new CityData(R.drawable.image3, "Taj Mahal")); } @@ -100,7 +102,7 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, public void run() { handler.post(slidePositionRunnable); } - }, 0, 5000); + }, 1000, 5000); return view; } @@ -116,7 +118,9 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { // Populate the Bottom Small City view with data mSmallCityRecyclerView.setHasFixedSize(true); - mSmallCityRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL)); + mSmallCityRecyclerView.setNestedScrollingEnabled(true); + mSmallCityRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 3, GridLayout.VERTICAL, false)); + mSmallCityRecyclerView.addItemDecoration(new GridSpacingItemDecoration(80)); mSmallCityRecyclerView.setAdapter(new SmallCitiesAdapter(mDummyDataSmallCities)); } diff --git a/app/src/main/res/layout/fragment_states_with_cities.xml b/app/src/main/res/layout/fragment_states_with_cities.xml index 3fe03f4..e0892fb 100644 --- a/app/src/main/res/layout/fragment_states_with_cities.xml +++ b/app/src/main/res/layout/fragment_states_with_cities.xml @@ -1,56 +1,46 @@ - + - - - - + android:layout_centerHorizontal="true" + android:layout_below="@+id/vp_major_cities_slider"/> + + android:layout_below="@+id/dotsLayout"/> - + \ No newline at end of file diff --git a/app/src/main/res/layout/states_with_cities_bottom_item.xml b/app/src/main/res/layout/states_with_cities_bottom_item.xml index 12551e5..37795a6 100644 --- a/app/src/main/res/layout/states_with_cities_bottom_item.xml +++ b/app/src/main/res/layout/states_with_cities_bottom_item.xml @@ -1,5 +1,6 @@ - + android:layout_height="wrap_content"> Date: Sat, 12 May 2018 21:23:57 +0530 Subject: [PATCH 4/5] Fully Implemented SelectedStatesActivity --- app/src/main/AndroidManifest.xml | 6 +- .../exploreindia/base/PresenterFactory.java | 10 ++- .../GridSpacingItemDecoration.java | 7 -- .../StatesWithCitiesActivity.java | 46 ----------- .../StatesWithCitiesFragment.java | 81 +++++++++++-------- .../StatesWithCitiesPresenter.java | 6 +- .../StatesWithPlacesContract.java | 1 + .../exploreindia/ui/home/HomeActivity.java | 6 +- .../selectedstate/SelectedStateActivity.java | 54 +++++++++++++ .../selectedstate/SelectedStateContract.java | 15 ++++ .../selectedstate/SelectedStatePresenter.java | 20 +++++ .../adapter/SelectedStateVPAdapter.java | 40 +++++++++ .../adapter/StatePlacesAdapter.java | 69 ++++++++++++++++ .../fragment/SelectedPlacesContract.java | 18 +++++ .../fragment/SelectedPlacesFragment.java | 44 ++++++++++ .../fragment/SelectedPlacesPresenter.java | 23 ++++++ .../res/layout/activity_selected_state.xml | 42 ++++++++++ .../layout/activity_states_with_cities.xml | 10 --- .../res/layout/fragment_selected_places.xml | 29 +++++++ .../layout/fragment_states_with_cities.xml | 4 +- .../main/res/layout/places_item_layout.xml | 59 ++++++++++++++ app/src/main/res/menu/search_menu.xml | 9 +++ app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/strings.xml | 4 + 24 files changed, 497 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStateActivity.java create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStateContract.java create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStatePresenter.java create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/selectedstate/adapter/SelectedStateVPAdapter.java create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/selectedstate/adapter/StatePlacesAdapter.java create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesContract.java create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesFragment.java create mode 100644 app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesPresenter.java create mode 100644 app/src/main/res/layout/activity_selected_state.xml create mode 100644 app/src/main/res/layout/fragment_selected_places.xml create mode 100644 app/src/main/res/layout/places_item_layout.xml create mode 100644 app/src/main/res/menu/search_menu.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a007961..3f386dd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -30,9 +30,11 @@ - + - + + + diff --git a/app/src/main/java/com/udacity/exploreindia/base/PresenterFactory.java b/app/src/main/java/com/udacity/exploreindia/base/PresenterFactory.java index 4c7a589..650fc96 100644 --- a/app/src/main/java/com/udacity/exploreindia/base/PresenterFactory.java +++ b/app/src/main/java/com/udacity/exploreindia/base/PresenterFactory.java @@ -2,7 +2,6 @@ import com.udacity.exploreindia.injection.InjectionUtils; import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesActivity; -import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesFragment; import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesPresenter; import com.udacity.exploreindia.ui.home.HomeActivity; import com.udacity.exploreindia.ui.home.HomePresenter; @@ -17,6 +16,11 @@ import com.udacity.exploreindia.ui.home.fragments.search.SearchFragment; import com.udacity.exploreindia.ui.login.LoginActivity; import com.udacity.exploreindia.ui.login.LoginPresenter; +import com.udacity.exploreindia.ui.selectedstate.SelectedStateActivity; +import com.udacity.exploreindia.ui.selectedstate.SelectedStatePresenter; +import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesFragment; +import com.udacity.exploreindia.ui.selectedstate.fragment.SelectedPlacesFragment; +import com.udacity.exploreindia.ui.selectedstate.fragment.SelectedPlacesPresenter; import com.udacity.exploreindia.ui.splash.SplashActivity; import com.udacity.exploreindia.ui.splash.SplashPresenter; @@ -43,6 +47,8 @@ public static S getPresente presenter = (S) new LikedPlacesPresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx.getContext()); } else if (claxx instanceof StatesWithCitiesFragment) { presenter = (S) new StatesWithCitiesPresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx.getContext()); + } else if (claxx instanceof SelectedPlacesFragment) { + presenter = (S) new SelectedPlacesPresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx.getContext()); } else { throw new IllegalStateException("Activity presenter not supported yet"); } @@ -62,6 +68,8 @@ public static S getPresente presenter = (S) new HomePresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx); } else if (claxx instanceof StatesWithCitiesActivity) { presenter = (S) new StatesWithCitiesPresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx); + } else if (claxx instanceof SelectedStateActivity) { + presenter = (S) new SelectedStatePresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx); } else { throw new IllegalStateException("Activity presenter not supported yet"); diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java index dee55d2..f90b6c7 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java @@ -18,12 +18,5 @@ public void getItemOffsets(Rect outRect, View view, outRect.right = space; outRect.bottom = space; outRect.top = 0; - - // Add top margin only for the first item to avoid double space between items -// if (parent.getChildLayoutPosition(view) == 0) { -// outRect.top = space; -// } else { -// outRect.top = 0; -// } } } diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesActivity.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesActivity.java index c501cc0..3541de4 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesActivity.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesActivity.java @@ -2,35 +2,19 @@ import android.support.annotation.Nullable; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; import com.udacity.exploreindia.R; import com.udacity.exploreindia.base.BaseActivity; import com.udacity.exploreindia.databinding.ActivityStatesWithCitiesBinding; -import java.util.ArrayList; -import java.util.List; - public class StatesWithCitiesActivity extends BaseActivity implements StatesWithCitiesContract.View { - private ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_states_with_cities); - - // TODO: Needs to be deleted after proper implementation of TabLayout - viewPager = findViewById(R.id.vp_cities_fragment_container); - ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); - viewPagerAdapter.addFragment(StatesWithCitiesFragment.newInstance(), "Cities"); - viewPager.setAdapter(viewPagerAdapter); - - } @Override @@ -47,34 +31,4 @@ protected void init(@Nullable Bundle savedInstanceState) { protected void beforeView(@Nullable Bundle savedInstanceState) { } - - // TODO: Needs to be deleted after proper implementation of TabLayout - class ViewPagerAdapter extends FragmentPagerAdapter { - private final List mFragmentList = new ArrayList<>(); - private final List mFragmentTitleList = new ArrayList<>(); - - public ViewPagerAdapter(FragmentManager manager) { - super(manager); - } - - @Override - public Fragment getItem(int position) { - return mFragmentList.get(position); - } - - @Override - public int getCount() { - return mFragmentList.size(); - } - - public void addFragment(Fragment fragment, String title) { - mFragmentList.add(fragment); - mFragmentTitleList.add(title); - } - - @Override - public CharSequence getPageTitle(int position) { - return mFragmentTitleList.get(position); - } - } } diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java index a2d7288..c0d8ec4 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java @@ -7,7 +7,6 @@ import android.support.v4.view.ViewPager; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -35,23 +34,23 @@ public class StatesWithCitiesFragment extends BaseFragment mDummyDataSmallCities; private ArrayList mDummyDataMajorCities; - - Runnable slidePositionRunnable = new Runnable() { + private Runnable slidePositionRunnable = new Runnable() { + @Override public void run() { - if (mPosition == mDummyDataMajorCities.size()) { - mPosition = 0; + if (started) { + startSlide(); } else { - mPosition = mPosition + 1; + stopSlide(); } - mCitySliderViewPager.setCurrentItem(mPosition, true); } }; @@ -64,12 +63,14 @@ public static StatesWithCitiesFragment newInstance() { return frag; } - @Nullable @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) - { + protected int getContentResource() { + return R.layout.fragment_states_with_cities; + } + + @Override + protected void init(View view, @Nullable Bundle savedInstanceState) { mContext = getContext(); - View view = inflater.inflate(R.layout.fragment_states_with_cities, container, false); mCitySliderViewPager = view.findViewById(R.id.vp_major_cities_slider); mDotsLayout = view.findViewById(R.id.dotsLayout); @@ -88,7 +89,7 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, } - // TODO: Pass in the current mPosition of the card to the cardNumber variable. + // TODO: Pass in the current position of the card to the cardNumber variable. // Like if you are showing the 3rd card from the Adapter or similar then pass it in here so that the 3rd dot will be highlighted // Also call this method where ever you are updating the mPosition of the page to update the dot mPosition like onPageScrolled() // callback in PageAdapter @@ -97,20 +98,6 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, this.handler = new Handler(); - new Timer().schedule(new TimerTask() { - @Override - public void run() { - handler.post(slidePositionRunnable); - } - }, 1000, 5000); - - return view; - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - // Populate the Top SlideView with data mMajorCitiesSliderAdapter = new MajorCitiesSliderAdapter(mContext, mDummyDataMajorCities); mCitySliderViewPager.setAdapter(mMajorCitiesSliderAdapter); @@ -122,18 +109,16 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { mSmallCityRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 3, GridLayout.VERTICAL, false)); mSmallCityRecyclerView.addItemDecoration(new GridSpacingItemDecoration(80)); mSmallCityRecyclerView.setAdapter(new SmallCitiesAdapter(mDummyDataSmallCities)); - } - @Override - protected int getContentResource() { - return 0; } @Override - protected void init(View view, @Nullable Bundle savedInstanceState) { - + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + startSlide(); } + ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { @@ -162,7 +147,7 @@ public void addDotsIndicator(int position) { mDotsLayout.removeAllViews(); - int textPadding = 26; + int textPadding = 20; for (int i = 0; i < mDots.length; i++) { mDots[i] = new TextView(mContext); @@ -182,4 +167,32 @@ public void addDotsIndicator(int position) { mDots[position].setPadding(textPadding, 0, textPadding, 0); } } + + private void startSlide() { + started = true; + if (mPosition == mDummyDataMajorCities.size()) { + mPosition = 0; + } else { + mPosition = mPosition + 1; + } + mCitySliderViewPager.setCurrentItem(mPosition, true); + handler.postDelayed(slidePositionRunnable, 5000); + } + + private void stopSlide() { + started = false; + handler.removeCallbacks(slidePositionRunnable); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + stopSlide(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + stopSlide(); + } } diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesPresenter.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesPresenter.java index b7c9c4a..419cb8c 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesPresenter.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesPresenter.java @@ -6,8 +6,10 @@ import com.udacity.exploreindia.data.BaseRepo; import com.udacity.exploreindia.helper.SharedPrefManager; -public class StatesWithCitiesPresenter extends BasePresenter implements StatesWithCitiesContract.Presenter { - public StatesWithCitiesPresenter(SharedPrefManager mSharedPreferences, BaseRepo mBaseRepo, Context mContext) { +public class StatesWithCitiesPresenter extends BasePresenter implements StatesWithCitiesContract.Presenter +{ + public StatesWithCitiesPresenter(SharedPrefManager mSharedPreferences, BaseRepo mBaseRepo, Context mContext) + { super(mSharedPreferences, mBaseRepo, mContext); } diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithPlaces/StatesWithPlacesContract.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithPlaces/StatesWithPlacesContract.java index 92a4ec7..d62ae93 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithPlaces/StatesWithPlacesContract.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithPlaces/StatesWithPlacesContract.java @@ -4,6 +4,7 @@ import com.udacity.exploreindia.base.BaseView; import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesContract; + public class StatesWithPlacesContract { interface Presenter extends BaseMvpPresenter { diff --git a/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java b/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java index 0f6d657..a2c39bc 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/home/HomeActivity.java @@ -14,8 +14,6 @@ import com.udacity.exploreindia.base.BaseActivity; import com.udacity.exploreindia.databinding.ActivityHomBinding; import com.udacity.exploreindia.helper.FragmentAdapter; -import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesActivity; -import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesFragment; import com.udacity.exploreindia.ui.StatesWithPlaces.StatesWithPlacesActivity; import com.udacity.exploreindia.ui.home.fragments.likedplaces.LikedPlacesFragment; import com.udacity.exploreindia.ui.home.fragments.main.MainFragment; @@ -23,6 +21,7 @@ import com.udacity.exploreindia.ui.home.fragments.profile.UserDetailFragment; import com.udacity.exploreindia.ui.home.fragments.search.SearchFragment; import com.udacity.exploreindia.ui.login.LoginActivity; +import com.udacity.exploreindia.ui.selectedstate.SelectedStateActivity; public class HomeActivity extends BaseActivity implements HomeContract.View { @@ -57,7 +56,6 @@ private void populateViewPager() { fragmentAdapter.addFragment(PlaceFragment.newInstance(), R.id.bnv_add); fragmentAdapter.addFragment(LikedPlacesFragment.newInstance(), R.id.bnv_favorite); fragmentAdapter.addFragment(UserDetailFragment.newInstance(), R.id.bnv_profile); - fragmentAdapter.addFragment(StatesWithCitiesFragment.newInstance(), R.id.bnv_profile); viewPager.setAdapter(fragmentAdapter); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override @@ -130,7 +128,7 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) { break; case R.id.bnv_profile: - viewPager.setCurrentItem(5); + viewPager.setCurrentItem(4); break; } return true; diff --git a/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStateActivity.java b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStateActivity.java new file mode 100644 index 0000000..62bcda9 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStateActivity.java @@ -0,0 +1,54 @@ +package com.udacity.exploreindia.ui.selectedstate; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.TabLayout; +import android.support.v4.view.ViewPager; +import android.view.Menu; + +import com.udacity.exploreindia.R; +import com.udacity.exploreindia.base.BaseActivity; +import com.udacity.exploreindia.databinding.ActivitySelectedStateBinding; +import com.udacity.exploreindia.ui.home.HomeContract; +import com.udacity.exploreindia.ui.selectedstate.adapter.SelectedStateVPAdapter; +import com.udacity.exploreindia.ui.selectedstate.fragment.SelectedPlacesFragment; +import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesFragment; + +public class SelectedStateActivity extends BaseActivity implements HomeContract.View { + + private ViewPager mVpSelectedState; + private TabLayout mTabSelectedState; + + @Override + protected int getContentResource() { + return R.layout.activity_selected_state; + } + + @Override + protected void init(@Nullable Bundle savedInstanceState) { + mVpSelectedState = findViewById(R.id.vp_selected_state); + mTabSelectedState = findViewById(R.id.tb_selected_state); + //Set up the view pager + setupViewPager(mVpSelectedState); + //set up the tab layout with the tab layout + mTabSelectedState.setupWithViewPager(mVpSelectedState); + } + + @Override + protected void beforeView(@Nullable Bundle savedInstanceState) { + + } + + private void setupViewPager(ViewPager viewPager) { + SelectedStateVPAdapter adapter = new SelectedStateVPAdapter(getSupportFragmentManager()); + adapter.addFragment(SelectedPlacesFragment.newInstance(), getString(R.string.tab_places_title)); + adapter.addFragment(StatesWithCitiesFragment.newInstance(), getString(R.string.tab_city_title)); + viewPager.setAdapter(adapter); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.search_menu, menu); + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStateContract.java b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStateContract.java new file mode 100644 index 0000000..9324bd3 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStateContract.java @@ -0,0 +1,15 @@ +package com.udacity.exploreindia.ui.selectedstate; + +import com.udacity.exploreindia.base.BaseMvpPresenter; +import com.udacity.exploreindia.base.BaseView; + +public interface SelectedStateContract { + + interface Presenter extends BaseMvpPresenter { + + } + + interface View extends BaseView { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStatePresenter.java b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStatePresenter.java new file mode 100644 index 0000000..2b18744 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/SelectedStatePresenter.java @@ -0,0 +1,20 @@ +package com.udacity.exploreindia.ui.selectedstate; + +import android.content.Context; + +import com.udacity.exploreindia.base.BasePresenter; +import com.udacity.exploreindia.data.BaseRepo; +import com.udacity.exploreindia.helper.SharedPrefManager; + +public class SelectedStatePresenter extends BasePresenter implements SelectedStateContract.Presenter { + + + public SelectedStatePresenter(SharedPrefManager mSharedPreferences, BaseRepo mBaseRepo, Context mContext) { + super(mSharedPreferences, mBaseRepo, mContext); + } + + @Override + public void init() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/adapter/SelectedStateVPAdapter.java b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/adapter/SelectedStateVPAdapter.java new file mode 100644 index 0000000..9c9e1b1 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/adapter/SelectedStateVPAdapter.java @@ -0,0 +1,40 @@ +package com.udacity.exploreindia.ui.selectedstate.adapter; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Bhavik Makwana on 11-05-2018. + */ +public class SelectedStateVPAdapter extends FragmentPagerAdapter { + private final List mFragmentList = new ArrayList<>(); + private final List mFragmentTitleList = new ArrayList<>(); + + public SelectedStateVPAdapter(FragmentManager manager) { + super(manager); + } + + @Override + public Fragment getItem(int position) { + return mFragmentList.get(position); + } + + @Override + public int getCount() { + return mFragmentList.size(); + } + + public void addFragment(Fragment fragment, String title) { + mFragmentList.add(fragment); + mFragmentTitleList.add(title); + } + + @Override + public CharSequence getPageTitle(int position) { + return mFragmentTitleList.get(position); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/adapter/StatePlacesAdapter.java b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/adapter/StatePlacesAdapter.java new file mode 100644 index 0000000..73f8dde --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/adapter/StatePlacesAdapter.java @@ -0,0 +1,69 @@ +package com.udacity.exploreindia.ui.selectedstate.adapter; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v4.content.ContextCompat; +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.TextView; + +import com.udacity.exploreindia.R; + +/** + * Created by Divya on 30-04-2018. + */ + +public class StatePlacesAdapter extends RecyclerView.Adapter { + private Context context; + + /*TODO + * 1. add the arrayList in the Constructor + * */ + public StatePlacesAdapter(Context context) { + this.context = context; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.places_item_layout, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + + //TODO Remove this code when fetch the data from the server + if (position % 2 == 0) + holder.mIvPlaceImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.gateway_of_india)); + else + holder.mIvPlaceImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.gateway_of_india_small)); + + holder.mTvPlaceName.setText("Diu Daman"); + holder.mIvIsFavorite.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_action_favorite_fill)); + } + + + @Override + public int getItemCount() { + //TODO Change this to -> arrayListObject.size() + return 10; + } + + class ViewHolder extends RecyclerView.ViewHolder { + private ImageView mIvPlaceImage; + private TextView mTvPlaceName; + private ImageView mIvIsFavorite; + + ViewHolder(View itemView) { + super(itemView); + mIvPlaceImage = itemView.findViewById(R.id.iv_state_place_image); + mTvPlaceName = itemView.findViewById(R.id.tv_state_place_name); + mIvIsFavorite = itemView.findViewById(R.id.iv_state_place_favourite); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesContract.java b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesContract.java new file mode 100644 index 0000000..a79f301 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesContract.java @@ -0,0 +1,18 @@ +package com.udacity.exploreindia.ui.selectedstate.fragment; + +import com.udacity.exploreindia.base.BaseMvpPresenter; +import com.udacity.exploreindia.base.BaseView; + +/** + * Created by kamalshree on 5/3/2018. + */ + +public interface SelectedPlacesContract { + + interface Presenter extends BaseMvpPresenter { + } + + interface View extends BaseView { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesFragment.java b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesFragment.java new file mode 100644 index 0000000..036c880 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesFragment.java @@ -0,0 +1,44 @@ +package com.udacity.exploreindia.ui.selectedstate.fragment; + + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; +import android.view.View; +import android.widget.LinearLayout; + +import com.udacity.exploreindia.R; +import com.udacity.exploreindia.base.BaseFragment; +import com.udacity.exploreindia.databinding.FragmentSelectedPlacesBinding; +import com.udacity.exploreindia.ui.selectedstate.adapter.StatePlacesAdapter; + + +public class SelectedPlacesFragment extends BaseFragment implements SelectedPlacesContract.View { + + public SelectedPlacesFragment() { + // Required empty public constructor + } + + public static SelectedPlacesFragment newInstance() { + SelectedPlacesFragment fragment = new SelectedPlacesFragment(); + Bundle bundle = new Bundle(); + fragment.setArguments(bundle); + return fragment; + } + + @Override + protected int getContentResource() { + return R.layout.fragment_selected_places; + } + + @Override + protected void init(View view, @Nullable Bundle savedInstanceState) { + //initializations + RecyclerView mRvSelectedPlaces = view.findViewById(R.id.rv_selected_state_places); + //set up the RecyclerView + mRvSelectedPlaces.setHasFixedSize(true); + mRvSelectedPlaces.setLayoutManager(new StaggeredGridLayoutManager(2, LinearLayout.VERTICAL)); + mRvSelectedPlaces.setAdapter(new StatePlacesAdapter(getContext())); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesPresenter.java b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesPresenter.java new file mode 100644 index 0000000..80bd9f8 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/selectedstate/fragment/SelectedPlacesPresenter.java @@ -0,0 +1,23 @@ +package com.udacity.exploreindia.ui.selectedstate.fragment; + +import android.content.Context; + +import com.udacity.exploreindia.base.BasePresenter; +import com.udacity.exploreindia.data.BaseRepo; +import com.udacity.exploreindia.helper.SharedPrefManager; + +/** + * Created by kamalshree on 5/3/2018. + */ + +public class SelectedPlacesPresenter extends BasePresenter implements SelectedPlacesContract.Presenter { + + public SelectedPlacesPresenter(SharedPrefManager mSharedPreferences, BaseRepo mBaseRepo, Context mContext) { + super(mSharedPreferences, mBaseRepo, mContext); + } + + @Override + public void init() { + + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_selected_state.xml b/app/src/main/res/layout/activity_selected_state.xml new file mode 100644 index 0000000..2dc0eba --- /dev/null +++ b/app/src/main/res/layout/activity_selected_state.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_states_with_cities.xml b/app/src/main/res/layout/activity_states_with_cities.xml index 2647f7d..2285522 100644 --- a/app/src/main/res/layout/activity_states_with_cities.xml +++ b/app/src/main/res/layout/activity_states_with_cities.xml @@ -11,16 +11,6 @@ tools:context=".ui.StatesWithCities.StatesWithCitiesActivity"> - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_selected_places.xml b/app/src/main/res/layout/fragment_selected_places.xml new file mode 100644 index 0000000..a61d084 --- /dev/null +++ b/app/src/main/res/layout/fragment_selected_places.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_states_with_cities.xml b/app/src/main/res/layout/fragment_states_with_cities.xml index e0892fb..50e35df 100644 --- a/app/src/main/res/layout/fragment_states_with_cities.xml +++ b/app/src/main/res/layout/fragment_states_with_cities.xml @@ -1,6 +1,6 @@ - diff --git a/app/src/main/res/layout/places_item_layout.xml b/app/src/main/res/layout/places_item_layout.xml new file mode 100644 index 0000000..12a97b0 --- /dev/null +++ b/app/src/main/res/layout/places_item_layout.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/search_menu.xml b/app/src/main/res/menu/search_menu.xml new file mode 100644 index 0000000..19e10e9 --- /dev/null +++ b/app/src/main/res/menu/search_menu.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index ccf536c..d71a888 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,4 +2,6 @@ 8dp 16dp + 8dp + 16dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 98e1b52..7c3f1af 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -72,6 +72,10 @@ Date : 17–04–18 + Places + City + Search + From 8a9ce85ef9f5bd8970d109d40b75052cf74b334e Mon Sep 17 00:00:00 2001 From: ArunKBabu Date: Sat, 12 May 2018 21:34:16 +0530 Subject: [PATCH 5/5] Fully Implemented SelectedStatesActivity --- .../ui/StatesWithCities/GridSpacingItemDecoration.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java index f90b6c7..8e14fd7 100644 --- a/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java @@ -4,6 +4,13 @@ import android.support.v7.widget.RecyclerView; import android.view.View; +/** + * Created by Arun K Babu on 11-May-18. + */ + +/** + * Adds some empty space between the views + */ public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { private int space;