/**
* Copyright (C) 2013 Johannes Schnatterer
*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This file is part of nusic.
*
* nusic is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* nusic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with nusic. If not, see <http://www.gnu.org/licenses/>.
*/
package info.schnatterer.nusic.android;
import android.app.Application;
import com.google.inject.AbstractModule;
import com.google.inject.name.Names;
import org.slf4j.bridge.SLF4JBridgeHandler;
import info.schnatterer.nusic.R;
import info.schnatterer.nusic.android.application.NusicApplication;
import info.schnatterer.nusic.core.ArtistService;
import info.schnatterer.nusic.core.ConnectivityService;
import info.schnatterer.nusic.core.DeviceMusicService;
import info.schnatterer.nusic.core.PreferencesService;
import info.schnatterer.nusic.core.ReleaseService;
import info.schnatterer.nusic.core.RemoteMusicDatabaseService;
import info.schnatterer.nusic.core.SyncReleasesService;
import info.schnatterer.nusic.core.impl.ArtistServiceImpl;
import info.schnatterer.nusic.core.impl.ConnectivityServiceAndroid;
import info.schnatterer.nusic.core.impl.DeviceMusicServiceAndroid;
import info.schnatterer.nusic.core.impl.PreferencesServiceSharedPreferences;
import info.schnatterer.nusic.core.impl.ReleaseServiceImpl;
import info.schnatterer.nusic.core.impl.RemoteMusicDatabaseServiceMusicBrainz;
import info.schnatterer.nusic.core.impl.RemoteMusicDatabaseServiceMusicBrainz.ApplicationContact;
import info.schnatterer.nusic.core.impl.RemoteMusicDatabaseServiceMusicBrainz.ApplicationName;
import info.schnatterer.nusic.core.impl.RemoteMusicDatabaseServiceMusicBrainz.ApplicationVersion;
import info.schnatterer.nusic.core.impl.SyncReleasesServiceImpl;
import info.schnatterer.nusic.data.NusicDatabaseSqlite;
import info.schnatterer.nusic.data.dao.ArtistDao;
import info.schnatterer.nusic.data.dao.ArtworkDao;
import info.schnatterer.nusic.data.dao.ReleaseDao;
import info.schnatterer.nusic.data.dao.fs.ArtworkDaoFileSystem;
import info.schnatterer.nusic.data.dao.sqlite.ArtistDaoSqlite;
import info.schnatterer.nusic.data.dao.sqlite.ReleaseDaoSqlite;
/**
* Google guice {@link com.google.inject.Module} that configures the bindings
* service interfaces and the implementing classes. The information provided by
* this class is used by guice when resolving {@link javax.inject.Inject}
*
* @author schnatterer
*/
public class NusicAndroidModule extends AbstractModule {
private Application application;
public NusicAndroidModule(Application application) {
this.application = application;
}
@Override
protected void configure() {
installSlf4jJulHandler();
/*
* Database requires static injection, because the context must be
* injected at construction time
*/
requestStaticInjection(NusicDatabaseSqlite.class);
/*
* A lot of constants are injected here
*/
requestStaticInjection(PreferencesServiceSharedPreferences.class);
// Services
bind(ArtistService.class).to(ArtistServiceImpl.class);
bind(ConnectivityService.class).to(ConnectivityServiceAndroid.class);
bind(DeviceMusicService.class).to(DeviceMusicServiceAndroid.class);
bind(PreferencesService.class).to(
PreferencesServiceSharedPreferences.class);
bind(ReleaseService.class).to(ReleaseServiceImpl.class);
bind(RemoteMusicDatabaseService.class).to(
RemoteMusicDatabaseServiceMusicBrainz.class);
bind(SyncReleasesService.class).to(SyncReleasesServiceImpl.class);
// DAOs
bind(ReleaseDao.class).to(ReleaseDaoSqlite.class);
bind(ArtistDao.class).to(ArtistDaoSqlite.class);
bind(ArtworkDao.class).to(ArtworkDaoFileSystem.class);
// Resources
bind(String.class).annotatedWith(ApplicationName.class).toInstance(application.getString(R.string.app_name));
bind(String.class).annotatedWith(ApplicationVersion.class).toInstance(NusicApplication.getCurrentVersionName());
bind(String.class).annotatedWith(ApplicationContact.class).toInstance(application.getString(R.string.app_url));
bind(String.class).annotatedWith(Names.named("PreferencesKeyDownloadOnlyOnWifi")).toInstance(application.getString(R.string.preferences_key_download_only_on_wifi));
bind(Boolean.class).annotatedWith(Names.named("PreferencesDefaultDownloadOnlyOnWifi")).toInstance(application.getResources().getBoolean(R.bool.preferences_default_download_only_on_wifi));
bind(String.class).annotatedWith(Names.named("PreferencesKeyDownloadReleasesTimePeriod")).toInstance(application.getString(R.string.preferences_key_download_releases_time_period));
bind(String.class).annotatedWith(Names.named("PreferencesDefaultDownloadReleasesTimePeriod")).toInstance(application.getString(R.string.preferences_default_download_releases_time_period));
bind(String.class).annotatedWith(Names.named("PreferencesKeyRefreshPeriod")).toInstance(application.getString(R.string.preferences_key_refresh_period));
bind(String.class).annotatedWith(Names.named("PreferencesDefaultRefreshPeriod")).toInstance(application.getString(R.string.preferences_default_refresh_period));
bind(String.class).annotatedWith(Names.named("PreferencesKeyIsEnabledNotifyReleasedToday")).toInstance(application.getString(R.string.preferences_key_is_enabled_notify_released_today));
bind(Boolean.class).annotatedWith(Names.named("PreferencesDefaultIsEnabledNotifyReleasedToday")).toInstance(application.getResources().getBoolean(R.bool.preferences_default_is_enabled_notify_released_today));
bind(String.class).annotatedWith(Names.named("PreferencesKeyIsEnabledNotifyNewReleases")).toInstance(application.getString(R.string.preferences_key_is_enabled_notify_new_releases));
bind(Boolean.class).annotatedWith(Names.named("PreferencesDefaultIsEnabledNotifyNewReleases")).toInstance(application.getResources().getBoolean(R.bool.preferences_default_is_enabled_notify_new_releases));
bind(String.class).annotatedWith(Names.named("PreferencesKeyReleasedTodayHourOfDay")).toInstance(application.getString(R.string.preferences_key_released_today_hour_of_day));
bind(Integer.class).annotatedWith(Names.named("PreferencesDefaultReleasedTodayHourOfDay")).toInstance(parseIntOrThrow("PreferencesDefaultReleasedTodayHourOfDay", application.getString(R.string.preferences_default_released_today_hour_of_day)));
bind(String.class).annotatedWith(Names.named("PreferencesKeyReleasedTodayMinute")).toInstance(application.getString(R.string.preferences_key_released_today_minute));
bind(Integer.class).annotatedWith(Names.named("PreferencesDefaultReleasedTodayMinute")).toInstance(parseIntOrThrow("PreferencesDefaultReleasedTodayMinute", application.getString(R.string.preferences_default_released_today_minute)));
bind(String.class).annotatedWith(Names.named("PreferencesKeyLogLevelFile")).toInstance(application.getString(R.string.preferences_key_log_level_file));
bind(String.class).annotatedWith(Names.named("PreferencesDefaultLogLevelFile")).toInstance(application.getString(R.string.preferences_default_log_level_file));
bind(String.class).annotatedWith(Names.named("PreferencesKeyLogLevelLogCat")).toInstance(application.getString(R.string.preferences_key_log_level_logcat));
bind(String.class).annotatedWith(Names.named("PreferencesDefaultLogLevelLogCat")).toInstance(application.getString(R.string.preferences_default_log_level_logcat));
bind(String.class).annotatedWith(Names.named("PreferencesKeyNotifyRefreshErrors")).toInstance(application.getString(R.string.preferences_key_notify_refresh_errors));
bind(Boolean.class).annotatedWith(Names.named("PreferencesDefaultNotifyRefreshErrors")).toInstance((application.getResources().getBoolean(R.bool.preferences_default_notify_refresh_errors)));
}
/**
* Installs the java.util.logging (jul-to-slf4j) {@link SLF4JBridgeHandler}.
* As a result, all (yes, also {@link java.util.logging.Level#FINE}, etc.)
* Level JUL log statements are routed to SLF4J.
*/
private void installSlf4jJulHandler() {
/*
* add SLF4JBridgeHandler to j.u.l's root logger, should be done once
* during the initialization phase of your application
*/
SLF4JBridgeHandler.install();
}
private Integer parseIntOrThrow(String atNamedAnnotation, String prefValue) {
try {
return Integer.parseInt(prefValue);
} catch (NumberFormatException e) {
throw new RuntimeException(
"Unable to parse integer from property \""
+ atNamedAnnotation + "\", value:" + prefValue,
e);
}
}
}