diff --git a/.gitignore b/.gitignore index 3c117df..7973735 100644 --- a/.gitignore +++ b/.gitignore @@ -34,13 +34,14 @@ captures/ # IntelliJ *.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/assetWizardSettings.xml -.idea/dictionaries -.idea/libraries -.idea/caches +.idea +#.idea/workspace.xml +#.idea/tasks.xml +#.idea/gradle.xml +#.idea/assetWizardSettings.xml +#.idea/dictionaries +#.idea/libraries +#.idea/caches # Keystore files # Uncomment the following line if you do not want to check your keystore files in. diff --git a/.idea/misc.xml b/.idea/misc.xml index eb2d820..eb78749 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -50,7 +50,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 5eaea3b..4966fbb 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'com.android.application' +apply plugin: 'realm-android' android { compileSdkVersion 27 @@ -18,42 +19,39 @@ android { buildConfigField "String", "BASE_URL", "\"https://private-986f5d-afghazy.apiary-mock.com/\"" } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.1.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' - implementation 'com.android.support:design:27.1.1' - implementation 'com.android.support:recyclerview-v7:27.1.1' implementation 'com.android.support:cardview-v7:27.1.1' - implementation 'com.github.bumptech.glide:glide:4.7.1' - provided 'org.glassfish:javax.annotation:10.0-b28' - implementation 'com.google.code.gson:gson:2.8.2' implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:adapter-rxjava:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.retrofit2:converter-scalars:2.1.0' - implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' implementation 'io.reactivex.rxjava2:rxjava:2.1.9' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' - implementation 'com.google.dagger:dagger:2.11' annotationProcessor 'com.google.dagger:dagger-compiler:2.11' - implementation 'com.google.dagger:dagger-android:2.11' // If you're using classes in dagger.android - implementation 'com.google.dagger:dagger-android-support:2.11' // if you use the support libraries + implementation 'com.google.dagger:dagger-android:2.11' + // If you're using classes in dagger.android + implementation 'com.google.dagger:dagger-android-support:2.11' + // if you use the support libraries annotationProcessor 'com.google.dagger:dagger-android-processor:2.11' - provided 'javax.annotation:jsr250-api:1.0' - implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bb72880..851f721 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,13 @@ package="com.blink22.android.mvpandroid"> + + + + + + + - @@ -20,9 +27,38 @@ + + - + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/blink22/android/mvpandroid/BaseApp.java b/app/src/main/java/com/blink22/android/mvpandroid/BaseApp.java index a016d87..16d7027 100644 --- a/app/src/main/java/com/blink22/android/mvpandroid/BaseApp.java +++ b/app/src/main/java/com/blink22/android/mvpandroid/BaseApp.java @@ -2,30 +2,34 @@ import android.app.Application; -import com.blink22.android.mvpandroid.di.AppModule; -import com.blink22.android.mvpandroid.di.DaggerNetworkComponent; -import com.blink22.android.mvpandroid.di.NetworkComponent; -import com.blink22.android.mvpandroid.di.NetworkModule; +import com.blink22.android.mvpandroid.data.DataManager; +import com.blink22.android.mvpandroid.di.component.ApplicationComponent; +import com.blink22.android.mvpandroid.di.component.DaggerApplicationComponent; +import com.blink22.android.mvpandroid.di.module.ApplicationModule; + +import javax.inject.Inject; /** * Created by ahmedghazy on 7/29/18. */ public class BaseApp extends Application { - NetworkComponent mNetworkComponent; + + @Inject DataManager mDataManager; + ApplicationComponent mApplicationComponent; @Override public void onCreate() { super.onCreate(); - mNetworkComponent = DaggerNetworkComponent.builder() - .appModule(new AppModule(this)) - .networkModule(new NetworkModule()) + mApplicationComponent = DaggerApplicationComponent.builder() + .applicationModule(new ApplicationModule(this)) .build(); + mApplicationComponent.inject(this); } - public NetworkComponent getNetworkComponent() { - return mNetworkComponent; + public ApplicationComponent getComponent() { + return mApplicationComponent; } } diff --git a/app/src/main/java/com/blink22/android/mvpandroid/BasePresenter.java b/app/src/main/java/com/blink22/android/mvpandroid/BasePresenter.java deleted file mode 100755 index bcc2ca6..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/BasePresenter.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.blink22.android.mvpandroid; - -import android.arch.lifecycle.LifecycleObserver; - -/** - * Created by ahmedghazy on 7/25/18. - */ - -public interface BasePresenter extends LifecycleObserver{ - - void start(); - - void stop(); -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/BaseView.java b/app/src/main/java/com/blink22/android/mvpandroid/BaseView.java deleted file mode 100755 index 99cd878..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/BaseView.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.blink22.android.mvpandroid; - -/** - * Created by ahmedghazy on 7/25/18. - */ - -public interface BaseView { - - void setPresenter(T presenter); - -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/adapters/TodosAdapter.java b/app/src/main/java/com/blink22/android/mvpandroid/adapters/TodosAdapter.java deleted file mode 100755 index 37f38e1..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/adapters/TodosAdapter.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.blink22.android.mvpandroid.adapters; - -import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; - -import com.blink22.android.mvpandroid.R; -import com.blink22.android.mvpandroid.models.Todo; -import com.blink22.android.mvpandroid.viewHolders.TodosVH; - -import java.util.ArrayList; - -/** - * Created by ahmedghazy on 7/25/18. - */ - -public class TodosAdapter extends RecyclerView.Adapter { - - private final OnItemClickListener mListener; - private ArrayList mData; - private Context mContext; - - public TodosAdapter(Context context, ArrayList data, OnItemClickListener listener) { - mData = data; - mListener = listener; - mContext = context; - } - - @Override - public TodosVH onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_todos, null); - return new TodosVH(view); - } - - @Override - public void onBindViewHolder(TodosVH holder, int position) { - holder.bind(mData.get(position), mListener); - } - - @Override - public int getItemCount() { - return mData.size(); - } - - public interface OnItemClickListener { - void onClick(Todo item); - } -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/data/AppDataManager.java b/app/src/main/java/com/blink22/android/mvpandroid/data/AppDataManager.java new file mode 100644 index 0000000..73a67fe --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/data/AppDataManager.java @@ -0,0 +1,115 @@ +package com.blink22.android.mvpandroid.data; + +import android.content.SyncResult; + +import com.blink22.android.mvpandroid.data.api.ApiHelper; +import com.blink22.android.mvpandroid.data.db.DbHelper; +import com.blink22.android.mvpandroid.data.db.model.Todo; +import com.blink22.android.mvpandroid.data.prefs.PrefsHelper; + +import java.util.ArrayList; +import java.util.Date; + +import javax.inject.Inject; + +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import io.realm.Realm; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +public class AppDataManager implements DataManager { + private ApiHelper mApiHelper; + private DbHelper mDbHelper; + private PrefsHelper mPrefsHelper; + + @Inject + public AppDataManager(ApiHelper apiHelper, DbHelper dbHelper, PrefsHelper prefsHelper) { + mApiHelper = apiHelper; + mDbHelper = dbHelper; + mPrefsHelper = prefsHelper; + } + + + @Override + public Observable saveTodo(Todo todo) { + + return mDbHelper.saveTodo(todo); + } + + @Override + public Observable updateTodo(int id, Todo todo) { + return mDbHelper.updateTodo(id, todo); + } + + @Override + public Observable> getTodos() { + return mDbHelper.getTodos(); + + } + + @Override + public void syncData() { + mApiHelper.getTodos() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + apiTodos -> { + mDbHelper.getTodos() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + dbTodos -> { + syncMissingAndUpdatedVersionOfTodos(dbTodos, apiTodos, mApiHelper); + syncMissingAndUpdatedVersionOfTodos(apiTodos, dbTodos, mDbHelper); + }, + throwable -> {}, + () -> {} + + ); + }, + throwable -> {}, + () -> {}); + } + + @Override + public boolean isSyncDone() { + return mPrefsHelper.isSyncDone(); + } + + @Override + public void setSyncDone(boolean syncRequired) { + mPrefsHelper.setSyncDone(syncRequired); + } + + private void syncMissingAndUpdatedVersionOfTodos(ArrayList sourceArr, ArrayList destinationArr, ApiHelper destination) { + for(Todo srcTodo: sourceArr) { + boolean mostRecent = false; + boolean found = false; + for(Todo destTodo: destinationArr) { + if(srcTodo.getId() == destTodo.getId()) { + found = true; + if (new Date(srcTodo.getUpdatedDate()).compareTo(new Date(destTodo.getUpdatedDate())) > 0) { + mostRecent = true; + } + } + } + + if(!found) { + destination.saveTodo(srcTodo).subscribeOn(Schedulers.io()).subscribe(); + } + else { + if(mostRecent) { + destination.updateTodo(srcTodo.getId(), srcTodo).subscribeOn(Schedulers.io()).subscribe(); + } + } + } + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/data/DataManager.java b/app/src/main/java/com/blink22/android/mvpandroid/data/DataManager.java new file mode 100644 index 0000000..ed76ec3 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/data/DataManager.java @@ -0,0 +1,23 @@ +package com.blink22.android.mvpandroid.data; + +import android.content.SyncResult; + +import com.blink22.android.mvpandroid.data.api.ApiHelper; +import com.blink22.android.mvpandroid.data.db.DbHelper; +import com.blink22.android.mvpandroid.data.db.model.Todo; +import com.blink22.android.mvpandroid.data.prefs.PrefsHelper; + +import java.util.ArrayList; + +import io.reactivex.Observable; +import io.realm.Realm; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +public interface DataManager extends PrefsHelper, ApiHelper{ + + void syncData(); + +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/data/api/ApiEndPoint.java b/app/src/main/java/com/blink22/android/mvpandroid/data/api/ApiEndPoint.java new file mode 100644 index 0000000..417c6d2 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/data/api/ApiEndPoint.java @@ -0,0 +1,15 @@ +package com.blink22.android.mvpandroid.data.api; + +import com.blink22.android.mvpandroid.BuildConfig; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +//cannot be extended +public final class ApiEndPoint { + + public static final String TODOS = BuildConfig.BASE_URL; + + +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/apiinterfaces/TodosService.java b/app/src/main/java/com/blink22/android/mvpandroid/data/api/ApiHelper.java similarity index 63% rename from app/src/main/java/com/blink22/android/mvpandroid/apiinterfaces/TodosService.java rename to app/src/main/java/com/blink22/android/mvpandroid/data/api/ApiHelper.java index f2ec1aa..3fd9f69 100644 --- a/app/src/main/java/com/blink22/android/mvpandroid/apiinterfaces/TodosService.java +++ b/app/src/main/java/com/blink22/android/mvpandroid/data/api/ApiHelper.java @@ -1,6 +1,6 @@ -package com.blink22.android.mvpandroid.apiinterfaces; +package com.blink22.android.mvpandroid.data.api; -import com.blink22.android.mvpandroid.models.Todo; +import com.blink22.android.mvpandroid.data.db.model.Todo; import java.util.ArrayList; @@ -12,16 +12,15 @@ import retrofit2.http.Path; /** - * Created by ahmedghazy on 7/25/18. + * Created by ahmedghazy on 7/30/18. */ -public interface TodosService { - +public interface ApiHelper { @GET("/todos") Observable> getTodos(); @POST("/todos") - Observable createTodo(@Body Todo todo); + Observable saveTodo(@Body Todo todo); @PUT("/todos/{id}") Observable updateTodo(@Path("id") int id, @Body Todo todo); diff --git a/app/src/main/java/com/blink22/android/mvpandroid/data/api/AppApiHelper.java b/app/src/main/java/com/blink22/android/mvpandroid/data/api/AppApiHelper.java new file mode 100644 index 0000000..8c87b9c --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/data/api/AppApiHelper.java @@ -0,0 +1,39 @@ +package com.blink22.android.mvpandroid.data.api; + +import com.blink22.android.mvpandroid.data.db.model.Todo; + +import java.util.ArrayList; +import java.util.Date; + +import javax.inject.Inject; + +import io.reactivex.Observable; +import retrofit2.Retrofit; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +public class AppApiHelper implements ApiHelper { + ApiHelper mApiHelper; + + @Inject + public AppApiHelper(Retrofit retrofit) { + mApiHelper = retrofit.create(ApiHelper.class); + } + + @Override + public Observable> getTodos() { + return mApiHelper.getTodos(); + } + + @Override + public Observable saveTodo(Todo todo) { + return mApiHelper.saveTodo(todo); + } + + @Override + public Observable updateTodo(int id, Todo todo) { + return mApiHelper.updateTodo(id, todo); + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/data/db/AppDbHelper.java b/app/src/main/java/com/blink22/android/mvpandroid/data/db/AppDbHelper.java new file mode 100644 index 0000000..457b0ca --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/data/db/AppDbHelper.java @@ -0,0 +1,105 @@ +package com.blink22.android.mvpandroid.data.db; + +import android.arch.lifecycle.Lifecycle; +import android.arch.lifecycle.LifecycleObserver; +import android.arch.lifecycle.OnLifecycleEvent; + +import com.blink22.android.mvpandroid.data.db.model.Todo; + +import java.util.ArrayList; + +import javax.inject.Inject; + +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; +import io.realm.Realm; +import io.realm.RealmResults; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +public class AppDbHelper implements DbHelper, LifecycleObserver { + Realm mRealm; + + @Inject + public AppDbHelper(Realm realm) { + mRealm = realm; + } + + @Override + public Observable saveTodo(final Todo todo) { + + Observable observable = Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(final ObservableEmitter emitter) throws Exception { + try { + final Realm currentRealm = Realm.getDefaultInstance(); + currentRealm.executeTransaction(new Realm.Transaction() { + @Override + public void execute(Realm realm) { + realm.copyToRealm(todo); + emitter.onNext(todo); + } + }); + } catch (Exception e) { + emitter.onError(e); + } + } + }); + + return observable; + } + + @Override + public Observable updateTodo(final int id, final Todo todo) { + final Observable observable = Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(final ObservableEmitter emitter) throws Exception { + try { + final Realm currentRealm = Realm.getDefaultInstance(); + currentRealm.executeTransaction(new Realm.Transaction() { + @Override + public void execute(Realm realm) { + Todo gTodo = realm.where(Todo.class).equalTo("id", id).findFirst(); + gTodo.set(todo); + emitter.onNext(gTodo); + } + }); + } + catch (Exception e) { + emitter.onError(e); + } + } + }); + + return observable; + } + + @Override + public Observable> getTodos() { + + + Observable> observable = Observable.create(new ObservableOnSubscribe>() { + @Override + public void subscribe(final ObservableEmitter> emitter) throws Exception { + try { + final Realm currentRealm = Realm.getDefaultInstance(); + currentRealm.executeTransaction(new Realm.Transaction() { + @Override + public void execute(Realm realm) { + RealmResults realmResults = realm.where(Todo.class).findAll(); + emitter.onNext(new ArrayList(realm.copyFromRealm(realmResults))); + emitter.onComplete(); + } + }); + } catch (Exception e) { + emitter.onError(e); + } + } + }); + + return observable; + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/data/db/DbHelper.java b/app/src/main/java/com/blink22/android/mvpandroid/data/db/DbHelper.java new file mode 100644 index 0000000..f2ca8bc --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/data/db/DbHelper.java @@ -0,0 +1,11 @@ +package com.blink22.android.mvpandroid.data.db; + +import com.blink22.android.mvpandroid.data.api.ApiHelper; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +public interface DbHelper extends ApiHelper { + +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/data/db/model/Todo.java b/app/src/main/java/com/blink22/android/mvpandroid/data/db/model/Todo.java new file mode 100644 index 0000000..77887b2 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/data/db/model/Todo.java @@ -0,0 +1,76 @@ +package com.blink22.android.mvpandroid.data.db.model; + +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; + +import io.realm.RealmObject; +import io.realm.annotations.PrimaryKey; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +public class Todo extends RealmObject { + @PrimaryKey + private int id; + private String title; + private String description; + private boolean done; + private String updatedDate; + + public Todo(int id) { + this.id = id; + } + + public void set(Todo todo) { + setTitle(todo.getTitle()); + setDescription(todo.getDescription()); + setDone(todo.isDone()); + } + + private static final AtomicInteger ai = new AtomicInteger(); + + public Todo() { + id = ai.addAndGet(1); + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public boolean isDone() { + return done; + } + + public void setDone(boolean done) { + this.done = done; + } + + public String getUpdatedDate() { + return updatedDate; + } + + public void setUpdatedDate(String updatedDate) { + this.updatedDate = updatedDate; + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/models/NavigationItemEnum.java b/app/src/main/java/com/blink22/android/mvpandroid/data/model/NavigationItemEnum.java similarity index 84% rename from app/src/main/java/com/blink22/android/mvpandroid/models/NavigationItemEnum.java rename to app/src/main/java/com/blink22/android/mvpandroid/data/model/NavigationItemEnum.java index ace0794..855b5a3 100755 --- a/app/src/main/java/com/blink22/android/mvpandroid/models/NavigationItemEnum.java +++ b/app/src/main/java/com/blink22/android/mvpandroid/data/model/NavigationItemEnum.java @@ -1,8 +1,8 @@ -package com.blink22.android.mvpandroid.models; +package com.blink22.android.mvpandroid.data.model; import com.blink22.android.mvpandroid.R; -import com.blink22.android.mvpandroid.newTodo.NewTodoActivity; -import com.blink22.android.mvpandroid.todos.TodosActivity; +import com.blink22.android.mvpandroid.ui.newtodo.NewTodoActivity; +import com.blink22.android.mvpandroid.ui.todos.TodosActivity; /** * Created by ahmedghazy on 7/26/18. diff --git a/app/src/main/java/com/blink22/android/mvpandroid/data/prefs/AppPrefsHelper.java b/app/src/main/java/com/blink22/android/mvpandroid/data/prefs/AppPrefsHelper.java new file mode 100644 index 0000000..4dbe179 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/data/prefs/AppPrefsHelper.java @@ -0,0 +1,31 @@ +package com.blink22.android.mvpandroid.data.prefs; + +import android.content.SharedPreferences; + +import javax.inject.Inject; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +public class AppPrefsHelper implements PrefsHelper { + SharedPreferences mSharedPreferences; + + private static final String PREF_KEY_SYNC_REQUIRED = "PREF_KEY_SYNC_REQUIRED"; + + @Inject + public AppPrefsHelper(SharedPreferences sharedPreferences) { + mSharedPreferences = sharedPreferences; + } + + + @Override + public boolean isSyncDone() { + return mSharedPreferences.getBoolean(PREF_KEY_SYNC_REQUIRED, false); + } + + @Override + public void setSyncDone(boolean syncRequired) { + mSharedPreferences.edit().putBoolean(PREF_KEY_SYNC_REQUIRED, syncRequired).commit(); + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/data/prefs/PrefsHelper.java b/app/src/main/java/com/blink22/android/mvpandroid/data/prefs/PrefsHelper.java new file mode 100644 index 0000000..f1b6481 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/data/prefs/PrefsHelper.java @@ -0,0 +1,11 @@ +package com.blink22.android.mvpandroid.data.prefs; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +public interface PrefsHelper { + boolean isSyncDone(); + + void setSyncDone(boolean syncRequired); +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/di/AppModule.java b/app/src/main/java/com/blink22/android/mvpandroid/di/AppModule.java deleted file mode 100644 index f8bd99c..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/di/AppModule.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.blink22.android.mvpandroid.di; - -import android.app.Application; - -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; - -/** - * Created by ahmedghazy on 7/29/18. - */ - -@Module -public class AppModule { - Application mApplication; - - public AppModule(Application application) { - mApplication = application; - } - - @Provides - @Singleton - public Application providesApplication() { - return mApplication; - } -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/di/NetworkComponent.java b/app/src/main/java/com/blink22/android/mvpandroid/di/NetworkComponent.java deleted file mode 100644 index 42e5e28..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/di/NetworkComponent.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.blink22.android.mvpandroid.di; - -import com.blink22.android.mvpandroid.newTodo.NewTodoActivity; -import com.blink22.android.mvpandroid.newTodo.NewTodoFragment; -import com.blink22.android.mvpandroid.todos.TodosActivity; -import com.blink22.android.mvpandroid.todos.TodosFragment; - -import javax.inject.Singleton; - -import dagger.Component; - -/** - * Created by ahmedghazy on 7/29/18. - */ - -@Singleton -@Component(modules={AppModule.class, NetworkModule.class}) -public interface NetworkComponent { - void inject(TodosFragment todosFragment); - void inject(NewTodoFragment newTodoFragment); -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/di/NetworkModule.java b/app/src/main/java/com/blink22/android/mvpandroid/di/NetworkModule.java deleted file mode 100644 index 9596d74..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/di/NetworkModule.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.blink22.android.mvpandroid.di; - -import android.app.Application; - -import com.blink22.android.mvpandroid.BuildConfig; -import com.blink22.android.mvpandroid.apiinterfaces.TodosService; -import com.blink22.android.mvpandroid.network.TodosSubscriber; -import com.google.gson.Gson; - -import java.io.File; - -import javax.inject.Named; -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import okhttp3.Cache; -import okhttp3.OkHttpClient; -import retrofit2.CallAdapter; -import retrofit2.Retrofit; -import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; -import retrofit2.converter.gson.GsonConverterFactory; - -/** - * Created by ahmedghazy on 7/29/18. - */ - -@Module -public class NetworkModule { - @Provides - @Named("api_url") - String provideApiLink() { - return BuildConfig.BASE_URL; - } - - @Provides - @Singleton - Cache provideOkHttpCache(Application application) { - int cacheSize = 5 * 1024 * 1024; - Cache cache = new Cache(application.getCacheDir(), cacheSize); - return cache; - } - - @Provides - @Singleton - @Named("cached") - OkHttpClient provideOkHttpClient(Cache cache) { - OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(cache).build(); - return okHttpClient; - } - - @Provides - @Singleton - @Named("non_cached") - OkHttpClient provideOkHttpClientNonCached() { - OkHttpClient okHttpClient = new OkHttpClient(); - return okHttpClient; - } - - @Provides - @Singleton - @Named("rxjava2_call_adapter") - CallAdapter.Factory provideCallAdapterFactory() { - return RxJava2CallAdapterFactory.create(); - } - - @Provides - @Singleton - Retrofit provideRetrofit(@Named("cached") OkHttpClient okHttpClient, - @Named("rxjava2_call_adapter") CallAdapter.Factory rxJava2CallAdapterFactory, - @Named("api_url") String url) { - return new Retrofit.Builder() - .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(rxJava2CallAdapterFactory) - .baseUrl(url) - .client(okHttpClient) - .build(); - } - - @Provides - @Singleton - TodosService provideTodosService(Retrofit retrofit) { - return retrofit.create(TodosService.class); - } - - @Provides - @Singleton - TodosSubscriber provideTodosSubscriber(TodosService todosService) { - return new TodosSubscriber(todosService); - } -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/di/component/ActivityComponent.java b/app/src/main/java/com/blink22/android/mvpandroid/di/component/ActivityComponent.java new file mode 100644 index 0000000..6286a57 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/di/component/ActivityComponent.java @@ -0,0 +1,22 @@ +package com.blink22.android.mvpandroid.di.component; + +import com.blink22.android.mvpandroid.di.scope.PerActivity; +import com.blink22.android.mvpandroid.di.module.ActivityModule; +import com.blink22.android.mvpandroid.ui.newtodo.NewTodoActivity; +import com.blink22.android.mvpandroid.ui.todos.TodosActivity; + +import dagger.Component; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +@PerActivity +@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class) +public interface ActivityComponent { + + void inject(TodosActivity todosActivity); + + void inject(NewTodoActivity newTodoActivity); + +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/di/component/ApplicationComponent.java b/app/src/main/java/com/blink22/android/mvpandroid/di/component/ApplicationComponent.java new file mode 100644 index 0000000..273a275 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/di/component/ApplicationComponent.java @@ -0,0 +1,28 @@ +package com.blink22.android.mvpandroid.di.component; + +import android.app.Application; +import android.content.Context; + +import com.blink22.android.mvpandroid.data.DataManager; +import com.blink22.android.mvpandroid.di.module.ApplicationModule; + +import javax.inject.Named; +import javax.inject.Singleton; + +import dagger.Component; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +@Singleton +@Component(modules = ApplicationModule.class) +public interface ApplicationComponent { + + void inject(Application application); + + @Named("application_context") Context getApplicationContext(); + + DataManager dataManager(); + +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/di/component/SyncAdapterComponent.java b/app/src/main/java/com/blink22/android/mvpandroid/di/component/SyncAdapterComponent.java new file mode 100644 index 0000000..50b1533 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/di/component/SyncAdapterComponent.java @@ -0,0 +1,21 @@ +package com.blink22.android.mvpandroid.di.component; + +import com.blink22.android.mvpandroid.di.scope.PerSyncService; +import com.blink22.android.mvpandroid.di.module.SyncAdapterModule; +import com.blink22.android.mvpandroid.service.SyncAdapter; + +import javax.inject.Named; + +import dagger.Component; + +/** + * Created by ahmedghazy on 7/31/18. + */ + +@PerSyncService +@Component(dependencies = ApplicationComponent.class, modules = SyncAdapterModule.class) +public interface SyncAdapterComponent { + + void inject(SyncAdapter syncAdapter); + +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/di/module/ActivityModule.java b/app/src/main/java/com/blink22/android/mvpandroid/di/module/ActivityModule.java new file mode 100644 index 0000000..b00bcd2 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/di/module/ActivityModule.java @@ -0,0 +1,47 @@ +package com.blink22.android.mvpandroid.di.module; + +import android.content.Context; +import android.support.v7.app.AppCompatActivity; + +import com.blink22.android.mvpandroid.di.scope.PerActivity; +import com.blink22.android.mvpandroid.ui.newtodo.NewTodoContract; +import com.blink22.android.mvpandroid.ui.newtodo.NewTodoPresenter; +import com.blink22.android.mvpandroid.ui.todos.TodosContract; +import com.blink22.android.mvpandroid.ui.todos.TodosPresenter; + +import javax.inject.Named; + +import dagger.Module; +import dagger.Provides; +import io.reactivex.disposables.CompositeDisposable; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +@Module +public class ActivityModule { + private AppCompatActivity mAppCompatActivity; + + public ActivityModule(AppCompatActivity appCompatActivity) { + mAppCompatActivity = appCompatActivity; + } + + @Provides + @Named("activity_context") + Context provideContext() { return mAppCompatActivity; } + + @Provides + AppCompatActivity provideActivity() { return mAppCompatActivity; } + + @Provides + CompositeDisposable provideCompositeDisposable() { return new CompositeDisposable(); } + + @Provides + @PerActivity + TodosContract.Presenter provideTodosPresenter(TodosPresenter todosPresenter) { return todosPresenter; } + + @Provides + @PerActivity + NewTodoContract.Presenter provideNewTodoPresenter(NewTodoPresenter newTodoPresenter) { return newTodoPresenter; } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/di/module/ApplicationModule.java b/app/src/main/java/com/blink22/android/mvpandroid/di/module/ApplicationModule.java new file mode 100644 index 0000000..8f74a33 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/di/module/ApplicationModule.java @@ -0,0 +1,146 @@ +package com.blink22.android.mvpandroid.di.module; + +import android.app.Application; +import android.content.Context; +import android.content.SharedPreferences; + +import com.blink22.android.mvpandroid.BuildConfig; +import com.blink22.android.mvpandroid.data.AppDataManager; +import com.blink22.android.mvpandroid.data.DataManager; +import com.blink22.android.mvpandroid.data.api.ApiEndPoint; +import com.blink22.android.mvpandroid.data.api.ApiHelper; +import com.blink22.android.mvpandroid.data.api.AppApiHelper; +import com.blink22.android.mvpandroid.data.db.AppDbHelper; +import com.blink22.android.mvpandroid.data.db.DbHelper; +import com.blink22.android.mvpandroid.data.prefs.AppPrefsHelper; +import com.blink22.android.mvpandroid.data.prefs.PrefsHelper; +import com.blink22.android.mvpandroid.utils.AppConstants; + +import javax.inject.Named; +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import io.realm.Realm; +import okhttp3.Cache; +import okhttp3.OkHttpClient; +import retrofit2.CallAdapter; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +@Module +public class ApplicationModule { + + private final Application mApplication; + + public ApplicationModule(Application application) { + mApplication = application; + } + + @Provides + @Named("application_context") + Context provideContext() { + return mApplication; + } + + @Provides + Application provideApplication() { + return mApplication; + } + + @Provides + SharedPreferences provideSharedPreferences(@Named("shared_pref_name") String sharedPrefsName) { + return mApplication.getSharedPreferences(sharedPrefsName, Context.MODE_PRIVATE); + } + + @Provides + @Named("shared_pref_name") + String providePreferenceName() { + return AppConstants.PREF_NAME; + } + + @Provides + @Singleton + DataManager provideDataManager(AppDataManager appDataManager) { + return appDataManager; + } + + @Provides + @Singleton + ApiHelper provideApiHelper(AppApiHelper appApiHelper) { return appApiHelper; } + + @Provides + @Singleton + DbHelper provideDbHelper(AppDbHelper appDbHelper) { + return appDbHelper; + } + + @Provides + @Singleton + PrefsHelper providePreferencesHelper(AppPrefsHelper appPreferencesHelper) { + return appPreferencesHelper; + } + + + @Provides + @Named("api_url") + String provideApiLink() { + return ApiEndPoint.TODOS; + } + + @Provides + @Singleton + Cache provideOkHttpCache(Application application) { + Cache cache = new Cache(application.getCacheDir(), AppConstants.CACHE_SIZE); + return cache; + } + + @Provides + @Singleton + @Named("cached") + OkHttpClient provideOkHttpClient(Cache cache) { + OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(cache).build(); + return okHttpClient; + } + + @Provides + @Singleton + @Named("non_cached") + OkHttpClient provideOkHttpClientNonCached() { + OkHttpClient okHttpClient = new OkHttpClient(); + return okHttpClient; + } + + @Provides + @Singleton + @Named("rxjava2_call_adapter") + CallAdapter.Factory provideCallAdapterFactory() { + return RxJava2CallAdapterFactory.create(); + } + + @Provides + @Singleton + Retrofit provideRetrofit(@Named("cached") OkHttpClient okHttpClient, + @Named("rxjava2_call_adapter") CallAdapter.Factory rxJava2CallAdapterFactory, + @Named("api_url") String url) { + return new Retrofit.Builder() + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(rxJava2CallAdapterFactory) + .baseUrl(url) + .client(okHttpClient) + .build(); + } + + + @Provides + @Singleton + Realm provideRealm() { + Realm.init(mApplication); + return Realm.getDefaultInstance(); + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/di/module/SyncAdapterModule.java b/app/src/main/java/com/blink22/android/mvpandroid/di/module/SyncAdapterModule.java new file mode 100644 index 0000000..4ca361c --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/di/module/SyncAdapterModule.java @@ -0,0 +1,31 @@ +package com.blink22.android.mvpandroid.di.module; + +import android.content.Context; + +import com.blink22.android.mvpandroid.R; +import com.blink22.android.mvpandroid.service.SyncAdapter; + +import javax.inject.Inject; +import javax.inject.Named; + +import dagger.Module; +import dagger.Provides; + +/** + * Created by ahmedghazy on 7/31/18. + */ + +@Module +public class SyncAdapterModule { + @Inject + SyncAdapter mSyncAdapter; + + public SyncAdapterModule(SyncAdapter syncAdapter) { + mSyncAdapter = syncAdapter; + } + + @Provides + SyncAdapter provideSyncAdapter() { + return mSyncAdapter; + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/di/scope/PerActivity.java b/app/src/main/java/com/blink22/android/mvpandroid/di/scope/PerActivity.java new file mode 100644 index 0000000..fadbe9c --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/di/scope/PerActivity.java @@ -0,0 +1,15 @@ +package com.blink22.android.mvpandroid.di.scope; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.inject.Scope; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +@Scope +@Retention(RetentionPolicy.RUNTIME) +public @interface PerActivity { +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/di/scope/PerSyncService.java b/app/src/main/java/com/blink22/android/mvpandroid/di/scope/PerSyncService.java new file mode 100644 index 0000000..aa76d8b --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/di/scope/PerSyncService.java @@ -0,0 +1,15 @@ +package com.blink22.android.mvpandroid.di.scope; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.inject.Scope; + +/** + * Created by ahmedghazy on 7/31/18. + */ + +@Scope +@Retention(RetentionPolicy.RUNTIME) +public @interface PerSyncService { +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/models/Todo.java b/app/src/main/java/com/blink22/android/mvpandroid/models/Todo.java deleted file mode 100755 index 401773f..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/models/Todo.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.blink22.android.mvpandroid.models; - -import android.widget.Adapter; - -import com.google.gson.annotations.SerializedName; - -/** - * Created by ahmedghazy on 7/25/18. - */ - -public class Todo{ - - @SerializedName("id") - private int id; - - @SerializedName("title") - private String title; - - @SerializedName("details") - private String details; - - @SerializedName("done") - private boolean done; - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getDetails() { - return details; - } - - public void setDetails(String details) { - this.details = details; - } - - public boolean isDone() { - return done; - } - - public void setDone(boolean done) { - this.done = done; - } -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/network/NetworkManager.java b/app/src/main/java/com/blink22/android/mvpandroid/network/NetworkManager.java deleted file mode 100755 index 8f4aac0..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/network/NetworkManager.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.blink22.android.mvpandroid.network; - -import com.blink22.android.mvpandroid.BuildConfig; -import com.blink22.android.mvpandroid.apiinterfaces.TodosService; - -import java.io.IOException; - -import okhttp3.Interceptor; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import retrofit2.Retrofit; -import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; -import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; -import retrofit2.converter.gson.GsonConverterFactory; -import retrofit2.converter.scalars.ScalarsConverterFactory; - -/** - * Created by ahmedghazy on 7/25/18. - */ - -public class NetworkManager { - private static final String TAG = NetworkManager.class.getSimpleName(); - - private static NetworkManager sNetworkManager; - - private TodosService mTodosService; - - private NetworkManager() { - // Required private constructor for singleton class - } - - public static NetworkManager getInstance() { - if (sNetworkManager == null) { - sNetworkManager = new NetworkManager(); - } - - return sNetworkManager; - } - - public TodosService getTodosService() { - if (mTodosService == null) { - mTodosService = new Retrofit - .Builder() - .baseUrl(BuildConfig.BASE_URL) - .addConverterFactory(GsonConverterFactory.create()) - .addConverterFactory(ScalarsConverterFactory.create()) - .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) - .build() - .create(TodosService.class); - } - return mTodosService; - } -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/network/TodosSubscriber.java b/app/src/main/java/com/blink22/android/mvpandroid/network/TodosSubscriber.java deleted file mode 100755 index d90da3e..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/network/TodosSubscriber.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.blink22.android.mvpandroid.network; - -import com.blink22.android.mvpandroid.apiinterfaces.TodosService; -import com.blink22.android.mvpandroid.models.Todo; - -import java.util.ArrayList; - -import io.reactivex.Observable; -import io.reactivex.Observer; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.Disposable; -import io.reactivex.observers.DisposableObserver; -import io.reactivex.schedulers.Schedulers; - -/** - * Created by ahmedghazy on 7/26/18. - */ - -public class TodosSubscriber { - - private static final String TAG = TodosSubscriber.class.getSimpleName(); - - private final TodosService mTodosService; - - public TodosSubscriber(TodosService todosService) { - mTodosService = todosService; - } - - public DisposableObserver> getTodos(final Callback> callback) { - - return mTodosService - .getTodos() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeWith(new DisposableObserver>() { - @Override - public void onNext(ArrayList todos) { - callback.onSuccess(todos); - } - - @Override - public void onError(Throwable e) { - callback.onError(new Exception(e)); - } - - @Override - public void onComplete() { - - } - }); - } - - public DisposableObserver createTodo(final Callback callback, Todo todo) { - - return mTodosService - .createTodo(todo) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeWith(new DisposableObserver() { - @Override - public void onNext(Todo todo) { - callback.onSuccess(todo); - } - - @Override - public void onError(Throwable e) { - callback.onError(new Exception(e)); - } - - @Override - public void onComplete() { - - } - }); - } - - public DisposableObserver updateTodo(final Callback callback, Todo todo) { - - return mTodosService - .updateTodo(todo.getId(), todo) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeWith(new DisposableObserver() { - @Override - public void onNext(Todo todo) { - callback.onSuccess(todo); - } - - @Override - public void onError(Throwable e) { - callback.onError(new Exception(e)); - } - - @Override - public void onComplete() { - - } - }); - } - - public interface Callback { - void onSuccess(T ret); - - // Investigate what kind of exception - void onError(Exception e); - } - -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoActivity.java b/app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoActivity.java deleted file mode 100755 index 4f357d9..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoActivity.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.blink22.android.mvpandroid.newTodo; - -import android.support.v4.app.Fragment; - -import com.blink22.android.mvpandroid.BaseActivity; - -/** - * Created by ahmedghazy on 7/26/18. - */ - -public class NewTodoActivity extends BaseActivity { - @Override - protected Fragment createFragment() { - return NewTodoFragment.newInstance(); - } -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoContract.java b/app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoContract.java deleted file mode 100755 index 8d91b8d..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoContract.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.blink22.android.mvpandroid.newTodo; - -import com.blink22.android.mvpandroid.BasePresenter; -import com.blink22.android.mvpandroid.BaseView; - -/** - * Created by ahmedghazy on 7/26/18. - */ - -public interface NewTodoContract { - interface View extends BaseView { - - String getTitle(); - String getDescription(); - void terminate(); - - } - - interface Presenter extends BasePresenter { - - public void createTodo(); - - } -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoPresenter.java b/app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoPresenter.java deleted file mode 100755 index 2868697..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoPresenter.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.blink22.android.mvpandroid.newTodo; - -import android.arch.lifecycle.Lifecycle; -import android.arch.lifecycle.OnLifecycleEvent; -import android.util.Log; - -import com.blink22.android.mvpandroid.models.Todo; -import com.blink22.android.mvpandroid.network.TodosSubscriber; -import com.blink22.android.mvpandroid.todos.TodosContract; -import com.blink22.android.mvpandroid.todos.TodosPresenter; - -import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.observers.DisposableObserver; -import rx.Subscription; -import rx.subscriptions.CompositeSubscription; - -/** - * Created by ahmedghazy on 7/26/18. - */ - -public class NewTodoPresenter implements NewTodoContract.Presenter { - private static final String TAG = TodosPresenter.class.getSimpleName(); - private static NewTodoPresenter sNewTodoPresenter; - - private final TodosSubscriber mTodosSubscriber; - private final NewTodoContract.View mView; - private CompositeDisposable mCompositeDisposable; - - public static NewTodoPresenter getInstance(TodosSubscriber todosSubscriber, NewTodoContract.View view) { - return sNewTodoPresenter == null ? new NewTodoPresenter(todosSubscriber, view) : sNewTodoPresenter; - } - - private NewTodoPresenter(TodosSubscriber todosSubscriber, NewTodoContract.View view) { - - this.mTodosSubscriber = todosSubscriber; - this.mView = view; - - } - - @Override - @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) - public void start() { - this.mCompositeDisposable = new CompositeDisposable(); - } - - @Override - @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) - public void stop() { - mCompositeDisposable.dispose(); - } - - @Override - public void createTodo() { - - Todo todo = new Todo(); - todo.setTitle(mView.getTitle()); - todo.setDetails(mView.getDescription()); - - DisposableObserver disposableObserver = mTodosSubscriber.createTodo(new TodosSubscriber.Callback() { - @Override - public void onSuccess(Todo todo) { - mView.terminate(); - } - - @Override - public void onError(Exception e) { - - } - - }, todo); - - mCompositeDisposable.add(disposableObserver); - - } -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/service/AccountAuthenticator.java b/app/src/main/java/com/blink22/android/mvpandroid/service/AccountAuthenticator.java new file mode 100644 index 0000000..ff75b7a --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/service/AccountAuthenticator.java @@ -0,0 +1,56 @@ +package com.blink22.android.mvpandroid.service; + +/** + * Created by ahmedghazy on 7/31/18. + */ + +import android.accounts.AbstractAccountAuthenticator; +import android.accounts.Account; +import android.accounts.AccountAuthenticatorResponse; +import android.accounts.NetworkErrorException; +import android.content.Context; +import android.os.Bundle; + +/** + * This is stubbed because we don't need any authentication to access the pretend RSS feed. + */ +public class AccountAuthenticator extends AbstractAccountAuthenticator { + public AccountAuthenticator(Context c) { + super(c); + } + + @Override + public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException { + return null; + } + + @Override + public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException { + return null; + } + + @Override + public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { + return null; + } + + @Override + public String getAuthTokenLabel(String authTokenType) { + return null; + } + + @Override + public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { + return null; + } + + @Override + public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) { + return null; + } + + @Override + public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException { + return null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blink22/android/mvpandroid/service/AccountGeneral.java b/app/src/main/java/com/blink22/android/mvpandroid/service/AccountGeneral.java new file mode 100644 index 0000000..06d788a --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/service/AccountGeneral.java @@ -0,0 +1,42 @@ +package com.blink22.android.mvpandroid.service; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.content.ContentResolver; +import android.content.Context; +import android.os.Bundle; + +import com.blink22.android.mvpandroid.R; +import com.blink22.android.mvpandroid.utils.AppConstants; + +import javax.inject.Inject; +import javax.inject.Named; + +/** + * Created by ahmedghazy on 7/31/18. + */ + +public final class AccountGeneral { + + public static Account getAccount(Context c) { + return new Account(c.getResources().getString(R.string.content_authority), c.getResources().getString(R.string.account_type)); + } + + public static void createSyncAccount(Context c) { + // Flag to determine if this is a new account or not + boolean created = false; + + // Get an account and the account manager + Account account = getAccount(c); + AccountManager manager = (AccountManager)c.getSystemService(Context.ACCOUNT_SERVICE); + + // Attempt to explicitly create the account with no password or extra data + if (manager.addAccountExplicitly(account, null, null)) { + ContentResolver.setIsSyncable(account, c.getResources().getString(R.string.content_authority), 1); + ContentResolver.setSyncAutomatically(account, c.getResources().getString(R.string.content_authority), true); + ContentResolver.addPeriodicSync(account, c.getResources().getString(R.string.content_authority), new Bundle(), AppConstants.APP_SYNC_FREQUENCY); + + created = true; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blink22/android/mvpandroid/service/AuthenticatorService.java b/app/src/main/java/com/blink22/android/mvpandroid/service/AuthenticatorService.java new file mode 100644 index 0000000..713f761 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/service/AuthenticatorService.java @@ -0,0 +1,31 @@ +package com.blink22.android.mvpandroid.service; + +/** + * Created by ahmedghazy on 7/31/18. + */ + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; +import android.support.annotation.Nullable; + +import com.blink22.android.mvpandroid.service.AccountAuthenticator; + +/** + * This is used only by Android to run our {@link AccountAuthenticator}. + */ +public class AuthenticatorService extends Service { + private AccountAuthenticator authenticator; + + + @Override + public void onCreate() { + this.authenticator = new AccountAuthenticator(this); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return authenticator.getIBinder(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blink22/android/mvpandroid/service/SyncAdapter.java b/app/src/main/java/com/blink22/android/mvpandroid/service/SyncAdapter.java new file mode 100644 index 0000000..9b4314e --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/service/SyncAdapter.java @@ -0,0 +1,63 @@ +package com.blink22.android.mvpandroid.service; + +/** + * Created by ahmedghazy on 7/31/18. + */ + +import android.accounts.Account; +import android.content.AbstractThreadedSyncAdapter; +import android.content.ContentProviderClient; +import android.content.ContentResolver; +import android.content.Context; +import android.content.SyncResult; +import android.os.Bundle; + +import com.blink22.android.mvpandroid.BaseApp; +import com.blink22.android.mvpandroid.R; +import com.blink22.android.mvpandroid.data.DataManager; +import com.blink22.android.mvpandroid.di.scope.PerSyncService; +import com.blink22.android.mvpandroid.di.component.DaggerSyncAdapterComponent; +import com.blink22.android.mvpandroid.di.component.SyncAdapterComponent; +import com.blink22.android.mvpandroid.di.module.SyncAdapterModule; +import com.blink22.android.mvpandroid.utils.AppConstants; + +import javax.inject.Inject; +import javax.inject.Named; + + +@PerSyncService +public class SyncAdapter extends AbstractThreadedSyncAdapter { + @Inject DataManager mDataManager; + + public SyncAdapter(Context c, boolean autoInit) { + super(c, autoInit); + initialize(c); + } + + public SyncAdapter(Context c, boolean autoInit, boolean parallelSync) { + super(c, autoInit, parallelSync); + initialize(c); + + } + + void initialize(Context c) { + SyncAdapterComponent component = DaggerSyncAdapterComponent.builder() + .applicationComponent(((BaseApp)c.getApplicationContext()).getComponent()) + .syncAdapterModule(new SyncAdapterModule(this)) + .build(); + component.inject(this); + } + + @Override + public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { + mDataManager.syncData(); + } + + public static void performSync(Context c) { + Bundle b = new Bundle(); + b.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); + b.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); + ContentResolver.requestSync(AccountGeneral.getAccount(c), + c.getResources().getString(R.string.content_authority), b); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blink22/android/mvpandroid/service/SyncService.java b/app/src/main/java/com/blink22/android/mvpandroid/service/SyncService.java new file mode 100644 index 0000000..66a7ea9 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/service/SyncService.java @@ -0,0 +1,33 @@ +package com.blink22.android.mvpandroid.service; + +/** + * Created by ahmedghazy on 7/31/18. + */ + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; +import android.support.annotation.Nullable; + +/** + * This is used only by Android to run our {@link SyncAdapter}. + */ +public class SyncService extends Service { + private static final Object sSyncAdapterLock = new Object(); + private static SyncAdapter sSyncAdapter = null; + + @Override + public void onCreate() { + synchronized (sSyncAdapterLock) { + if (sSyncAdapter == null) { + sSyncAdapter = new SyncAdapter(getApplicationContext(), true); + } + } + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return sSyncAdapter.getSyncAdapterBinder(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blink22/android/mvpandroid/service/TodoProvider.java b/app/src/main/java/com/blink22/android/mvpandroid/service/TodoProvider.java new file mode 100644 index 0000000..e23b6e7 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/service/TodoProvider.java @@ -0,0 +1,65 @@ +package com.blink22.android.mvpandroid.service; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; + +/** + * Created by ahmedghazy on 7/31/18. + */ + +public class TodoProvider extends ContentProvider { + /* + * Always return true, indicating that the + * provider loaded correctly. + */ + @Override + public boolean onCreate() { + return true; + } + /* + * Return no type for MIME type + */ + @Override + public String getType(Uri uri) { + return null; + } + /* + * query() always returns no results + * + */ + @Override + public Cursor query( + Uri uri, + String[] projection, + String selection, + String[] selectionArgs, + String sortOrder) { + return null; + } + /* + * insert() always returns null (no URI) + */ + @Override + public Uri insert(Uri uri, ContentValues values) { + return null; + } + /* + * delete() always returns "no rows affected" (0) + */ + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + return 0; + } + /* + * update() always returns "no rows affected" (0) + */ + public int update( + Uri uri, + ContentValues values, + String selection, + String[] selectionArgs) { + return 0; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blink22/android/mvpandroid/todos/TodosActivity.java b/app/src/main/java/com/blink22/android/mvpandroid/todos/TodosActivity.java deleted file mode 100755 index a7da693..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/todos/TodosActivity.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.blink22.android.mvpandroid.todos; - -import android.os.Bundle; -import android.os.PersistableBundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.View; -import android.widget.ProgressBar; -import android.widget.Toast; - -import com.blink22.android.mvpandroid.BaseApp; -import com.blink22.android.mvpandroid.BaseActivity; -import com.blink22.android.mvpandroid.adapters.TodosAdapter; -import com.blink22.android.mvpandroid.models.Todo; - -import java.util.ArrayList; - -import com.blink22.android.mvpandroid.R; -import com.blink22.android.mvpandroid.network.NetworkManager; -import com.blink22.android.mvpandroid.network.TodosSubscriber; - -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Created by ahmedghazy on 7/25/18. - */ - -public class TodosActivity extends BaseActivity{ - - @Override - protected Fragment createFragment() { - return TodosFragment.newInstance(); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/todos/TodosContract.java b/app/src/main/java/com/blink22/android/mvpandroid/todos/TodosContract.java deleted file mode 100755 index 1b84f21..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/todos/TodosContract.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.blink22.android.mvpandroid.todos; - -import com.blink22.android.mvpandroid.BasePresenter; -import com.blink22.android.mvpandroid.BaseView; -import com.blink22.android.mvpandroid.models.Todo; - -import java.util.ArrayList; - -/** - * Created by ahmedghazy on 7/25/18. - */ - -public interface TodosContract { - interface View extends BaseView { - - void showWait(); - - void removeWait(); - - void onFailure(String appErrorMessage); - - void onGetTodosSuccess(ArrayList todos); - - } - - interface Presenter extends BasePresenter { - - void getTodos(); - - void updateTodo(Todo todo); - - } -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/todos/TodosPresenter.java b/app/src/main/java/com/blink22/android/mvpandroid/todos/TodosPresenter.java deleted file mode 100755 index 49e4b2e..0000000 --- a/app/src/main/java/com/blink22/android/mvpandroid/todos/TodosPresenter.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.blink22.android.mvpandroid.todos; - -import android.arch.lifecycle.Lifecycle; -import android.arch.lifecycle.LifecycleObserver; -import android.arch.lifecycle.OnLifecycleEvent; - -import com.blink22.android.mvpandroid.models.Todo; -import com.blink22.android.mvpandroid.network.TodosSubscriber; - -import java.util.ArrayList; - -import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.observers.DisposableObserver; - -/** - * Created by ahmedghazy on 7/25/18. - */ - -public class TodosPresenter implements TodosContract.Presenter { - private static final String TAG = TodosPresenter.class.getSimpleName(); - private static TodosPresenter sTodosPresenter; - - private final TodosSubscriber mTodosSubscriber; - private final TodosContract.View mView; - private CompositeDisposable mCompositeDisposable; - private ArrayList mTodos; - - public static TodosPresenter getInstance(TodosSubscriber todosSubscriber, TodosContract.View view) { - return sTodosPresenter == null ? new TodosPresenter(todosSubscriber, view) : sTodosPresenter; - } - - private TodosPresenter(TodosSubscriber todosSubscriber, TodosContract.View view) { - - this.mTodosSubscriber = todosSubscriber; - this.mView = view; - - } - - @Override - @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) public void start() { - this.mCompositeDisposable = new CompositeDisposable(); - } - - @Override - @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) public void stop() { - mCompositeDisposable.dispose(); - } - - @Override - public void getTodos() { - - mView.showWait(); - - DisposableObserver> disposableObserver = mTodosSubscriber.getTodos(new TodosSubscriber.Callback>() { - @Override - public void onSuccess(ArrayList todos) { - mView.removeWait(); - mTodos = todos; - mView.onGetTodosSuccess(todos); - } - - @Override - public void onError(Exception networkError) { - mView.removeWait(); - mView.onFailure(networkError.getMessage()); - } - - }); - - mCompositeDisposable.add(disposableObserver); - } - - @Override - public void updateTodo(Todo todo) { - todo.setDone(!todo.isDone()); - - DisposableObserver disposableObserver = mTodosSubscriber.updateTodo(new TodosSubscriber.Callback() { - @Override - public void onSuccess(Todo todo) { - - } - - @Override - public void onError(Exception networkError) { - - } - - }, todo); - - mCompositeDisposable.add(disposableObserver); - } -} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/BaseActivity.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/base/BaseActivity.java similarity index 58% rename from app/src/main/java/com/blink22/android/mvpandroid/BaseActivity.java rename to app/src/main/java/com/blink22/android/mvpandroid/ui/base/BaseActivity.java index 5501ec7..4bd88ff 100644 --- a/app/src/main/java/com/blink22/android/mvpandroid/BaseActivity.java +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/base/BaseActivity.java @@ -1,8 +1,11 @@ -package com.blink22.android.mvpandroid; +package com.blink22.android.mvpandroid.ui.base; import android.content.Intent; +import android.database.ContentObserver; +import android.net.Uri; import android.os.Bundle; -import android.os.PersistableBundle; +import android.os.Handler; +import android.os.Looper; import android.support.annotation.Nullable; import android.support.design.widget.NavigationView; import android.support.v4.app.Fragment; @@ -12,8 +15,13 @@ import android.view.Menu; import android.view.MenuItem; +import com.blink22.android.mvpandroid.BaseApp; import com.blink22.android.mvpandroid.R; -import com.blink22.android.mvpandroid.models.NavigationItemEnum; +import com.blink22.android.mvpandroid.service.AccountGeneral; +import com.blink22.android.mvpandroid.di.component.ActivityComponent; +import com.blink22.android.mvpandroid.di.component.DaggerActivityComponent; +import com.blink22.android.mvpandroid.di.module.ActivityModule; +import com.blink22.android.mvpandroid.data.model.NavigationItemEnum; import butterknife.BindView; import butterknife.ButterKnife; @@ -23,16 +31,52 @@ */ public abstract class BaseActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { - protected abstract Fragment createFragment(); @BindView(R.id.drawer_layout) DrawerLayout mDrawerLayout; @BindView(R.id.nav_view) NavigationView navigationView; + private ActivityComponent mActivityComponent; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + mActivityComponent = DaggerActivityComponent.builder() + .applicationComponent(((BaseApp) getApplication()).getComponent()) + .activityModule(new ActivityModule(this)) + .build(); setContentView(R.layout.activity_fragment); ButterKnife.bind(this); + setupDrawerMenu(); + setupContentFragment(); + } + + @Override + protected void onStart() { + super.onStart(); + } + @Override + protected void onStop() { + super.onStop(); + } + + public ActivityComponent getActivityComponent() { + return mActivityComponent; + } + + public boolean onNavigationItemSelected(MenuItem menuItem) { + mDrawerLayout.closeDrawers(); + + for(NavigationItemEnum item: NavigationItemEnum.values()) { + if(item.getId() == menuItem.getItemId()) { + Intent selectedDrawerItemIntent = new Intent(this, item.getClassToLaunch()); + selectedDrawerItemIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(selectedDrawerItemIntent); + } + } + + return true; + } + + private void setupDrawerMenu() { navigationView.setNavigationItemSelectedListener(this); Menu menu = navigationView.getMenu(); @@ -41,7 +85,9 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { MenuItem menuItem = menu.add(R.id.nav_group, item.getId(), Menu.NONE, item.getLabelResourceId()); menuItem.setIcon(item.getIconResourceId()); } + } + private void setupContentFragment() { FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragment_container); @@ -53,17 +99,5 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } } - public boolean onNavigationItemSelected(MenuItem menuItem) { - mDrawerLayout.closeDrawers(); - - for(NavigationItemEnum item: NavigationItemEnum.values()) { - if(item.getId() == menuItem.getItemId()) { - Intent i = new Intent(getApplicationContext(), item.getClassToLaunch()); - i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(i); - } - } - - return true; - } + protected abstract Fragment createFragment(); } diff --git a/app/src/main/java/com/blink22/android/mvpandroid/ui/base/BasePresenter.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/base/BasePresenter.java new file mode 100644 index 0000000..99d026c --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/base/BasePresenter.java @@ -0,0 +1,64 @@ +package com.blink22.android.mvpandroid.ui.base; + +import android.arch.lifecycle.Lifecycle; +import android.arch.lifecycle.LifecycleObserver; +import android.arch.lifecycle.OnLifecycleEvent; +import android.content.Context; + +import com.blink22.android.mvpandroid.data.DataManager; +import com.blink22.android.mvpandroid.service.AccountGeneral; + +import javax.inject.Inject; +import javax.inject.Named; + +import io.reactivex.disposables.CompositeDisposable; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +public class BasePresenter implements IBasePresenter, LifecycleObserver { + + private final Context mAppContext; + private final DataManager mDataManager; + private final CompositeDisposable mCompositeDisposable; + private V mView; + + @Inject + public BasePresenter(@Named("application_context") Context appContext, DataManager dataManager, CompositeDisposable compositeDisposable) { + mAppContext = appContext; + mDataManager = dataManager; + mCompositeDisposable = compositeDisposable; + } + + @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) + protected void onCreate() { + AccountGeneral.createSyncAccount(mAppContext); + } + + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + protected void onDestroy() { + mCompositeDisposable.dispose(); + mView = null; + } + + public void onAttach(V view) { + mView = view; + } + + public DataManager getDataManager() { + return mDataManager; + } + + public CompositeDisposable getCompositeDisposable() { + return mCompositeDisposable; + } + + public V getView() { + return mView; + } + + public Context getAppContext() { + return mAppContext; + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/ui/base/IBasePresenter.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/base/IBasePresenter.java new file mode 100755 index 0000000..7a62381 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/base/IBasePresenter.java @@ -0,0 +1,13 @@ +package com.blink22.android.mvpandroid.ui.base; + +import android.arch.lifecycle.LifecycleObserver; + +/** + * Created by ahmedghazy on 7/25/18. + */ + +public interface IBasePresenter extends LifecycleObserver{ + + void onAttach(V view); + +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/ui/base/IBaseView.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/base/IBaseView.java new file mode 100755 index 0000000..149d553 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/base/IBaseView.java @@ -0,0 +1,9 @@ +package com.blink22.android.mvpandroid.ui.base; + +/** + * Created by ahmedghazy on 7/25/18. + */ + +public interface IBaseView { + +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoActivity.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoActivity.java new file mode 100755 index 0000000..3e09722 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoActivity.java @@ -0,0 +1,44 @@ +package com.blink22.android.mvpandroid.ui.newtodo; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; + +import com.blink22.android.mvpandroid.ui.base.BaseActivity; + +import javax.inject.Inject; + +/** + * Created by ahmedghazy on 7/26/18. + */ + +public class NewTodoActivity extends BaseActivity { + + @Inject + NewTodoContract.Presenter mPresenter; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + getActivityComponent().inject(this); + + getLifecycle().addObserver(mPresenter); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + getLifecycle().removeObserver(mPresenter); + } + + public NewTodoContract.Presenter getPresenter() { + return mPresenter; + } + + @Override + protected Fragment createFragment() { + return NewTodoFragment.newInstance(); + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoContract.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoContract.java new file mode 100755 index 0000000..7877e59 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoContract.java @@ -0,0 +1,30 @@ +package com.blink22.android.mvpandroid.ui.newtodo; + +import com.blink22.android.mvpandroid.di.scope.PerActivity; +import com.blink22.android.mvpandroid.ui.base.IBasePresenter; +import com.blink22.android.mvpandroid.ui.base.IBaseView; + +/** + * Created by ahmedghazy on 7/26/18. + */ + +public interface NewTodoContract { + interface View extends IBaseView { + + String getTitle(); + + String getDescription(); + + void showToastWithMessage(int resId); + + void terminate(); + + } + + @PerActivity + interface Presenter extends IBasePresenter { + + public void createTodo(); + + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoFragment.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoFragment.java similarity index 57% rename from app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoFragment.java rename to app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoFragment.java index 99c6e56..e198f9c 100755 --- a/app/src/main/java/com/blink22/android/mvpandroid/newTodo/NewTodoFragment.java +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoFragment.java @@ -1,8 +1,9 @@ -package com.blink22.android.mvpandroid.newTodo; +package com.blink22.android.mvpandroid.ui.newtodo; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; @@ -10,80 +11,61 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; +import android.widget.Toast; -import com.blink22.android.mvpandroid.BaseApp; import com.blink22.android.mvpandroid.R; -import com.blink22.android.mvpandroid.network.NetworkManager; -import com.blink22.android.mvpandroid.network.TodosSubscriber; +import com.blink22.android.mvpandroid.ui.base.BaseActivity; +import com.blink22.android.mvpandroid.ui.todos.TodosActivity; import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; +import butterknife.OnClick; /** * Created by ahmedghazy on 7/26/18. */ public class NewTodoFragment extends Fragment implements NewTodoContract.View { - private static final String TAG = NewTodoFragment.class.getSimpleName(); - - @BindView(R.id.new_todo_title) - TextView mTitle; - @BindView(R.id.new_todo_description) - TextView mDescription; - @BindView(R.id.new_todo_submit) - Button mSubmit; - NewTodoContract.Presenter mPresenter; - @Inject TodosSubscriber mTodosSubscriber; + @BindView(R.id.new_todo_title) TextView mTitle; + @BindView(R.id.new_todo_description) TextView mDescription; + @BindView(R.id.new_todo_submit) Button mSubmit; + @OnClick(R.id.new_todo_submit) + public void submit() { + Log.i(getClass().getSimpleName(), "Submit"); + mNewTodoPresenter.createTodo(); + } + private NewTodoContract.Presenter mNewTodoPresenter; + private View mView; public static NewTodoFragment newInstance() { - - Bundle args = new Bundle(); - - NewTodoFragment fragment = new NewTodoFragment(); - fragment.setArguments(args); - return fragment; + return new NewTodoFragment(); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - ((BaseApp) getActivity().getApplication()).getNetworkComponent().inject(this); - - setPresenter(NewTodoPresenter.getInstance(mTodosSubscriber, this)); - getLifecycle().addObserver(mPresenter); - } - - @Override - public void setPresenter(NewTodoContract.Presenter presenter) { - mPresenter = presenter; - } - - @Override - public void onDestroy() { - super.onDestroy(); - getLifecycle().removeObserver(mPresenter); + mNewTodoPresenter = ((NewTodoActivity) getActivity()).getPresenter(); } @Nullable @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View v = inflater.inflate(R.layout.fragment_new_todo, container, false); ButterKnife.bind(this, v); - mSubmit.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mPresenter.createTodo(); - } - }); + mNewTodoPresenter.onAttach(this); + mView = v; return v; } + @Override + public void onDestroy() { + super.onDestroy(); + } + @Override public String getTitle() { return mTitle.getText().toString(); @@ -94,13 +76,17 @@ public String getDescription() { return mDescription.getText().toString(); } + @Override + public void showToastWithMessage(int resId) { + Toast.makeText(getContext(), resId, Toast.LENGTH_LONG).show(); + } + @Override public void terminate() { try { getActivity().finish(); } catch (NullPointerException e) { - Log.i(TAG, e.getMessage()); - } + } } } diff --git a/app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoPresenter.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoPresenter.java new file mode 100755 index 0000000..b21bde7 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/newtodo/NewTodoPresenter.java @@ -0,0 +1,58 @@ +package com.blink22.android.mvpandroid.ui.newtodo; + +import android.arch.lifecycle.Lifecycle; +import android.arch.lifecycle.OnLifecycleEvent; +import android.content.Context; + +import com.blink22.android.mvpandroid.R; +import com.blink22.android.mvpandroid.data.DataManager; +import com.blink22.android.mvpandroid.data.db.model.Todo; +import com.blink22.android.mvpandroid.ui.base.BasePresenter; +import com.blink22.android.mvpandroid.ui.todos.TodosPresenter; + +import java.util.Date; + +import javax.inject.Inject; +import javax.inject.Named; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.observers.DisposableObserver; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by ahmedghazy on 7/26/18. + */ + +public class NewTodoPresenter extends BasePresenter + implements NewTodoContract.Presenter { + private static final String TAG = TodosPresenter.class.getSimpleName(); + + @Inject + public NewTodoPresenter(@Named("application_context") Context context, DataManager dataManager, CompositeDisposable compositeDisposable) { + super(context, dataManager,compositeDisposable); + } + + @Override + public void createTodo() { + if(getView() != null) { + Todo todo = new Todo(); + todo.setTitle(getView().getTitle()); + todo.setDescription(getView().getDescription()); + todo.setUpdatedDate(new Date().toString()); + getCompositeDisposable().add(getDataManager() + .saveTodo(todo) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + retTodo -> { + getView().showToastWithMessage(R.string.create_todo_success); + getView().terminate(); + }, + throwable -> {}, + () -> {} + )); + + } + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosActivity.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosActivity.java new file mode 100755 index 0000000..520a840 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosActivity.java @@ -0,0 +1,61 @@ +package com.blink22.android.mvpandroid.ui.todos; + +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; + +import com.blink22.android.mvpandroid.BaseApp; +import com.blink22.android.mvpandroid.service.AccountGeneral; +import com.blink22.android.mvpandroid.ui.base.BaseActivity; + +import javax.inject.Inject; + +/** + * Created by ahmedghazy on 7/25/18. + */ + +public class TodosActivity extends BaseActivity{ + @Inject TodosPresenter mPresenter; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + getActivityComponent().inject(this); + + getLifecycle().addObserver(mPresenter); + + + } + + @Override + protected void onStart() { + super.onStart(); + } + + @Override + protected void onStop() { + super.onStop(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + getLifecycle().removeObserver(mPresenter); + } + + public TodosPresenter getPresenter() { + return mPresenter; + } + + @Override + protected Fragment createFragment() { + return TodosFragment.newInstance(); + } + +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosAdapter.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosAdapter.java new file mode 100755 index 0000000..c695b38 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosAdapter.java @@ -0,0 +1,65 @@ +package com.blink22.android.mvpandroid.ui.todos; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.blink22.android.mvpandroid.R; +import com.blink22.android.mvpandroid.data.db.model.Todo; + +import java.util.ArrayList; + +/** + * Created by ahmedghazy on 7/25/18. + */ + +public class TodosAdapter extends RecyclerView.Adapter { + + private final OnItemClickListener mListener; + private ArrayList mData; + + public static TodosAdapter newInstance(Context c, final TodosPresenter todosPresenter) { + return new TodosAdapter(c.getApplicationContext(), new ArrayList(), + new TodosAdapter.OnItemClickListener() { + @Override + public void onClick(Todo item) { + todosPresenter.updateTodo(item); + } + }); + } + + TodosAdapter(Context context, ArrayList data, OnItemClickListener listener) { + mData = data; + mListener = listener; + } + + void onTodosUpdate(ArrayList todos) { + mData = todos; + notifyDataSetChanged(); + } + + @Override + @NonNull + public TodosVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_todos, null); + return new TodosVH(view); + } + + @Override + public void onBindViewHolder(@NonNull TodosVH holder, int position) { + holder.bind(mData.get(position), mListener); + } + + @Override + public int getItemCount() { + return mData.size(); + } + + public interface OnItemClickListener { + void onClick(Todo item); + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosContract.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosContract.java new file mode 100755 index 0000000..524f1b0 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosContract.java @@ -0,0 +1,35 @@ +package com.blink22.android.mvpandroid.ui.todos; + +import com.blink22.android.mvpandroid.data.db.model.Todo; +import com.blink22.android.mvpandroid.di.scope.PerActivity; +import com.blink22.android.mvpandroid.ui.base.IBasePresenter; +import com.blink22.android.mvpandroid.ui.base.IBaseView; + +import java.util.ArrayList; + +/** + * Created by ahmedghazy on 7/25/18. + */ + +public interface TodosContract { + interface View extends IBaseView { + + void showWait(); + + void removeWait(); + + void onFailure(String appErrorMessage); + + void onGetTodosSuccess(ArrayList todos); + + } + + @PerActivity + interface Presenter extends IBasePresenter { + + void getTodos(); + + void updateTodo(Todo todo); + + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/todos/TodosFragment.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosFragment.java similarity index 55% rename from app/src/main/java/com/blink22/android/mvpandroid/todos/TodosFragment.java rename to app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosFragment.java index 7cc1832..adeb78d 100755 --- a/app/src/main/java/com/blink22/android/mvpandroid/todos/TodosFragment.java +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosFragment.java @@ -1,11 +1,9 @@ -package com.blink22.android.mvpandroid.todos; +package com.blink22.android.mvpandroid.ui.todos; import android.os.Bundle; -import android.os.PersistableBundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; -import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -14,18 +12,10 @@ import android.widget.ProgressBar; import android.widget.Toast; -import com.blink22.android.mvpandroid.BaseApp; -import com.blink22.android.mvpandroid.BaseActivity; -import com.blink22.android.mvpandroid.adapters.TodosAdapter; -import com.blink22.android.mvpandroid.models.Todo; - import java.util.ArrayList; import com.blink22.android.mvpandroid.R; -import com.blink22.android.mvpandroid.network.NetworkManager; -import com.blink22.android.mvpandroid.network.TodosSubscriber; - -import javax.inject.Inject; +import com.blink22.android.mvpandroid.data.db.model.Todo; import butterknife.BindView; import butterknife.ButterKnife; @@ -35,30 +25,21 @@ */ public class TodosFragment extends Fragment implements TodosContract.View { + private static final String TAG = TodosActivity.class.getSimpleName(); @BindView(R.id.todos_list) RecyclerView mTodos; @BindView(R.id.todos_progress) ProgressBar mProgressBar; - TodosContract.Presenter mTodosPresenter; - @Inject TodosSubscriber mTodosSubscriber; + private TodosPresenter mTodosPresenter; + private TodosAdapter mTodosAdapter; public static TodosFragment newInstance() { - - Bundle args = new Bundle(); - - TodosFragment fragment = new TodosFragment(); - fragment.setArguments(args); - return fragment; + return new TodosFragment(); } - private static final String TAG = TodosActivity.class.getSimpleName(); - @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - ((BaseApp) getActivity().getApplication()).getNetworkComponent().inject(this); - - setPresenter(TodosPresenter.getInstance(mTodosSubscriber, this)); - getLifecycle().addObserver(mTodosPresenter); + mTodosPresenter = ((TodosActivity) getActivity()).getPresenter(); + mTodosAdapter = TodosAdapter.newInstance(getActivity(), mTodosPresenter); } @Nullable @@ -66,24 +47,16 @@ public void onCreate(@Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View v = inflater.inflate(R.layout.todos_fragment, container, false); - ButterKnife.bind(this, v); - + mTodosPresenter.onAttach(this); + mTodos.setAdapter(mTodosAdapter); mTodos.setLayoutManager(new LinearLayoutManager(getActivity())); - return v; } @Override public void onResume() { super.onResume(); - mTodosPresenter.getTodos(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - getLifecycle().removeObserver(mTodosPresenter); } @Override @@ -104,19 +77,7 @@ public void onFailure(String appErrorMessage) { @Override public void onGetTodosSuccess(ArrayList todos) { - TodosAdapter adapter = new TodosAdapter(getActivity().getApplicationContext(), todos, - new TodosAdapter.OnItemClickListener() { - @Override - public void onClick(Todo item) { - mTodosPresenter.updateTodo(item); - } - }); - - mTodos.setAdapter(adapter); - } - - @Override - public void setPresenter(TodosContract.Presenter presenter) { - mTodosPresenter = presenter; + mTodosAdapter.onTodosUpdate(todos); + mTodos.setAdapter(mTodosAdapter); } } diff --git a/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosPresenter.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosPresenter.java new file mode 100755 index 0000000..ec9493a --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosPresenter.java @@ -0,0 +1,94 @@ +package com.blink22.android.mvpandroid.ui.todos; + +import android.arch.lifecycle.Lifecycle; +import android.arch.lifecycle.LifecycleObserver; +import android.arch.lifecycle.OnLifecycleEvent; +import android.content.Context; +import android.util.Log; + +import com.blink22.android.mvpandroid.data.DataManager; +import com.blink22.android.mvpandroid.data.db.model.Todo; +import com.blink22.android.mvpandroid.service.SyncAdapter; +import com.blink22.android.mvpandroid.ui.base.BasePresenter; + +import java.util.ArrayList; +import java.util.Date; +import java.util.Observable; +import java.util.Observer; + +import javax.inject.Inject; +import javax.inject.Named; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.observers.DisposableObserver; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by ahmedghazy on 7/25/18. + */ + +public class TodosPresenter extends BasePresenter + implements TodosContract.Presenter { + private static final String TAG = TodosPresenter.class.getSimpleName(); + + @Inject + public TodosPresenter(@Named("application_context") Context context, DataManager dataManager, CompositeDisposable compositeDisposable) { + super(context, dataManager, compositeDisposable); + } + + @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) + public void onCreate() { + super.onCreate(); + if(!getDataManager().isSyncDone()) { + SyncAdapter.performSync(getAppContext()); + getDataManager().setSyncDone(true); + } + } + + @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) + public void onResume() { + getTodos(); + } + + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + void onDestry() { + super.onDestroy(); + } + + @Override + public void getTodos() { + if(getView() != null) { + getView().showWait(); + getCompositeDisposable().add(getDataManager() + .getTodos() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + todos -> { + getView().removeWait(); + getView().onGetTodosSuccess(todos); + }, + throwable -> getView().onFailure(throwable.getLocalizedMessage()), + () -> {} + ) + ); + } + } + + @Override + public void updateTodo(Todo todo) { + todo.setDone(!todo.isDone()); + todo.setUpdatedDate(new Date().toString()); + getCompositeDisposable().add( getDataManager() + .updateTodo(todo.getId(), todo) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + retTodo -> {}, + throwable -> {}, + () -> {} + ) + ); + } +} diff --git a/app/src/main/java/com/blink22/android/mvpandroid/viewHolders/TodosVH.java b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosVH.java similarity index 62% rename from app/src/main/java/com/blink22/android/mvpandroid/viewHolders/TodosVH.java rename to app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosVH.java index 6903d1c..db1a76e 100755 --- a/app/src/main/java/com/blink22/android/mvpandroid/viewHolders/TodosVH.java +++ b/app/src/main/java/com/blink22/android/mvpandroid/ui/todos/TodosVH.java @@ -1,18 +1,17 @@ -package com.blink22.android.mvpandroid.viewHolders; +package com.blink22.android.mvpandroid.ui.todos; import android.support.v7.widget.RecyclerView; -import android.util.Log; import android.view.View; -import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.TextView; import butterknife.BindView; import butterknife.ButterKnife; +import butterknife.OnClick; import com.blink22.android.mvpandroid.R; -import com.blink22.android.mvpandroid.adapters.TodosAdapter; -import com.blink22.android.mvpandroid.models.Todo; +import com.blink22.android.mvpandroid.ui.todos.TodosAdapter; +import com.blink22.android.mvpandroid.data.db.model.Todo; /** * Created by ahmedghazy on 7/25/18. @@ -23,6 +22,12 @@ public class TodosVH extends RecyclerView.ViewHolder { @BindView(R.id.todo_title) TextView mTitle; @BindView(R.id.todo_description) TextView mDescription; @BindView(R.id.todo_checkbox) CheckBox mDone; + TodosAdapter.OnItemClickListener mListener; + Todo mTodo; + @OnClick(R.id.todo_checkbox) + void check() { + mListener.onClick(mTodo); + } public TodosVH(View itemView) { super(itemView); @@ -31,14 +36,9 @@ public TodosVH(View itemView) { public void bind(final Todo todo, final TodosAdapter.OnItemClickListener listener) { mTitle.setText(todo.getTitle()); - mDescription.setText(todo.getDetails()); + mDescription.setText(todo.getDescription()); mDone.setChecked(todo.isDone()); - mDone.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - listener.onClick(todo); - } - }); + mListener = listener; + mTodo = todo; } } diff --git a/app/src/main/java/com/blink22/android/mvpandroid/utils/AppConstants.java b/app/src/main/java/com/blink22/android/mvpandroid/utils/AppConstants.java new file mode 100644 index 0000000..2834517 --- /dev/null +++ b/app/src/main/java/com/blink22/android/mvpandroid/utils/AppConstants.java @@ -0,0 +1,15 @@ +package com.blink22.android.mvpandroid.utils; + +/** + * Created by ahmedghazy on 7/30/18. + */ + +public final class AppConstants { + + public static final String PREF_NAME = "todos_pref"; + + public static final int CACHE_SIZE = 5 * 1024 * 1024; + + public static final int APP_SYNC_FREQUENCY = 5 * 60; // in sec + +} diff --git a/app/src/main/res/layout/item_todos.xml b/app/src/main/res/layout/item_todos.xml index e0121ee..7bb243f 100755 --- a/app/src/main/res/layout/item_todos.xml +++ b/app/src/main/res/layout/item_todos.xml @@ -7,9 +7,6 @@ android:orientation="horizontal" android:padding="20dp" > - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/todos_fragment.xml b/app/src/main/res/layout/todos_fragment.xml index 259da92..6284738 100755 --- a/app/src/main/res/layout/todos_fragment.xml +++ b/app/src/main/res/layout/todos_fragment.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="todos.TodosActivity"> + tools:context=".ui.todos.TodosActivity"> - Playground + androidMvp Show all New one Title Description Submit + com.blink22.android.mvpandroid + com.blink22.android.mvpandroid + SyncAccount + Todo created successfuly diff --git a/app/src/main/res/xml/authenticator.xml b/app/src/main/res/xml/authenticator.xml new file mode 100644 index 0000000..bba9560 --- /dev/null +++ b/app/src/main/res/xml/authenticator.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/app/src/main/res/xml/syncadapter.xml b/app/src/main/res/xml/syncadapter.xml new file mode 100644 index 0000000..532e85d --- /dev/null +++ b/app/src/main/res/xml/syncadapter.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/app/src/main/res/xml/syncsettings.xml b/app/src/main/res/xml/syncsettings.xml new file mode 100644 index 0000000..ff894ac --- /dev/null +++ b/app/src/main/res/xml/syncsettings.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index e6b32bc..32b2f9d 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,8 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' - + classpath 'io.realm:realm-gradle-plugin:5.4.0' + classpath 'me.tatarka:gradle-retrolambda:3.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/db.json b/db.json index d2a0ca5..f1d64a3 100644 --- a/db.json +++ b/db.json @@ -1,160 +1,221 @@ { "todos": [ { - "details": "Go to the market to buy carrots", + "description": "Description", + "done": true, + "id": 6, + "title": "Title", + "updatedDate": "Tue Jul 31 10:27:35 EDT 2018" + }, + { + "description": "Hello world", + "done": true, + "id": 100, + "title": "Hello world", + "updatedDate": "Tue Jul 31 15:57:33 GMT 2018" + }, + { + "description": "Description", "done": true, "id": 1, - "title": "Buy grocery" + "title": "Title", + "updatedDate": "Tue Jul 31 10:25:23 EDT 2018" }, { - "details": "Chat with your friends about last night match", - "done": false, - "id": 2, - "title": "Chat with friends" + "description": "Description", + "done": true, + "id": 33, + "title": "Title", + "updatedDate": "Tue Jul 31 11:14:15 EDT 2018" }, { - "details": "Call the customer service", - "done": false, - "id": 3, - "title": "Fix the refrigerator" + "description": "Description", + "done": true, + "id": 13, + "title": "Title", + "updatedDate": "Tue Jul 31 10:25:39 EDT 2018" }, { - "id": 4, - "title": "Buy grocery", - "details": "Go to the market to buy carrots", - "done": false + "description": "dsaDescription", + "done": true, + "id": 110, + "title": "dsaTitle", + "updatedDate": "Tue Jul 31 11:27:43 EDT 2018" }, { - "details": "Chat with your friends about last night match", - "done": false, - "id": 5, - "title": "Chat with friends" + "description": "Description", + "done": true, + "id": 41, + "title": "Title", + "updatedDate": "Tue Jul 31 11:27:17 EDT 2018" }, { - "details": "Call the customer service", + "description": "Description", "done": true, - "id": 6, - "title": "Fix the refrigerator" + "id": 83, + "title": "Title", + "updatedDate": "Tue Jul 31 11:36:11 EDT 2018" }, { - "details": "Chat with your friends about last night match", - "done": false, - "id": 7, - "title": "Chat with friends" + "description": "Description", + "done": true, + "id": 17, + "title": "Title", + "updatedDate": "Tue Jul 31 11:35:54 EDT 2018" }, { - "details": "Call the customer service", - "done": false, - "id": 8, - "title": "Fix the refrigerator" + "description": "Description", + "done": true, + "id": 27, + "title": "Title", + "updatedDate": "Wed Aug 01 10:17:21 EDT 2018" }, { - "id": 9, - "title": "Buy grocery", - "details": "Go to the market to buy carrots", - "done": false + "description": "Description", + "done": true, + "id": 91, + "title": "Title", + "updatedDate": "Wed Aug 01 10:24:17 EDT 2018" }, { - "details": "Chat with your friends about last night match", - "done": false, - "id": 10, - "title": "Chat with friends" + "description": "Description", + "done": true, + "id": 73, + "title": "Title", + "updatedDate": "Tue Jul 31 11:27:23 EDT 2018" }, { - "details": "Call the customer service", - "done": false, - "id": 11, - "title": "Fix the refrigerator" + "description": "Description", + "done": true, + "id": 125, + "title": "Title", + "updatedDate": "Wed Aug 01 10:24:22 EDT 2018" }, { - "details": "Chat with your friends about last night match", - "done": false, - "id": 12, - "title": "Chat with friends" + "description": "Description", + "done": true, + "id": 37, + "title": "Title", + "updatedDate": "Tue Jul 31 11:36:00 EDT 2018" }, { - "details": "Call the customer service", - "done": false, - "id": 13, - "title": "Fix the refrigerator" + "description": "kidding Description", + "done": true, + "id": 57, + "title": "kidding Title", + "updatedDate": "Wed Aug 01 10:17:34 EDT 2018" }, { - "details": "Go to the market to buy carrots", + "description": "Hello from the backend", "done": true, - "id": 14, - "title": "Buy grocery" + "id": 1000, + "title": "Hello from the other side", + "updatedDate": "Thu Aug 02 01:25:24 EDT 2018" }, { - "details": "Chat with your friends about last night match", - "done": false, - "id": 15, - "title": "Chat with friends" + "description": "Description", + "done": true, + "id": 59, + "title": "Title", + "updatedDate": "Tue Jul 31 11:36:04 EDT 2018" }, { - "details": "Call the customer service", - "done": false, - "id": 16, - "title": "Fix the refrigerator" + "description": "11Description", + "done": true, + "id": 81, + "title": "11Title", + "updatedDate": "Thu Aug 02 02:15:38 EDT 2018" }, { - "details": "", - "done": false, - "title": "", - "id": 17 + "description": "Description", + "done": true, + "id": 25, + "title": "Title", + "updatedDate": "Tue Jul 31 11:55:56 EDT 2018" }, { - "details": "Hello World Description", - "done": false, - "title": "Hello World Title", - "id": 18 + "description": "Description", + "done": true, + "id": 43, + "title": "Title", + "updatedDate": "Thu Aug 02 02:18:49 EDT 2018" }, { - "details": "Hello 2 Description", - "done": false, - "title": "Hello 2 Title", - "id": 19 + "description": "ggDescription", + "done": true, + "id": 95, + "title": "ggTitle", + "updatedDate": "Thu Aug 02 07:53:27 EDT 2018" }, { - "details": "Hello 3 Description", - "done": false, - "title": "Hello 3 Title", - "id": 20 + "description": "123 Description", + "done": true, + "id": 35, + "title": "123 Title", + "updatedDate": "Thu Aug 02 01:25:24 EDT 2018" }, { - "details": "allo Description", - "done": false, - "title": "allo Title", - "id": 21 + "description": "Description", + "done": true, + "id": 58, + "title": "Title", + "updatedDate": "Thu Aug 02 08:01:09 EDT 2018" }, { - "details": "sada Description", - "done": false, - "title": "sada Title", - "id": 22 + "description": "Description", + "done": true, + "id": 118, + "title": "Title", + "updatedDate": "Thu Aug 02 08:01:17 EDT 2018" }, { - "details": "ddsa Description", - "done": false, - "title": "ddsa Title", - "id": 23 + "description": "Description", + "done": true, + "id": 49, + "title": "Title", + "updatedDate": "Thu Aug 02 02:34:25 EDT 2018" }, { - "details": "dsa Description", - "done": false, - "id": 24, - "title": "dsa Title" + "description": "Description dsad", + "done": true, + "id": 180, + "title": "Title dsadsa", + "updatedDate": "Thu Aug 02 08:01:23 EDT 2018" }, { - "details": "dsa Description", + "description": "ggDescription", "done": true, - "id": 25, - "title": "dsa Title" + "id": 99, + "title": "ggTitle", + "updatedDate": "Thu Aug 02 07:53:42 EDT 2018" }, { - "details": "Ghazy Description", - "done": false, - "id": 26, - "title": "Title Ghazy" + "description": "1Description", + "done": true, + "id": 109, + "title": "1Title", + "updatedDate": "Thu Aug 02 01:25:51 EDT 2018" + }, + { + "description": "ggDescription", + "done": true, + "id": 97, + "title": "ggTitle", + "updatedDate": "Thu Aug 02 07:53:29 EDT 2018" + }, + { + "description": "Description", + "done": true, + "id": 55, + "title": "Title", + "updatedDate": "Thu Aug 02 07:57:42 EDT 2018" + }, + { + "description": "Description", + "done": true, + "id": 53, + "title": "Title", + "updatedDate": "Thu Aug 02 07:56:06 EDT 2018" } ] } \ No newline at end of file diff --git a/readme.md b/readme.md index 9217bbc..58e5ad8 100755 --- a/readme.md +++ b/readme.md @@ -6,8 +6,8 @@ | Retrofit2 | | Dagger 2 | | Data Manager | +| Sync Adapter | | Todo | | :---------------: | -| Use Dagger 2 | -| Use Data Manager | \ No newline at end of file +| Use Job Scheduler |