├── .gitignore ├── README.md ├── app ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── gturedi │ │ └── simple_mvp_android │ │ ├── LoginResultListener.java │ │ ├── home │ │ ├── HomeView.java │ │ └── HomeViewImpl.java │ │ └── login │ │ ├── LoginModel.java │ │ ├── LoginModelImpl.java │ │ ├── LoginPresenter.java │ │ ├── LoginPresenterImpl.java │ │ ├── LoginView.java │ │ └── LoginViewImpl.java │ └── res │ ├── layout │ ├── activity_home.xml │ ├── activity_login.xml │ ├── activity_main.xml │ └── content_main.xml │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | build 3 | /*/build/ 4 | .idea 5 | .gradle 6 | 7 | local.properties 8 | 9 | *.iml -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | simple android project created with mvp pattern 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "gturedi.simple_mvp_android" 9 | minSdkVersion 16 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | } 15 | 16 | dependencies { 17 | compile 'com.android.support:appcompat-v7:23.+' 18 | compile 'com.android.support:design:23.+' 19 | compile 'com.jakewharton:butterknife:7.+' 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/java/gturedi/simple_mvp_android/LoginResultListener.java: -------------------------------------------------------------------------------- 1 | package gturedi.simple_mvp_android; 2 | 3 | public interface LoginResultListener { 4 | 5 | void onSuccess(); 6 | void onFail(); 7 | 8 | } -------------------------------------------------------------------------------- /app/src/main/java/gturedi/simple_mvp_android/home/HomeView.java: -------------------------------------------------------------------------------- 1 | package gturedi.simple_mvp_android.home; 2 | 3 | public interface HomeView { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/java/gturedi/simple_mvp_android/home/HomeViewImpl.java: -------------------------------------------------------------------------------- 1 | package gturedi.simple_mvp_android.home; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | import gturedi.simple_mvp_android.R; 7 | 8 | public class HomeViewImpl 9 | extends AppCompatActivity 10 | implements HomeView { 11 | 12 | @Override 13 | protected void onCreate(Bundle savedInstanceState) { 14 | super.onCreate(savedInstanceState); 15 | setContentView(R.layout.activity_home); 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /app/src/main/java/gturedi/simple_mvp_android/login/LoginModel.java: -------------------------------------------------------------------------------- 1 | package gturedi.simple_mvp_android.login; 2 | 3 | import gturedi.simple_mvp_android.LoginResultListener; 4 | 5 | // aslında sınıf ismi LoginService olsa daha uygun fakat mvp eşletiştirme kolay olsun diye böyle adlandırdım 6 | public interface LoginModel { 7 | 8 | void doLogin(String user, String pass, LoginResultListener listener); 9 | 10 | } -------------------------------------------------------------------------------- /app/src/main/java/gturedi/simple_mvp_android/login/LoginModelImpl.java: -------------------------------------------------------------------------------- 1 | package gturedi.simple_mvp_android.login; 2 | 3 | import android.os.Handler; 4 | import gturedi.simple_mvp_android.LoginResultListener; 5 | 6 | public class LoginModelImpl 7 | implements LoginModel { 8 | 9 | public static final String USER = "fener"; 10 | public static final String PASS = "1907"; 11 | 12 | @Override 13 | public void doLogin(final String user, final String pass, final LoginResultListener listener) { 14 | // burda asenkron islemi karsilayan islemler ui thread'de calistigi icin 15 | // handler kullandım fakat aslında model katmanının android framework'une bagımlı olmaması gerekli 16 | // yoksa atıyorum aynı uygulamanın desktop/swing uyarlaması yazılırken sadece view'inin degismesi gerekli 17 | new Handler().postDelayed(new Runnable() { 18 | @Override 19 | public void run() { 20 | if (user.equals(USER) && pass.equals(PASS)) { 21 | listener.onSuccess(); 22 | } else { 23 | listener.onFail(); 24 | } 25 | } 26 | }, 1500); 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /app/src/main/java/gturedi/simple_mvp_android/login/LoginPresenter.java: -------------------------------------------------------------------------------- 1 | package gturedi.simple_mvp_android.login; 2 | 3 | public interface LoginPresenter { 4 | 5 | void login(String user, String pass); 6 | 7 | } -------------------------------------------------------------------------------- /app/src/main/java/gturedi/simple_mvp_android/login/LoginPresenterImpl.java: -------------------------------------------------------------------------------- 1 | package gturedi.simple_mvp_android.login; 2 | 3 | import gturedi.simple_mvp_android.LoginResultListener; 4 | 5 | public class LoginPresenterImpl 6 | implements LoginPresenter { 7 | 8 | private final LoginView view; 9 | private final LoginModel model; 10 | 11 | public LoginPresenterImpl(LoginView view, LoginModel model) { 12 | this.view = view; 13 | this.model = model; 14 | } 15 | 16 | @Override 17 | public void login(String user, String pass) { 18 | view.showLoading(); 19 | model.doLogin(user, pass, new LoginResultListener() { 20 | @Override 21 | public void onSuccess() { 22 | view.navigateToHome(); 23 | } 24 | @Override 25 | public void onFail() { 26 | view.showError("given credentials are not valid"); 27 | } 28 | }); 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /app/src/main/java/gturedi/simple_mvp_android/login/LoginView.java: -------------------------------------------------------------------------------- 1 | package gturedi.simple_mvp_android.login; 2 | 3 | public interface LoginView { 4 | 5 | void showLoading(); 6 | void hideLoading(); 7 | void showError(String msg); 8 | void navigateToHome(); 9 | 10 | } -------------------------------------------------------------------------------- /app/src/main/java/gturedi/simple_mvp_android/login/LoginViewImpl.java: -------------------------------------------------------------------------------- 1 | package gturedi.simple_mvp_android.login; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.design.widget.Snackbar; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | import android.widget.Button; 9 | import android.widget.EditText; 10 | import android.widget.ProgressBar; 11 | 12 | import butterknife.Bind; 13 | import butterknife.ButterKnife; 14 | import butterknife.OnClick; 15 | import gturedi.simple_mvp_android.R; 16 | import gturedi.simple_mvp_android.home.HomeViewImpl; 17 | 18 | // aslında sınıf ismi LoginActivity olsa daha uygun fakat mvp eşletiştirme kolay olsun diye böyle adlandırdım 19 | public class LoginViewImpl 20 | extends AppCompatActivity 21 | implements LoginView { 22 | 23 | @Bind(R.id.user) 24 | protected EditText user; 25 | @Bind(R.id.pass) 26 | protected EditText pass; 27 | @Bind(R.id.login) 28 | protected Button login; 29 | @Bind(R.id.progress) 30 | protected ProgressBar progress; 31 | 32 | protected LoginPresenter presenter; 33 | 34 | @Override 35 | protected void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | setContentView(R.layout.activity_login); 38 | ButterKnife.bind(this); 39 | // basit tutmak adına dagger(dependency injection) kullanmadım, kullanmak daha makbul 40 | presenter = new LoginPresenterImpl(this, new LoginModelImpl()); 41 | } 42 | 43 | @Override 44 | public void showLoading() { 45 | progress.setVisibility(View.VISIBLE); 46 | login.setEnabled(false); 47 | } 48 | 49 | @Override 50 | public void hideLoading() { 51 | progress.setVisibility(View.GONE); 52 | login.setEnabled(true); 53 | } 54 | 55 | @Override 56 | public void showError(String msg) { 57 | hideLoading(); 58 | Snackbar.make(user, msg, Snackbar.LENGTH_SHORT).show(); 59 | } 60 | 61 | @Override 62 | public void navigateToHome() { 63 | startActivity(new Intent(this, HomeViewImpl.class)); 64 | finish(); 65 | } 66 | 67 | @OnClick(R.id.login) 68 | public void loginClick(View view) { 69 | String userVal = user.getText().toString().trim(); 70 | String passVal = pass.getText().toString().trim(); 71 | presenter.login(userVal, passVal); 72 | } 73 | 74 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_home.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_login.xml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 19 | 20 | 28 | 29 |