Skip to content

Commit

Permalink
Merge pull request #2 from iabdelgawaad/develop
Browse files Browse the repository at this point in the history
Merge Develop Release 0.0.1
  • Loading branch information
iabdelgawaad authored Mar 15, 2018
2 parents b3e0ecd + 50403f7 commit f76a35b
Show file tree
Hide file tree
Showing 56 changed files with 2,175 additions and 53 deletions.
16 changes: 0 additions & 16 deletions .idea/misc.xml

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

6 changes: 6 additions & 0 deletions .idea/vcs.xml

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

13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# FoodMenuApp
Sample android app developed in Java to show case RxJava, Retrofit, MVP, Room and Clean code architecture.

#Tools & Technologies
- RXAndroid
- Retrofit
- Picasso
- Butter Knife
- Data Caching (Room)

#TODO
- Caching (Realm)
- Unit Testing
48 changes: 43 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,17 +1,26 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion 26
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.insta2apps.ibrahim.mfoodmenuapplication"
minSdkVersion 15
targetSdkVersion 26
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
debug {
minifyEnabled false
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguardTest-rules.pro'
buildConfigField 'String', 'BASE_URL', "\"https://api.myjson.com/\""
}
release {
buildConfigField 'String', 'BASE_URL', "\"https://api.myjson.com/\""
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
Expand All @@ -20,9 +29,38 @@ android {

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.0.0-beta1'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
implementation "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion"
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:0.5'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.2.2'

// Retrofit & OkHttp
compile "com.squareup.retrofit2:retrofit:$rootProject.retrofitVersion"
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile "io.reactivex.rxjava2:rxandroid:$rootProject.rxandroidVersion"
compile "com.squareup.okhttp3:logging-interceptor:$rootProject.okhttpVersion"
compile "com.squareup.retrofit2:adapter-rxjava2:$rootProject.retrofitVersion"

//dagger & realm
annotationProcessor 'com.google.dagger:dagger-compiler:2.13'
implementation 'com.google.dagger:dagger:2.13'

//ButterKnif
compile "com.jakewharton:butterknife:$rootProject.butterknife"
annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.butterknife"

//Picasso
compile 'com.squareup.picasso:picasso:2.5.2'

//Room
compile 'android.arch.persistence.room:runtime:' + rootProject.archRoomVersion;
annotationProcessor 'android.arch.persistence.room:compiler:' + rootProject.archRoomVersion;
// RxJava support for Room
implementation 'android.arch.persistence.room:rxjava2:'+ rootProject.archRoomVersion;

//Live data
compile 'android.arch.lifecycle:runtime:'+ rootProject.archRoomVersion;
compile 'android.arch.lifecycle:extensions:'+ rootProject.archRoomVersion;
}
9 changes: 8 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,21 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.insta2apps.ibrahim.mfoodmenuapplication">

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

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:name=".MFoodMenuApplication"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<activity android:name=".view.activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.insta2apps.ibrahim.mfoodmenuapplication;

import android.app.Application;

import com.insta2apps.ibrahim.mfoodmenuapplication.di.components.ApplicationComponent;
import com.insta2apps.ibrahim.mfoodmenuapplication.di.components.DaggerApplicationComponent;
import com.insta2apps.ibrahim.mfoodmenuapplication.di.modules.ApplicationModule;

/**
* Created by Ibrahim AbdelGawad on 3/11/2018.
*/

public class MFoodMenuApplication extends Application {
private static MFoodMenuApplication instance;
protected ApplicationComponent daggerComponent;

@Override
public void onCreate() {
super.onCreate();
instance = this;
initDagger();
}

public static MFoodMenuApplication getInstance() {
return instance;
}

protected void initDagger() {
daggerComponent = DaggerApplicationComponent.builder().applicationModule(new ApplicationModule(this)).build();
}
public ApplicationComponent getDaggerComponent() {
return daggerComponent;
}

}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.insta2apps.ibrahim.mfoodmenuapplication.data.repository;

import android.support.annotation.NonNull;

import com.insta2apps.ibrahim.mfoodmenuapplication.data.source.FoodMenuModel;
import com.insta2apps.ibrahim.mfoodmenuapplication.data.source.Item;
import com.insta2apps.ibrahim.mfoodmenuapplication.data.source.database.room.FoodMenuItemDao;
import com.insta2apps.ibrahim.mfoodmenuapplication.data.source.network.API;
import com.insta2apps.ibrahim.mfoodmenuapplication.data.source.network.RequestManager;

import java.util.List;

import javax.inject.Inject;

import io.reactivex.Flowable;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;

/**
* Created by Ibrahim AbdelGawad on 3/11/2018.
*/

public class FoodMenuRepository {

private final RequestManager requestManager;
private final FoodMenuItemDao foodMenuItemDao;

@Inject
public FoodMenuRepository(@NonNull RequestManager requestManager, FoodMenuItemDao foodMenuItemDao) {
this.requestManager = requestManager;
this.foodMenuItemDao = foodMenuItemDao;
}

public Observable<FoodMenuModel> loadFoodMenuListRemotely() {
return requestManager.startRequest(API.class).getFoodMenuList();
}

public Observable<List<Item>> loadFoodMenuListLocally() {
return Observable.create(new ObservableOnSubscribe<List<Item>>() {
@Override
public void subscribe(ObservableEmitter<List<Item>> emitter) {
List<Item> itemList = null;
itemList = foodMenuItemDao.getAll();
emitter.onNext(itemList);
emitter.onComplete();
}
});
}

public Flowable<Long> getLocalFoodMenuItemsCount() {
return foodMenuItemDao.countFoodMenuItems();
}

public void saveFoodMenuListLocally(List<Item> items) {
for (Item item : items) {
foodMenuItemDao.insertAll(item);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.insta2apps.ibrahim.mfoodmenuapplication.data.source;

import java.io.Serializable;

/**
* Created by Ibrahim AbdelGawad on 3/11/2018.
*/

public class BaseModel implements Serializable {
private String errorCode;

public String getError() {
return error;
}

public void setError(String error) {
this.error = error;
}

private String error;

public String getErrorCode() {
return errorCode;
}

public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.insta2apps.ibrahim.mfoodmenuapplication.data.source;

import java.util.List;

/**
* Created by Ibrahim AbdelGawad on 3/12/2018.
*/

public class FoodMenuModel {

private List<Item> items = null;

public List<Item> getItems() {
return items;
}

public void setItems(List<Item> items) {
this.items = items;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.insta2apps.ibrahim.mfoodmenuapplication.data.source;

import android.arch.persistence.room.Entity;

import com.google.gson.annotations.SerializedName;

/**
* Created by Ibrahim AbdelGawad on 3/11/2018.
*/
@Entity(tableName = "FoodMenuItem")
public class Item extends BaseModel {
@android.arch.persistence.room.PrimaryKey
@SerializedName("id")
private Integer id;
@SerializedName("name")
private String name;
@SerializedName("photoUrl")
private String photoUrl;
@SerializedName("description")
private String description;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPhotoUrl() {
return photoUrl;
}

public void setPhotoUrl(String photoUrl) {
this.photoUrl = photoUrl;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.insta2apps.ibrahim.mfoodmenuapplication.data.source.database.room;

import android.arch.persistence.room.Database;
import android.arch.persistence.room.RoomDatabase;

import com.insta2apps.ibrahim.mfoodmenuapplication.data.source.Item;

/**
* Created by Ibrahim AbdelGawad on 3/12/2018.
*/
@Database(entities = {Item.class}, version = AppDatabase.VERSION, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {

static final int VERSION = 1;

public abstract FoodMenuItemDao getFoodMenuItemDao();
}
Loading

0 comments on commit f76a35b

Please sign in to comment.