diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c5b1aa..7b298ca 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,31 +22,33 @@ - - - - + + + - + android:configChanges="orientation"> + + - - + android:configChanges="orientation" /> + - + + android:configChanges="orientation"/> + + + 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 311833b..397f6b3 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,8 @@ package com.udacity.exploreindia.base; import com.udacity.exploreindia.injection.InjectionUtils; +import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesActivity; +import com.udacity.exploreindia.ui.StatesWithCities.StatesWithCitiesPresenter; import com.udacity.exploreindia.ui.City.CityActivity; import com.udacity.exploreindia.ui.City.CityPresenter; import com.udacity.exploreindia.ui.home.HomeActivity; @@ -16,6 +18,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; @@ -40,6 +47,10 @@ 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 if (claxx instanceof SelectedPlacesFragment) { + presenter = (S) new SelectedPlacesPresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx.getContext()); } else { throw new IllegalStateException("Activity presenter not supported yet"); } @@ -57,6 +68,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 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 if (claxx instanceof CityActivity) { presenter = (S) new CityPresenter(InjectionUtils.getSharedPreference(), InjectionUtils.providesDataRepo(), claxx); } else { 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..38710ed --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/CityData.java @@ -0,0 +1,29 @@ +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 + +/** + * 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/GridSpacingItemDecoration.java b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/GridSpacingItemDecoration.java new file mode 100644 index 0000000..8e14fd7 --- /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; + +/** + * 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; + + 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; + } +} 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..801db65 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/MajorCitiesSliderAdapter.java @@ -0,0 +1,68 @@ +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; + +/** + * Created by Arun K Babu on 10-May-18. + */ + +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..0eb431e --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/SmallCitiesAdapter.java @@ -0,0 +1,62 @@ +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; + +/** + * Created by Arun K Babu on 10-May-18. + */ + +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_bottom_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..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 @@ -1,14 +1,15 @@ package com.udacity.exploreindia.ui.StatesWithCities; import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; 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 { +public class StatesWithCitiesActivity extends BaseActivity implements StatesWithCitiesContract.View +{ @Override protected void onCreate(Bundle savedInstanceState) { 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..c0d8ec4 --- /dev/null +++ b/app/src/main/java/com/udacity/exploreindia/ui/StatesWithCities/StatesWithCitiesFragment.java @@ -0,0 +1,198 @@ +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.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.GridLayout; +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; + +/** + * Created by Arun K Babu on 10-May-18. + */ + +public class StatesWithCitiesFragment extends BaseFragment implements StatesWithCitiesContract.View +{ + private ViewPager mCitySliderViewPager; + private LinearLayout mDotsLayout; + private TextView[] mDots; + private RecyclerView mSmallCityRecyclerView; + private MajorCitiesSliderAdapter mMajorCitiesSliderAdapter; + private int mPosition; + private Handler handler; + private Context mContext; + private boolean started; + + // TODO: Delete this after linking with real data + private ArrayList mDummyDataSmallCities; + private ArrayList mDummyDataMajorCities; + + private Runnable slidePositionRunnable = new Runnable() { + @Override + public void run() { + if (started) { + startSlide(); + } else { + stopSlide(); + } + } + }; + + public StatesWithCitiesFragment(){} // Required public constructor + + public static StatesWithCitiesFragment newInstance() { + StatesWithCitiesFragment frag = new StatesWithCitiesFragment(); + Bundle bundle = new Bundle(); + frag.setArguments(bundle); + return frag; + } + + @Override + protected int getContentResource() { + return R.layout.fragment_states_with_cities; + } + + @Override + protected void init(View view, @Nullable Bundle savedInstanceState) { + mContext = getContext(); + + 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<>(); + + // 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<16; 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 mPosition of the page to update the dot mPosition like onPageScrolled() + // callback in PageAdapter + int cardNumber = 3; + addDotsIndicator(cardNumber); + + this.handler = new Handler(); + + // 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.setNestedScrollingEnabled(true); + mSmallCityRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 3, GridLayout.VERTICAL, false)); + mSmallCityRecyclerView.addItemDecoration(new GridSpacingItemDecoration(80)); + mSmallCityRecyclerView.setAdapter(new SmallCitiesAdapter(mDummyDataSmallCities)); + + } + + @Override + 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) { + } + + @Override + public void onPageSelected(int position) { + addDotsIndicator(position); + mPosition = position; + + } + + @Override + public void onPageScrollStateChanged(int state) { + } + }; + + /** + * Adds progress dots right below the states_with_cities_top_item view + * @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) + // The size of this mDots array defines the number of dots that will be displayed + mDots = new TextView[5]; + + mDotsLayout.removeAllViews(); + + int textPadding = 20; + + for (int i = 0; i < mDots.length; i++) { + mDots[i] = new TextView(mContext); + 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 mPosition + if (mDots.length > 0) { + mDots[position].setTextColor(getResources().getColor(R.color.colorDotActive)); + mDots[position].setTextSize(35); + 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 4bb11f9..e4a60e0 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 @@ -19,14 +19,17 @@ import com.udacity.exploreindia.base.BaseActivity; import com.udacity.exploreindia.databinding.ActivityHomeBinding; import com.udacity.exploreindia.helper.FragmentAdapter; +import com.udacity.exploreindia.ui.StatesWithPlaces.StatesWithPlacesActivity; import com.udacity.exploreindia.helper.SharedPrefManager; import com.udacity.exploreindia.helper.Utils; + 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; 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 { 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 e579a2e..2285522 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,14 @@ - + \ 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/fragment_states_with_cities.xml b/app/src/main/res/layout/fragment_states_with_cities.xml new file mode 100644 index 0000000..50e35df --- /dev/null +++ b/app/src/main/res/layout/fragment_states_with_cities.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file 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/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..37795a6 --- /dev/null +++ b/app/src/main/res/layout/states_with_cities_bottom_item.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + \ 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..8a23f7f --- /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/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/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/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index f2c07b2..ae18643 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,10 +2,8 @@ 8dp 16dp + 8dp + 16dp 18sp - - 14sp - - \ 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 4facaf8..91001e0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -73,6 +73,10 @@ Date : 17–04–18 + Places + City + Search + diff --git a/local.properties b/local.properties index fea7837..db8d841 100644 --- a/local.properties +++ b/local.properties @@ -4,5 +4,6 @@ # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. + #Mon May 14 16:33:43 IST 2018 sdk.dir=C\:\\Users\\Navoki\\AppData\\Local\\Android\\Sdk