> {
7 |
8 | fun create(): P
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/java/io/blackbox_vision/helpers/helper/AppConstants.java:
--------------------------------------------------------------------------------
1 | package io.blackbox_vision.helpers.helper;
2 |
3 | public final class AppConstants {
4 | public static final String LAUNCH_MODE = "LAUNCH_MODE";
5 | public static final String TASK_ID = "TASK_ID";
6 |
7 | public static final String MODE_CREATE = "create";
8 | public static final String MODE_EDIT = "edit";
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/branded_launch.xml:
--------------------------------------------------------------------------------
1 |
> constructor(context: Context, private val factory: PresenterFactory
) : Loader
(context) { 11 | 12 | private var presenter: P? = null 13 | 14 | override fun onStartLoading() { 15 | super.onStartLoading() 16 | 17 | if (null != presenter) { 18 | deliverResult(presenter) 19 | } 20 | 21 | forceLoad() 22 | } 23 | 24 | override fun onForceLoad() { 25 | super.onForceLoad() 26 | presenter = factory.create() 27 | 28 | deliverResult(presenter) 29 | } 30 | 31 | override fun onReset() { 32 | super.onReset() 33 | 34 | if (null != presenter) { 35 | presenter!!.detachView() 36 | presenter = null 37 | } 38 | } 39 | 40 | companion object { 41 | fun
> newInstance(context: Context, factory: PresenterFactory
): PresenterLoader
{
42 | return PresenterLoader(context, factory)
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/library/src/main/java/io/blackbox_vision/mvphelpers/utils/bugfix/UserManagerLeaks.java:
--------------------------------------------------------------------------------
1 | package io.blackbox_vision.mvphelpers.utils.bugfix;
2 |
3 | import android.annotation.TargetApi;
4 | import android.app.Application;
5 | import android.content.Context;
6 | import android.os.UserManager;
7 | import android.util.Log;
8 |
9 | import java.lang.reflect.Method;
10 |
11 |
12 | public final class UserManagerLeaks {
13 | private static final String TAG = UserManagerLeaks.class.getSimpleName();
14 | private static final String GET_METHOD = "get";
15 |
16 | private UserManagerLeaks() {}
17 |
18 | /**
19 | * Dirty fix, since the UserManager.get() method is marked as hidden and can't be
20 | * accessed directly, the current solution it's to use reflection to invoke the get method.
21 | *
22 | * @param app - the Application instance where UserManager.get() will be triggered
23 | */
24 | @TargetApi(17)
25 | public static void fixLeakInGetMethod(Application app) {
26 | try {
27 | final Method m = UserManager.class.getMethod(GET_METHOD, Context.class);
28 | m.setAccessible(true);
29 | m.invoke(null, app);
30 |
31 | //above is reflection for below...
32 | //UserManager.get();
33 | } catch (Throwable e) {
34 | Log.e(TAG, e.getLocalizedMessage(), e.getCause());
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/library/src/main/java/io/blackbox_vision/mvphelpers/ui/view/BaseFrameLayout.kt:
--------------------------------------------------------------------------------
1 | package io.blackbox_vision.mvphelpers.ui.view
2 |
3 | import android.annotation.TargetApi
4 | import android.content.Context
5 | import android.util.AttributeSet
6 | import android.widget.FrameLayout
7 |
8 | import io.blackbox_vision.mvphelpers.logic.presenter.BasePresenter
9 |
10 |
11 | abstract class BaseFrameLayout , V : BaseView> : AppCompatActivity() {
18 |
19 | protected var presenter: P? = null
20 |
21 | public override fun onCreate(savedInstanceState: Bundle?) {
22 | super.onCreate(savedInstanceState)
23 | setContentView(layout)
24 |
25 | supportLoaderManager.initLoader(LOADER_ID, null, object : LoaderCallbacks {
26 | override fun onCreateLoader(id: Int, args: Bundle): Loader {
27 | return PresenterLoader.newInstance(applicationContext, createPresenterFactory())
28 | }
29 |
30 | override fun onLoadFinished(loader: Loader , basePresenter: P) {
31 | val presenterView = presenterView
32 | presenter = basePresenter
33 |
34 | if (null != presenterView) {
35 | presenter!!.attachView(presenterView)
36 | } else {
37 | Log.d(TAG, "View can't be attached because you don't implement it in your activity.")
38 | }
39 |
40 | onPresenterCreated(presenter!!)
41 | }
42 |
43 | override fun onLoaderReset(loader: Loader ) {
44 | if (isPresenterAvailable) {
45 | presenter!!.detachView()
46 | presenter = null
47 | }
48 |
49 | onPresenterDestroyed()
50 | }
51 | })
52 | }
53 |
54 | override fun onRestoreInstanceState(savedInstanceState: Bundle) {
55 | onPresenterStateRestore(presenter!!, savedInstanceState)
56 | super.onRestoreInstanceState(savedInstanceState)
57 | }
58 |
59 | override fun onSaveInstanceState(outState: Bundle) {
60 | onPresenterStateSave(presenter!!, outState)
61 | super.onSaveInstanceState(outState)
62 | }
63 |
64 | protected abstract fun createPresenterFactory(): PresenterFactory
65 |
66 | @get:LayoutRes
67 | protected abstract val layout: Int
68 |
69 | protected abstract fun onPresenterCreated(presenter: P)
70 |
71 | protected abstract fun onPresenterStateRestore(presenter: P, savedInstanceState: Bundle?)
72 |
73 | protected abstract fun onPresenterStateSave(presenter: P, outState: Bundle)
74 |
75 | protected abstract fun onPresenterDestroyed()
76 |
77 | protected val isPresenterAvailable: Boolean
78 | get() = presenter != null
79 |
80 | protected val presenterView: V?
81 | get() {
82 | var view: V? = null
83 |
84 | try {
85 | view = this as V
86 | } catch (ex: ClassCastException) {
87 | Log.e(TAG, "You should implement your view class in the activity.", ex.cause)
88 | }
89 |
90 | return view
91 | }
92 |
93 | companion object {
94 | private val TAG = "BaseActivity"
95 | private val LOADER_ID = 201
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/app/src/main/java/io/blackbox_vision/helpers/ui/adapter/TaskListAdapter.java:
--------------------------------------------------------------------------------
1 | package io.blackbox_vision.helpers.ui.adapter;
2 |
3 | import android.content.Context;
4 | import android.graphics.PorterDuff;
5 | import android.support.annotation.NonNull;
6 | import android.support.v4.content.ContextCompat;
7 | import android.support.v7.widget.RecyclerView;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 | import android.widget.ImageView;
12 | import android.widget.TextView;
13 |
14 | import java.util.List;
15 |
16 | import butterknife.BindView;
17 | import butterknife.ButterKnife;
18 |
19 | import io.blackbox_vision.helpers.R;
20 | import io.blackbox_vision.helpers.data.Task;
21 |
22 |
23 | public final class TaskListAdapter extends RecyclerView.Adapter , V : BaseView> : Fragment() {
22 |
23 | protected var presenter: P? = null
24 |
25 | override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
26 | return inflater!!.inflate(layout, container, false)
27 | }
28 |
29 | override fun onActivityCreated(savedInstanceState: Bundle?) {
30 | super.onActivityCreated(savedInstanceState)
31 |
32 | loaderManager.initLoader(LOADER_ID, Bundle(), object : LoaderCallbacks {
33 | override fun onCreateLoader(id: Int, args: Bundle): Loader {
34 | return PresenterLoader.newInstance(context, createPresenterFactory())
35 | }
36 |
37 | override fun onLoadFinished(loader: Loader , basePresenter: P) {
38 | val presenterView = presenterView
39 | presenter = basePresenter
40 |
41 | if (null != presenterView) {
42 | presenter!!.attachView(presenterView)
43 | } else {
44 | Log.d(TAG, "View can't be attached because you don't implement it in your fragment.")
45 | }
46 |
47 | onPresenterCreated(presenter!!, savedInstanceState)
48 | }
49 |
50 | override fun onLoaderReset(loader: Loader ) {
51 | if (isPresenterAvailable) {
52 | presenter!!.detachView()
53 | presenter = null
54 | }
55 |
56 | onPresenterDestroyed()
57 | }
58 | })
59 | }
60 |
61 | override fun onSaveInstanceState(outState: Bundle?) {
62 | onPresenterStateSave(presenter!!, outState!!)
63 | super.onSaveInstanceState(outState)
64 | }
65 |
66 | protected abstract fun createPresenterFactory(): PresenterFactory
67 |
68 | @get:LayoutRes
69 | protected abstract val layout: Int
70 |
71 | protected abstract fun onPresenterCreated(presenter: P, savedInstanceState: Bundle?)
72 |
73 | protected abstract fun onPresenterStateSave(presenter: P, outState: Bundle)
74 |
75 | protected abstract fun onPresenterDestroyed()
76 |
77 | protected val isPresenterAvailable: Boolean
78 | get() = presenter != null
79 |
80 | protected val presenterView: V?
81 | get() {
82 | var view: V? = null
83 |
84 | try {
85 | view = this as V
86 | } catch (ex: ClassCastException) {
87 | Log.e(TAG, "You should implement your view class in the fragment.", ex.cause)
88 | }
89 |
90 | return view
91 | }
92 |
93 | protected val applicationContext: Context
94 | get() = context.applicationContext
95 |
96 | companion object {
97 | private val TAG = "BaseFragment"
98 | private val LOADER_ID = 201
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/app/src/main/java/io/blackbox_vision/helpers/logic/interactor/AddTaskInteractor.java:
--------------------------------------------------------------------------------
1 | package io.blackbox_vision.helpers.logic.interactor;
2 |
3 | import android.support.annotation.NonNull;
4 | import android.text.TextUtils;
5 |
6 | import io.blackbox_vision.helpers.logic.error.TaskException;
7 | import io.blackbox_vision.helpers.data.Task;
8 | import io.blackbox_vision.mvphelpers.logic.interactor.BaseInteractor;
9 | import io.blackbox_vision.mvphelpers.logic.listener.OnErrorListener;
10 | import io.blackbox_vision.mvphelpers.logic.listener.OnSuccessListener;
11 |
12 |
13 | public final class AddTaskInteractor extends BaseInteractor {
14 | private static AddTaskInteractor addTaskInteractor = null;
15 |
16 | private AddTaskInteractor() { }
17 |
18 | public void addNewTask(@NonNull Task task,
19 | @NonNull OnErrorListener> successListener) {
26 | runOnBackground(() -> {
27 | List
2 | > Helper classes to build Android Apps through MVP pattern in a faster way
3 |
4 | [](https://opensource.org/licenses/MIT) []() [](https://jitpack.io/#BlackBoxVision/mvp-helpers) [](https://travis-ci.org/BlackBoxVision/mvp-helpers)
5 |
6 | **This library exposes a minimal API, that should help you to build well architected Android Apps. ¡Check the following steps to get up and running!**
7 |
8 | ## Installation
9 |
10 | Actually I don't have this library in **JCenter/Maven Central**, so if you want to use, follow the instructions. The library is distributed for Java and Kotlin. Looking for Kotlin variant? [Go here](https://github.com/BlackBoxVision/mvp-helpers/tree/kotlin)
11 |
12 | **Gradle**
13 |
14 | - Add it in your root build.gradle at the end of repositories:
15 | ```gradle
16 | allprojects {
17 | repositories {
18 | ...
19 | maven {
20 | url "https://jitpack.io"
21 | }
22 | }
23 | }
24 | ```
25 |
26 | - Add the dependency:
27 | ```gradle
28 | dependencies {
29 | compile 'com.github.BlackBoxVision:mvp-helpers:v0.2.0'
30 | }
31 | ```
32 |
33 | **Maven**
34 |
35 | - Add this line to repositories section in pom.xml:
36 | ```xml
37 |