package com.gettingmobile.goodnews;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.view.Gravity;
import com.gettingmobile.android.app.DialogFactory;
import com.gettingmobile.android.content.ApplicationContextUtil;
import com.gettingmobile.goodnews.account.AccountHandler;
import com.gettingmobile.goodnews.account.AccountHandlerFactory;
import com.gettingmobile.goodnews.backup.BackupManager;
import com.gettingmobile.goodnews.download.ContentDownloadService;
import com.gettingmobile.goodnews.home.HomeActivity;
import com.gettingmobile.goodnews.settings.ProxyFileConfiguration;
import com.gettingmobile.goodnews.settings.Settings;
import com.gettingmobile.goodnews.sync.SyncService;
import com.gettingmobile.goodnews.sync.SyncServiceProxy;
import com.gettingmobile.goodnews.tip.StandardFullScreenTip;
import com.gettingmobile.goodnews.tip.TipManager;
import com.gettingmobile.goodnews.tip.VisualActionTip;
import com.gettingmobile.goodnews.tip.VisualViewTagTip;
import com.gettingmobile.goodnews.util.ThemeUtil;
import com.gettingmobile.google.Authenticator;
import com.gettingmobile.google.StaticAuthenticator;
import com.gettingmobile.google.reader.ItemState;
import com.gettingmobile.google.reader.db.DatabaseHelper;
import com.gettingmobile.google.reader.sync.SyncContext;
import com.gettingmobile.rest.RequestHandler;
import com.google.inject.util.Modules;
import roboguice.RoboGuice;
public class Application extends android.app.Application implements SyncContext {
private static final String LOG_TAG = "goodnews.Application";
private RequestHandler requestHandler = null;
private final StaticAuthenticator authenticator = new StaticAuthenticator();
private AccountHandler accountHandler = null;
private ThemeUtil themeUtil = null;
private DatabaseHelper dbHelper = null;
private final SyncServiceProxy syncService = new SyncServiceProxy();
private Settings settings = null;
private TipManager tipManager = null;
public Application() {
super();
Log.i(LOG_TAG, "Constructed application");
}
protected void registerTips() {
/*
* welcome
*/
tipManager.addTip(R.integer.tip_group_welcome, new StandardFullScreenTip("welcome", true));
tipManager.addTip(R.integer.tip_group_welcome, new StandardFullScreenTip("tips", true));
tipManager.addTip(R.integer.tip_group_welcome, new StandardFullScreenTip("customizing", true));
/*
* home screen
*/
tipManager.addTip(R.integer.tip_group_tag_list, new VisualActionTip("v_action_tip", R.string.vtip_action_tooltip, R.id.menu_mark_read));
tipManager.addTip(R.integer.tip_group_tag_list, new VisualActionTip("v_action_sync", R.string.vtip_sync, R.id.menu_sync_full));
tipManager.addTip(R.integer.tip_group_tag_list, new VisualViewTagTip("v_folder", R.string.vtip_folder, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, ItemState.READING_LIST.getId()));
tipManager.addTip(R.integer.tip_group_tag_list, new VisualViewTagTip("v_folder_button", R.string.vtip_folder_button, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, ItemState.READING_LIST.getId(), R.id.folder_edge_button));
tipManager.addTip(R.integer.tip_group_tag_list, new StandardFullScreenTip("welcome", false));
tipManager.addTip(R.integer.tip_group_tag_list, new StandardFullScreenTip("tips", false) {
@Override
public boolean forceAutomaticTipCheckBox() {
return true;
}
});
tipManager.addTip(R.integer.tip_group_tag_list, new StandardFullScreenTip("customizing", false));
tipManager.addTip(R.integer.tip_group_tag_list, new StandardFullScreenTip("sync", false));
tipManager.addTip(R.integer.tip_group_tag_list, new StandardFullScreenTip("home", true) {
@Override
public boolean canShowNow(Activity activity) {
return ((HomeActivity) activity).hasContent();
}
});
tipManager.addTip(R.integer.tip_group_tag_list, new StandardFullScreenTip("sync_status", false));
/*
* item list
*/
tipManager.addTip(R.integer.tip_group_item_list, new VisualActionTip("v_action_hide_read", R.string.vtip_hide, R.id.menu_show_new, R.id.menu_show_all));
tipManager.addTip(R.integer.tip_group_item_list, new VisualActionTip("v_action_read", R.string.vtip_read, R.id.menu_mark_read));
tipManager.addTip(R.integer.tip_group_item_list, new StandardFullScreenTip("items", true));
tipManager.addTip(R.integer.tip_group_item_list, new StandardFullScreenTip("offline_indicator", false,
R.string.tip_offline_indicator_mark_read, getSettings().offlineIndicatorTogglesReadState()) {
@Override
public void onAdditionalCheckBoxStateChanged(Application app, boolean checked) {
super.onAdditionalCheckBoxStateChanged(app, checked);
getSettings().setOfflineIndicatorTogglesReadState(checked);
}
});
/*
* article view
*/
tipManager.addTip(R.integer.tip_group_item_view, new VisualActionTip("v_tip_browser", R.string.vtip_browser, R.id.menu_item_browser));
tipManager.addTip(R.integer.tip_group_item_view, new VisualActionTip("v_tip_load_content", R.string.vtip_load_content, R.id.menu_item_load));
tipManager.addTip(R.integer.tip_group_item_view, new StandardFullScreenTip("item_action_bar", true));
tipManager.addTip(R.integer.tip_group_item_view, new StandardFullScreenTip("navigation", true));
tipManager.addTip(R.integer.tip_group_item_view, new StandardFullScreenTip("mobilizer", true));
}
/*
* lifecycle management
*/
@Override
public void onCreate() {
Log.i(LOG_TAG, "onCreate");
super.onCreate();
RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE,
Modules.override(RoboGuice.newDefaultRoboModule(this)).with(new InjectionModule(this)));
/*
* init settings
*/
Log.i(LOG_TAG, "Initializing settings");
settings = new Settings(this);
ProxyFileConfiguration.init(this);
BackupManager.init(this);
/*
* init database
*/
Log.i(LOG_TAG, "Initializing database");
dbHelper = DatabaseHelper.create(this, settings);
/*
* initiate request handler
*/
Log.i(LOG_TAG, "Initializing request handler");
requestHandler = new RequestHandler();
requestHandler.start();
/*
* init other stuff
*/
Log.i(LOG_TAG, "Initializing other stuff");
themeUtil = new ThemeUtil(this);
syncService.startService(this);
accountHandler = AccountHandlerFactory.getInstance().createAccountHandler(this);
/*
* init tips
*/
tipManager = new TipManager(settings);
registerTips();
}
@Override
public void onTerminate() {
syncService.stopService(this);
requestHandler.shutdown();
dbHelper.close();
super.onTerminate();
}
/*
* generic helpers
*/
public PackageInfo getPackageInfo() {
return ApplicationContextUtil.getPackageInfo(this);
}
public ApplicationInfo getApplicationInfo() {
return ApplicationContextUtil.getApplicationInfo(this);
}
public String getApplicationName() {
return ApplicationContextUtil.getApplicationName(this);
}
public ThemeUtil getThemeUtil() {
return themeUtil;
}
public RequestHandler getRequestHandler() {
return requestHandler;
}
public SyncServiceProxy getSyncService() {
return syncService;
}
@Override
public Context getContext() {
return this;
}
@Override
public Settings getSettings() {
return settings;
}
public void authenticate(String authToken) {
authenticator.setAuthToken(authToken);
authenticator.setEditToken(null);
getSettings().setAuthToken(authToken);
}
public boolean isLoggedIn() {
return authenticator.hasValidAuthToken();
}
@Override
public Authenticator getAuthenticator() {
return authenticator;
}
public AccountHandler getAccountHandler() {
return accountHandler;
}
/*
* database handling
*/
@Override
public DatabaseHelper getDbHelper() {
return dbHelper;
}
public void onItemTagsChanged() {
final SyncService svc = getSyncService().getService();
if (svc != null) {
svc.scheduleImmediatePushSyncIfApplicable();
}
ContentDownloadService.startAfterTagChangeIfApplicable(this);
}
/*
* network handling
*/
public boolean isInternetAvailable() {
final ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
final NetworkInfo ni = cm.getActiveNetworkInfo();
return ni != null && ni.isConnected();
}
public boolean isInternetAvailableAndRequired() {
return !settings.checkForInternetConnection() || isInternetAvailable();
}
public boolean checkInternetAvailableAndRequired(android.app.Activity activity) {
if (!isInternetAvailableAndRequired()) {
DialogFactory.showErrorDialog(activity,
R.string.error_no_internet_title, getString(R.string.error_no_internet_msg));
return false;
} else {
return true;
}
}
public boolean isWifiConnected() {
final ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
final NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return ni != null && ni.isConnected();
}
/*
* tips
*/
public TipManager getTipManager() {
return tipManager;
}
}