// Path: app/src/main/java/mk/petrovski/weathergurumvp/data/AppDataManager.java
// public class AppDataManager implements DataManager {
// 
//   private final Context context;
//   private final DbHelper dbHelper;
//   private final PreferencesHelper applicationPreferences;
//   private final ApiHelper apiHelper;
// 
//   @Inject
//   public AppDataManager(Context context, DbHelper dbHelper,
//       PreferencesHelper applicationPreferences, ApiHelper apiHelper) {
//     this.context = context;
//     this.dbHelper = dbHelper;
//     this.applicationPreferences = applicationPreferences;
//     this.apiHelper = apiHelper;
//   }
// 
//   @Override public void setLoggedIn() {
//     applicationPreferences.setLoggedIn();
//   }
// 
//   @Override public boolean isLoggedIn() {
//     return applicationPreferences.isLoggedIn();
//   }
// 
//   @Override public void setUserName(String userName) {
//     applicationPreferences.setUserName(userName);
//   }
// 
//   @Override public String getUserName() {
//     return applicationPreferences.getUserName();
//   }
// 
//   @Override public Observable<Long> addNewCity(LocationModel locationModel) {
//     return dbHelper.addNewCity(locationModel);
//   }
// 
//   @Override public Observable<Long> addDefaultCity() {
//     return dbHelper.addDefaultCity();
//   }
// 
//   @Override public Observable<List<CityDetailsModel>> getAllCities() {
//     return dbHelper.getAllCities();
//   }
// 
//   @Override public Observable<Boolean> deleteCity(CityDetailsModel city) {
//     return dbHelper.deleteCity(city);
//   }
// 
//   @Override public Observable<CityDetailsModel> getSelectedCity() {
//     return dbHelper.getSelectedCity();
//   }
// 
//   @Override public Observable<CityDetailsModel> getCityById(Long id) {
//     return dbHelper.getCityById(id);
//   }
// 
//   @Override public Observable<Boolean> selectCity(CityDetailsModel city, boolean isSelected) {
//     return dbHelper.selectCity(city, isSelected);
//   }
// 
//   @Override public Observable<Boolean> selectFirstCity() {
//     return dbHelper.selectFirstCity();
//   }
// 
//   @Override public CityDetailsModel getSelectedCityModel() {
//     return dbHelper.getSelectedCityModel();
//   }
// 
//   @Override public Long getCitiesCount() {
//     return dbHelper.getCitiesCount();
//   }
// 
//   @Override public Boolean isCityExist(String weatherUrl) {
//     return dbHelper.isCityExist(weatherUrl);
//   }
// 
//   @Override
//   public Observable<WeatherResponseModel> weatherApiRequest(String latitude, String longitude) {
//     return apiHelper.weatherApiRequest(latitude, longitude);
//   }
// 
//   @Override public Observable<SearchApiResponseModel> locationsApiRequest(String query) {
//     return apiHelper.locationsApiRequest(query);
//   }
// 
//   @Override public ErrorHandlerHelper getErrorHandlerHelper() {
//     return apiHelper.getErrorHandlerHelper();
//   }
// 
//   @Override public void setErrorHandler(ErrorHandlerHelper errorHandler) {
//     apiHelper.setErrorHandler(errorHandler);
//   }
// }
// 
// Path: app/src/main/java/mk/petrovski/weathergurumvp/data/DataManager.java
// public interface DataManager extends PreferencesHelper, DbHelper, ApiHelper {
// }
// 
// Path: app/src/main/java/mk/petrovski/weathergurumvp/data/local/db/DbHelper.java
// public interface DbHelper {
// 
//   Observable<Long> addNewCity(LocationModel locationModel);
// 
//   Observable<Long> addDefaultCity();
// 
//   Observable<List<CityDetailsModel>> getAllCities();
// 
//   Observable<Boolean> deleteCity(CityDetailsModel city);
// 
//   Observable<CityDetailsModel> getSelectedCity();
// 
//   Observable<CityDetailsModel> getCityById(Long id);
// 
//   Observable<Boolean> selectCity(CityDetailsModel city, boolean isSelected);
// 
//   Observable<Boolean> selectFirstCity();
// 
//   CityDetailsModel getSelectedCityModel();
// 
//   Long getCitiesCount();
// 
//   Boolean isCityExist(String weatherUrl);
// }
// 
// Path: app/src/main/java/mk/petrovski/weathergurumvp/data/local/preferences/PreferencesHelper.java
// public interface PreferencesHelper {
// 
//   void setLoggedIn();
// 
//   boolean isLoggedIn();
// 
//   void setUserName(String userName);
// 
//   String getUserName();
// }
// 
// Path: app/src/main/java/mk/petrovski/weathergurumvp/data/remote/ApiHelper.java
// public interface ApiHelper {
// 
//   Observable<WeatherResponseModel> weatherApiRequest(String latitude, String longitude);
// 
//   Observable<SearchApiResponseModel> locationsApiRequest(String query);
// 
//   ErrorHandlerHelper getErrorHandlerHelper();
// 
//   void setErrorHandler(ErrorHandlerHelper errorHandler);
// }


