Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 10 additions & 12 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
apply plugin: 'com.android.application'
apply plugin: 'realm-android'

android {
compileSdkVersion 27
Expand All @@ -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'
}
40 changes: 38 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
package="com.blink22.android.mvpandroid">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.READ_SYNC_STATS"/>

<application
android:name=".BaseApp"
Expand All @@ -11,7 +18,7 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity android:name=".todos.TodosActivity"
<activity android:name=".ui.todos.TodosActivity"
android:label="@string/app_name"
>
<intent-filter>
Expand All @@ -20,9 +27,38 @@
</intent-filter>

</activity>

<provider
android:authorities="@string/content_authority"
android:name=".service.TodoProvider"
android:exported="false"
android:syncable="true"
/>

<activity android:name=".newTodo.NewTodoActivity" >
<activity android:name=".ui.newtodo.NewTodoActivity" >

</activity>

<service android:name=".service.AuthenticatorService">
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator"/>
</intent-filter>
<meta-data
android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/authenticator"/>
</service>

<service android:name=".service.SyncService"
android:exported="true"
android:process=":sync"
>

<intent-filter>
<action android:name="android.content.SyncAdapter"/>
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/syncadapter"/>
</service>
</application>
</manifest>
24 changes: 14 additions & 10 deletions app/src/main/java/com/blink22/android/mvpandroid/BaseApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

This file was deleted.

11 changes: 0 additions & 11 deletions app/src/main/java/com/blink22/android/mvpandroid/BaseView.java

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<Todo> saveTodo(Todo todo) {

return mDbHelper.saveTodo(todo);
}

@Override
public Observable<Todo> updateTodo(int id, Todo todo) {
return mDbHelper.updateTodo(id, todo);
}

@Override
public Observable<ArrayList<Todo>> 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<Todo> sourceArr, ArrayList<Todo> 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();
}
}
}
}
}
Loading