From e9e91281b6df53ec1bdd0dcb3d47ade7042eb89c Mon Sep 17 00:00:00 2001 From: "DESKTOP-F27IQ8Q\\JEONG WOO JIN" Date: Wed, 16 Jan 2019 19:24:55 +0900 Subject: [PATCH 1/4] =?UTF-8?q?2019-01-16=20=EC=98=81=ED=99=94=EC=95=B1=20?= =?UTF-8?q?=ED=95=84=ED=84=B0(=EC=9E=A5=EB=A5=B4,=20=EA=B5=AD=EA=B0=80)=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yeseul/movieapp/mapper/MovieMapper.java | 13 +++- .../movieapp/view/custom/FilterView.java | 72 +++++++++++++++++++ .../movieapp/view/main/MainActivity.java | 70 +++++++++++++++++- .../movieapp/view/main/MainContract.java | 2 +- .../movieapp/view/main/MainPresenter.java | 23 +++++- app/src/main/res/layout/layout_search_box.xml | 13 +++- app/src/main/res/values/array.xml | 50 +++++++++++++ app/src/main/res/values/strings.xml | 9 +++ build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 10 files changed, 249 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/example/yeseul/movieapp/view/custom/FilterView.java create mode 100644 app/src/main/res/values/array.xml diff --git a/app/src/main/java/com/example/yeseul/movieapp/mapper/MovieMapper.java b/app/src/main/java/com/example/yeseul/movieapp/mapper/MovieMapper.java index c8cd8fe..1c9c971 100644 --- a/app/src/main/java/com/example/yeseul/movieapp/mapper/MovieMapper.java +++ b/app/src/main/java/com/example/yeseul/movieapp/mapper/MovieMapper.java @@ -9,13 +9,24 @@ public class MovieMapper { public static final String QUERY_STRING_PAGE_UNIT = "display"; public static final String QUERY_STRING_START = "start"; - public static Map toRequest(String searchKey, int pageUnit, int start){ + public static final String QUERY_STRING_GENRE = "genre"; + public static final String QUERY_STRING_COUNTRY = "country"; + + public static Map toRequest(String searchKey, int pageUnit, int start, String genre, String country){ Map queryMap = new HashMap<>(); queryMap.put(QUERY_STRING_SEARCH_KEY, searchKey); queryMap.put(QUERY_STRING_PAGE_UNIT, ""+pageUnit); queryMap.put(QUERY_STRING_START, ""+start); + if( genre != null && !genre.equals("0")){ + queryMap.put(QUERY_STRING_GENRE, genre); + } + + if( country != null && !country.equals("") ){ + queryMap.put(QUERY_STRING_COUNTRY, country); + } + return queryMap; } diff --git a/app/src/main/java/com/example/yeseul/movieapp/view/custom/FilterView.java b/app/src/main/java/com/example/yeseul/movieapp/view/custom/FilterView.java new file mode 100644 index 0000000..45e432b --- /dev/null +++ b/app/src/main/java/com/example/yeseul/movieapp/view/custom/FilterView.java @@ -0,0 +1,72 @@ +package com.example.yeseul.movieapp.view.custom; + +import java.util.HashMap; + +public class FilterView { + + static HashMap genreMap = null; + static HashMap countryMap = null; + + public synchronized static HashMap getGenreMap() { + + if( genreMap == null) { + + genreMap = new HashMap<>(); + + genreMap.put("전체", "0"); + genreMap.put("드라마", "1"); + genreMap.put("판타지", "2"); + genreMap.put("서부", "3"); + genreMap.put("공포", "4"); + genreMap.put("로맨스", "5"); + genreMap.put("모험", "6"); + genreMap.put("스릴러", "7"); + genreMap.put("느와르", "8"); + genreMap.put("컬트", "9"); + genreMap.put("다큐멘터리", "10"); + genreMap.put("코미디", "11"); + genreMap.put("가족", "12"); + genreMap.put("미스터리", "13"); + genreMap.put("전쟁", "14"); + genreMap.put("애니메이션", "15"); + genreMap.put("범죄", "16"); + genreMap.put("뮤지컬", "17"); + genreMap.put("SF", "18"); + genreMap.put("액션", "19"); + genreMap.put("무협", "20"); + genreMap.put("에로", "21"); + genreMap.put("서스펜스", "22"); + genreMap.put("서사", "23"); + genreMap.put("블랙코미디", "24"); + genreMap.put("실험", "25"); + genreMap.put("영화카툰", "26"); + genreMap.put("영화음악", "27"); + genreMap.put("영화패러디포스터", "28"); + + } + + return genreMap; + } + + + public synchronized static HashMap getCountryMap() { + + if( countryMap == null) { + + countryMap = new HashMap<>(); + + countryMap.put("전체", ""); + countryMap.put("한국", "KR"); + countryMap.put("일본", "JP"); + countryMap.put("미국", "US"); + countryMap.put("홍콩", "HK"); + countryMap.put("영국", "GB"); + countryMap.put("프랑스", "FR"); + countryMap.put("기타", "ETC"); + + } + + return countryMap; + } + +} diff --git a/app/src/main/java/com/example/yeseul/movieapp/view/main/MainActivity.java b/app/src/main/java/com/example/yeseul/movieapp/view/main/MainActivity.java index 574b81f..932bd32 100644 --- a/app/src/main/java/com/example/yeseul/movieapp/view/main/MainActivity.java +++ b/app/src/main/java/com/example/yeseul/movieapp/view/main/MainActivity.java @@ -1,15 +1,18 @@ package com.example.yeseul.movieapp.view.main; +import android.content.DialogInterface; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.customtabs.CustomTabsIntent; +import android.support.v7.app.AlertDialog; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.Html; import android.text.TextUtils; import android.view.inputmethod.EditorInfo; +import android.widget.Toast; import com.example.yeseul.movieapp.R; import com.example.yeseul.movieapp.data.source.movie.MovieRepository; @@ -17,9 +20,13 @@ import com.example.yeseul.movieapp.utils.KeyboardUtil; import com.example.yeseul.movieapp.view.BaseActivity; +import java.util.HashMap; + public class MainActivity extends BaseActivity implements MainContract.View { private MovieListAdapter adapter; + private String genre; + private String country; @Override protected int getLayoutId() { @@ -44,6 +51,9 @@ protected void onCreate(Bundle savedInstanceState) { initView(); presenter.onViewCreated(); + + country = ""; + } private void initView() { @@ -66,6 +76,7 @@ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newStat } }); + // 키보드 검색 버튼 리스너 등록 binding.searchBox.etSearch.setOnEditorActionListener((v, actionId, event) -> { if(actionId == EditorInfo.IME_ACTION_SEARCH){ @@ -77,6 +88,63 @@ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newStat // 검색 버튼 리스너 등록 binding.searchBox.btnSubmit.setOnClickListener(v -> onSearchButtonClicked()); + + // 필터 버튼 리스터 등록 + binding.searchBox.btnFilter.setOnClickListener(v -> onFilterButtonClicked()); + + } + + //필터 설정 + private void onFilterButtonClicked() { + + + /* HashMap countryMap = new HashMap<>(); + countryMap.put("전체",""); + countryMap.put("한국","KR"); + countryMap.put("일본","JP"); + countryMap.put("미국","US"); + countryMap.put("홍콩","HK"); + countryMap.put("영국","GB"); + countryMap.put("프랑스","FR"); + countryMap.put("기타","ETC");*/ + + //국가 선택 + AlertDialog.Builder cDialog = new AlertDialog.Builder(this); + cDialog.setTitle(R.string.country) + .setItems(R.array.country, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + //country = countryMap.get(getResources().getStringArray(R.array.country)[which]); + country = getResources().getStringArray(R.array.country)[which]; + } + }).setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + presenter.setFilter(genre, country); + } + }); + + + //장르 선택 + AlertDialog.Builder gDialog = new AlertDialog.Builder(this); + gDialog.setTitle(R.string.genre) + .setItems(R.array.genre, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + //genre = Integer.toString(which); + genre = getResources().getStringArray(R.array.genre)[which]; + } + }).setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + //orderFlag = true; + cDialog.show(); + } + }); + + gDialog.show(); + + } /** @@ -87,7 +155,7 @@ private void onSearchButtonClicked(){ String searchKey = binding.searchBox.etSearch.getText().toString(); if(!TextUtils.isEmpty(searchKey)) { - presenter.onSearchButtonClicked(searchKey); + presenter.onSearchButtonClicked(searchKey,genre,country); binding.recyclerMovie.scrollToPosition(0); binding.emptyView.setText(""); KeyboardUtil.closeKeyboard(this, binding.searchBox.etSearch); diff --git a/app/src/main/java/com/example/yeseul/movieapp/view/main/MainContract.java b/app/src/main/java/com/example/yeseul/movieapp/view/main/MainContract.java index ac42353..6fb5c17 100644 --- a/app/src/main/java/com/example/yeseul/movieapp/view/main/MainContract.java +++ b/app/src/main/java/com/example/yeseul/movieapp/view/main/MainContract.java @@ -16,7 +16,7 @@ interface View extends BaseView { interface Presenter extends BasePresenter { - void onSearchButtonClicked(String searchKey); + void onSearchButtonClicked(String searchKey, String genre, String coutnry); void setAdapterView(AdapterContract.View adapterView); diff --git a/app/src/main/java/com/example/yeseul/movieapp/view/main/MainPresenter.java b/app/src/main/java/com/example/yeseul/movieapp/view/main/MainPresenter.java index b57c015..fd106ae 100644 --- a/app/src/main/java/com/example/yeseul/movieapp/view/main/MainPresenter.java +++ b/app/src/main/java/com/example/yeseul/movieapp/view/main/MainPresenter.java @@ -8,7 +8,9 @@ import com.example.yeseul.movieapp.mapper.MovieMapper; import com.example.yeseul.movieapp.pojo.Movie; import com.example.yeseul.movieapp.view.adapter.AdapterContract; +import com.example.yeseul.movieapp.view.custom.FilterView; +import java.util.HashMap; import java.util.List; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -23,15 +25,27 @@ public class MainPresenter implements MainContract.Presenter { private AdapterContract.Model adapterModel; private String searchKey = ""; // 검색 키워드 + private String genre = ""; + private String country = ""; private final int PAGE_UNIT = 20; // 한번에 가져올 데이터 개수 private int currentPage = 0; // 현재 페이지 index private boolean isEndOfPage = false; // 페이지 끝 flag + private ObservableField filter = new ObservableField<>("필터"); + public MainPresenter(MainContract.View view, MovieRepository repository) { this.view = view; this.repository = repository; } + public ObservableField getFilter() { + return filter; + } + + public void setFilter(String genre, String country) { + filter.set("장르 : " + genre +"\n"+"국가 : "+country); + } + @Override public void onViewCreated() { // do nothing @@ -54,8 +68,10 @@ public void loadItems(boolean isRefresh) { } @Override - public void onSearchButtonClicked(String searchKey) { + public void onSearchButtonClicked(String searchKey, String genre, String country) { this.searchKey = searchKey; + this.genre = genre; + this.country = country; loadItems(true); } @@ -76,7 +92,10 @@ private void getMovieList(){ isLoading.set(true); - repository.searchMovies(MovieMapper.toRequest(searchKey, PAGE_UNIT, (PAGE_UNIT * currentPage++) + 1)) + HashMap genreMap = FilterView.getGenreMap(); + HashMap countryMap = FilterView.getCountryMap(); + + repository.searchMovies(MovieMapper.toRequest(searchKey, PAGE_UNIT, (PAGE_UNIT * currentPage++) + 1, genreMap.get(genre), countryMap.get(country))) .observeOn(AndroidSchedulers.mainThread()) .subscribe(response -> { diff --git a/app/src/main/res/layout/layout_search_box.xml b/app/src/main/res/layout/layout_search_box.xml index 439c61f..2d59c71 100644 --- a/app/src/main/res/layout/layout_search_box.xml +++ b/app/src/main/res/layout/layout_search_box.xml @@ -17,7 +17,7 @@ +