import android.app.Application;
import android.content.Context;
import dagger.Module;
import dagger.Provides;
import mk.petrovski.weathergurumvp.R;
import mk.petrovski.weathergurumvp.data.AppDataManager;
import mk.petrovski.weathergurumvp.data.DataManager;
import mk.petrovski.weathergurumvp.data.local.db.DbHelper;
import mk.petrovski.weathergurumvp.data.local.preferences.PreferencesHelper;
import mk.petrovski.weathergurumvp.data.remote.ApiHelper;
import mk.petrovski.weathergurumvp.injection.qualifier.ApplicationContext;
import mk.petrovski.weathergurumvp.injection.scope.WeatherGuruApplicationScope;
import uk.co.chrisjenx.calligraphy.CalligraphyConfig;
package mk.petrovski.weathergurumvp.injection.module;


/**
 * Created by Nikola Petrovski on 2/13/2017.
 */

@Module(includes = {
    ContextModule.class, PreferencesModule.class, NetworkModule.class, DatabaseModule.class
}) public class ApplicationModule {

  private final Application application;

  public ApplicationModule(Application application) {
    this.application = application;
  }

  @Provides Application getApplication() {
    return application;
  }

  @Provides @WeatherGuruApplicationScope CalligraphyConfig getCalligraphyConfig() {
    return new CalligraphyConfig.Builder().setDefaultFontPath("fonts/Roboto-Regular.ttf")
        .setFontAttrId(R.attr.fontPath)
        .build();
  }

// Path: app/src/main/java/mk/petrovski/weathergurumvp/data/AppDataManager.java
// public class AppDataManager implements DataManager {
// 
//   private final Context context;
//   private final DbHelper dbHelper;
//   private final PreferencesHelper applicationPreferences;
//   private final ApiHelper apiHelper;
// 
//   @Inject
//   public AppDataManager(Context context, DbHelper dbHelper,
//       PreferencesHelper applicationPreferences, ApiHelper apiHelper) {
//     this.context = context;
//     this.dbHelper = dbHelper;
//     this.applicationPreferences = applicationPreferences;
//     this.apiHelper = apiHelper;
//   }
// 
//   @Override public void setLoggedIn() {
//     applicationPreferences.setLoggedIn();
//   }
// 
//   @Override public boolean isLoggedIn() {
//     return applicationPreferences.isLoggedIn();
//   }
// 
//   @Override public void setUserName(String userName) {
//     applicationPreferences.setUserName(userName);
//   }
// 
//   @Override public String getUserName() {
//     return applicationPreferences.getUserName();
//   }
// 
//   @Override public Observable<Long> addNewCity(LocationModel locationModel) {
//     return dbHelper.addNewCity(locationModel);
//   }
// 
//   @Override public Observable<Long> addDefaultCity() {
//     return dbHelper.addDefaultCity();
//   }
// 
//   @Override public Observable<List<CityDetailsModel>> getAllCities() {
//     return dbHelper.getAllCities();
//   }
// 
//   @Override public Observable<Boolean> deleteCity(CityDetailsModel city) {
//     return dbHelper.deleteCity(city);
//   }
// 
//   @Override public Observable<CityDetailsModel> getSelectedCity() {
//     return dbHelper.getSelectedCity();
//   }
// 
//   @Override public Observable<CityDetailsModel> getCityById(Long id) {
//     return dbHelper.getCityById(id);
//   }
// 
//   @Override public Observable<Boolean> selectCity(CityDetailsModel city, boolean isSelected) {
//     return dbHelper.selectCity(city, isSelected);
//   }
// 
//   @Override public Observable<Boolean> selectFirstCity() {
//     return dbHelper.selectFirstCity();
//   }
// 
//   @Override public CityDetailsModel getSelectedCityModel() {
//     return dbHelper.getSelectedCityModel();
//   }
// 
//   @Override public Long getCitiesCount() {
//     return dbHelper.getCitiesCount();
//   }
// 
//   @Override public Boolean isCityExist(String weatherUrl) {
//     return dbHelper.isCityExist(weatherUrl);
//   }
// 
//   @Override
//   public Observable<WeatherResponseModel> weatherApiRequest(String latitude, String longitude) {
//     return apiHelper.weatherApiRequest(latitude, longitude);
//   }
// 
//   @Override public Observable<SearchApiResponseModel> locationsApiRequest(String query) {
//     return apiHelper.locationsApiRequest(query);
//   }
// 
//   @Override public ErrorHandlerHelper getErrorHandlerHelper() {
//     return apiHelper.getErrorHandlerHelper();
//   }
// 
//   @Override public void setErrorHandler(ErrorHandlerHelper errorHandler) {
//     apiHelper.setErrorHandler(errorHandler);
//   }
// }
// 
// Path: app/src/main/java/mk/petrovski/weathergurumvp/data/DataManager.java
// public interface DataManager extends PreferencesHelper, DbHelper, ApiHelper {
// }
// 
// Path: app/src/main/java/mk/petrovski/weathergurumvp/data/local/db/DbHelper.java
// public interface DbHelper {
// 
//   Observable<Long> addNewCity(LocationModel locationModel);
// 
//   Observable<Long> addDefaultCity();
// 
//   Observable<List<CityDetailsModel>> getAllCities();
// 
//   Observable<Boolean> deleteCity(CityDetailsModel city);
// 
//   Observable<CityDetailsModel> getSelectedCity();
// 
//   Observable<CityDetailsModel> getCityById(Long id);
// 
//   Observable<Boolean> selectCity(CityDetailsModel city, boolean isSelected);
// 
//   Observable<Boolean> selectFirstCity();
// 
//   CityDetailsModel getSelectedCityModel();
// 
//   Long getCitiesCount();
// 
//   Boolean isCityExist(String weatherUrl);
// }
// 
// Path: app/src/main/java/mk/petrovski/weathergurumvp/data/local/preferences/PreferencesHelper.java
// public interface PreferencesHelper {
// 
//   void setLoggedIn();
// 
//   boolean isLoggedIn();
// 
//   void setUserName(String userName);
// 
//   String getUserName();
// }
// 
// Path: app/src/main/java/mk/petrovski/weathergurumvp/data/remote/ApiHelper.java
// public interface ApiHelper {
// 
//   Observable<WeatherResponseModel> weatherApiRequest(String latitude, String longitude);
// 
//   Observable<SearchApiResponseModel> locationsApiRequest(String query);
// 
//   ErrorHandlerHelper getErrorHandlerHelper();
// 
//   void setErrorHandler(ErrorHandlerHelper errorHandler);
// }


// Path: app/src/main/java/mk/petrovski/weathergurumvp/injection/module/ApplicationModule.java
import android.app.Application;
import android.content.Context;
import dagger.Module;
import dagger.Provides;
import mk.petrovski.weathergurumvp.R;
import mk.petrovski.weathergurumvp.data.AppDataManager;
import mk.petrovski.weathergurumvp.data.DataManager;
import mk.petrovski.weathergurumvp.data.local.db.DbHelper;
import mk.petrovski.weathergurumvp.data.local.preferences.PreferencesHelper;
import mk.petrovski.weathergurumvp.data.remote.ApiHelper;
import mk.petrovski.weathergurumvp.injection.qualifier.ApplicationContext;
import mk.petrovski.weathergurumvp.injection.scope.WeatherGuruApplicationScope;
import uk.co.chrisjenx.calligraphy.CalligraphyConfig;

package mk.petrovski.weathergurumvp.injection.module;


/**
 * Created by Nikola Petrovski on 2/13/2017.
 */

@Module(includes = {
    ContextModule.class, PreferencesModule.class, NetworkModule.class, DatabaseModule.class
}) public class ApplicationModule {

  private final Application application;

  public ApplicationModule(Application application) {
    this.application = application;
  }

  @Provides Application getApplication() {
    return application;
  }

  @Provides @WeatherGuruApplicationScope CalligraphyConfig getCalligraphyConfig() {
    return new CalligraphyConfig.Builder().setDefaultFontPath("fonts/Roboto-Regular.ttf")
        .setFontAttrId(R.attr.fontPath)
        .build();
  }

  @Provides @WeatherGuruApplicationScope AppDataManager getAppDataManager(