Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yeseul.movieapp">

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
android:allowBackup="true"
Expand All @@ -14,9 +15,11 @@
<activity android:name=".view.main.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".view.custom.OrderSelectDialog"></activity>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.yeseul.movieapp.data.model;

import android.os.Build;

import com.example.yeseul.movieapp.pojo.Movie;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class MovieSortByDictionary implements MovieSortStrategy {
@Override
public List<Movie> sort(List<Movie> list) {
if(Build.VERSION_CODES.N <= Build.VERSION.SDK_INT) {
list = list.stream().sorted(Comparator.comparing(Movie::getTitle)).collect(Collectors.toList());
} else {
Collections.sort(list, (o1, o2) -> (o1.getTitle().compareTo(o2.getTitle())));
}
return list;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.example.yeseul.movieapp.data.model;

import android.os.Build;

import com.example.yeseul.movieapp.pojo.Movie;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class MovieSortByHighestRating implements MovieSortStrategy {
@Override
public List<Movie> sort(List<Movie> list) {
if(Build.VERSION_CODES.N <= Build.VERSION.SDK_INT) {
list = list.stream().
sorted((o1, o2) -> Double.compare(Double.parseDouble(o2.getUserRating()), Double.parseDouble(o1.getUserRating()))).
collect(Collectors.toList());
} else {
Collections.sort(list, (o1, o2) -> (Double.compare(Double.parseDouble(o2.getUserRating()), Double.parseDouble(o1.getUserRating()))));
}
return list;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.yeseul.movieapp.data.model;

import android.os.Build;

import com.example.yeseul.movieapp.pojo.Movie;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class MovieSortByLatestPubDate implements MovieSortStrategy {
@Override
public List<Movie> sort(List<Movie> list) {
if(Build.VERSION_CODES.N <= Build.VERSION.SDK_INT) {
list = list.stream().sorted(Comparator.comparing(Movie::getPubDate).reversed()).collect(Collectors.toList());
} else {
Collections.sort(list, (o1, o2) -> (o2.getPubDate().compareTo(o1.getPubDate())));
}
return list;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.example.yeseul.movieapp.data.model;

import android.os.Build;

import com.example.yeseul.movieapp.pojo.Movie;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class MovieSortByLowestRating implements MovieSortStrategy {
@Override
public List<Movie> sort(List<Movie> list) {
if(Build.VERSION_CODES.N <= Build.VERSION.SDK_INT) {
list = list.stream().
sorted((o1, o2) -> Double.compare(Double.parseDouble(o1.getUserRating()), Double.parseDouble(o2.getUserRating()))).
collect(Collectors.toList());
} else {
Collections.sort(list, (o1, o2) -> (Double.compare(Double.parseDouble(o1.getUserRating()), Double.parseDouble(o2.getUserRating()))));
}
return list;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.example.yeseul.movieapp.data.model;

import android.annotation.TargetApi;
import android.os.Build;

import com.example.yeseul.movieapp.pojo.Movie;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class MovieSortByOldPubDate implements MovieSortStrategy {
@Override
public List<Movie> sort(List<Movie> list) {
if(Build.VERSION_CODES.N <= Build.VERSION.SDK_INT) {
list = list.stream().sorted(Comparator.comparing(Movie::getPubDate)).collect(Collectors.toList());
} else {
Collections.sort(list, (o1, o2) -> (o2.getPubDate().compareTo(o1.getPubDate())));
}
return list;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.example.yeseul.movieapp.data.model;

import android.annotation.TargetApi;
import android.os.Build;

import com.example.yeseul.movieapp.pojo.Movie;

import java.util.List;

public interface MovieSortStrategy {

public static final int DICTIONARY_ORDER = 0;
public static final int LATEST_ORDER = 1;
public static final int OLDEST_ORDER = 2;
public static final int HIGHEST_RATING_ORDER = 3;
public static final int LOWEST_RATING_ORDER = 4;

List<Movie> sort(List<Movie> list);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interface에 상수를 정의하는 방법은 Anti-Pattern이라고 불리는 방법으로 알고 있습니다.
public static final int example = 1, enum , IntDef 와 같은 상수 정의 방법이 아닌
Interface 상수를 선택한 이유가 있을까요?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 StrategyInterface 에 있는 상수는 Factory 에서만 사용하고 있어 상수가 다른 Class 의 네임스페이스를 오염시키지 않는다고 생각되어 사용했습니다. 다시 생각해보니 Factory 에 넣어두는게 더 적절했다고 생각됩니다. 좋은 지적 감사합니다 ! 그리고 IntDef 는 한번도 사용해보지 못했는데 이번에 이용해서 수정하도록 하겠습니다 !

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.yeseul.movieapp.data.model;

import static com.example.yeseul.movieapp.data.model.MovieSortStrategy.*;

public class MovieStrategyFactory {
public static MovieSortStrategy create(int idx) {

switch (idx) {
case DICTIONARY_ORDER:
return new MovieSortByDictionary();
case LATEST_ORDER:
return new MovieSortByLatestPubDate();
case OLDEST_ORDER:
return new MovieSortByOldPubDate();
case HIGHEST_RATING_ORDER:
return new MovieSortByHighestRating();
case LOWEST_RATING_ORDER:
return new MovieSortByLowestRating();
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
public class RetrofitClient {

private static final String BASE_URL = "https://openapi.naver.com/v1/";

private static final String CLIENT_ID = "uMJDm4Jz6qzLyQPT5KK9";
private static final String CLIENT_SECRET = "DxWswCSZ20";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@

import io.reactivex.Single;

/*
* Repository 에서 사용할 기능 선언 */
public interface MovieDataSource {

/* API 가 유일한 데이터를 반환하는 경우 Single 이 유용하다.(한 번만 데이터를 발행) */
Single<SearchMovieResponse> searchMovies(Map<String, String> request);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
import io.reactivex.Single;
import io.reactivex.schedulers.Schedulers;

/*
* Remote Data (인터넷에서 가져오는 데이터들)
* Singleton Pattern 으로 작성 -> presenter 에 등록할 때 getInstance 사용 */
public class MovieRemoteDataSource implements MovieDataSource{

private static MovieRemoteDataSource movieRemoteDataSource = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

import io.reactivex.Single;

/*
* Presenter 에서 Repository 에 접근할 때 사용하는 ref */
public class MovieRepository implements MovieDataSource {

private static MovieRepository movieRepository = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@
import java.util.HashMap;
import java.util.Map;

/*
* */
public class MovieMapper {

public static final String QUERY_STRING_SEARCH_KEY = "query";
public static final String QUERY_STRING_PAGE_UNIT = "display";
public static final String QUERY_STRING_START = "start";
/* private 로 접근 제한자 수정 */
private static final String QUERY_STRING_SEARCH_KEY = "query";
private static final String QUERY_STRING_PAGE_UNIT = "display";
private static final String QUERY_STRING_START = "start";

/*
* Retrofit 을 이용해 보낼 Query 생성 */
public static Map<String, String> toRequest(String searchKey, int pageUnit, int start){

Map<String, String> queryMap = new HashMap<>();
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/java/com/example/yeseul/movieapp/pojo/Movie.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@

public class Movie {

/*
* SerializedName : Gson 을 이용해 Json 에서 Object 로 객체를 변경시킬 때 Json 에 등록된 이름과 연결지어 준다.
* Expose : Expose Annotation 이 존재하면 Gson 을 이용할 때 해당 변수는 노출시키지 않게 됨
*
* */

@SerializedName("title")
@Expose
private String title;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public static int setVisibility(boolean isVisible){
return isVisible ? View.VISIBLE : View.GONE;
}

/*
* holder_movie_item.xml 에서 rating 과 결합. item 이 변경되면 그에 맞게 data change*/
@BindingAdapter({"rating"})
public static void setRating(RatingBar ratingBar, String userRating){

Expand All @@ -29,6 +31,8 @@ public static void setRating(RatingBar ratingBar, String userRating){
ratingBar.setRating((float) rating / 2);
}

/*
* holder_movie_item.xml 의 HTML Text 들과 결합. */
@BindingAdapter({"boldText"})
public static void setBoldText(TextView textView, String text){

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public static void loadImage(ImageView imageView, String url){
GlideApp.with(imageView).load(url).into(imageView);
}

/* URL 이 변경되면 해당 Image 를 불러오도록 설정 */
@BindingAdapter({"imageCenterCrop"})
public static void loadImageCenterCrop(ImageView imageView, String url){

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;


/*
* Keyboard Open, Close Command Handle */
public class KeyboardUtil {

public static void closeKeyboard(Context context, EditText editText){
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.example.yeseul.movieapp.utils;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class NetworkStatusCheckUtil {

public static final String NETWORK_STATUS_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";

public static boolean checkCurrentNetworkStatus(final Context context) {
final ConnectivityManager connectivityManager =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

final NetworkInfo currentNetworkStatus = connectivityManager.getActiveNetworkInfo();

// 연결 상태 반환
return currentNetworkStatus != null && currentNetworkStatus.isConnected();
}
}

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Network 상태를 확인하기 위한 Util 입니다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

변수들을 final로 선언하신 이유를 알 수 있을까요??

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저같은 경우엔 잘못된 입력이나 변경을 막으려고 final 로 선언하여 사용하고 있습니다.

Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,14 @@
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

/*
* Activity 들이 가지는 공통의 설정
* DataBinding 을 이용한 View-Presenter 사이의 의존성을 약화
* MVP 패턴을 사용하므로 Presenter 도 동일한 설정 필요
*/
public abstract class BaseActivity<B extends ViewDataBinding, P extends BasePresenter> extends AppCompatActivity {

// Log 확인을 위한 TAG 설정. 기본적으로 클래스 이름으로 구분
protected final String TAG = getClass().getSimpleName();

protected B binding;
Expand All @@ -22,7 +29,9 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
// 화면 세로 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

// View 와 바인딩하기 위한 객체
binding = DataBindingUtil.setContentView(this, getLayoutId());
// Presenter 를 이용한 이벤트 위임
presenter = getPresenter();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.example.yeseul.movieapp.view;

/*
* 모든 Presenter 가 공통으로 가져야하는 함수들 선언 */
public interface BasePresenter {

void onViewCreated();
void onViewAttached();

void onViewDetached();

void loadItems(boolean isRefresh);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.example.yeseul.movieapp.view;

/*
* 모든 View 가 공통적으로 가져야하는 함수들 선언 */
public interface BaseView {

void makeToast(String text);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@

import java.util.List;

/*
* Google Architecture 에서 추천한 Adapter Interface 구조 */
public interface AdapterContract {

/* Adapter 가 달린 View 에서 발생하는 이벤트들만 가짐 */
interface View {

void setOnItemClickListener(OnItemClickListener itemClickListener);
}

/* Adapter 가 가진 Data 를 조작하는 함수들만 가짐 */
interface Model<T> {

T getItem(int position);
Expand Down
Loading