/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at
* src/com/vodafone360/people/VODAFONE.LICENSE.txt or
* http://github.com/360/360-Engine-for-Android
* See the License for the specific language governing permissions and
* limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each file and
* include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt.
* If applicable, add the following below this CDDL HEADER, with the fields
* enclosed by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
* Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved.
* Use is subject to license terms.
*/
package com.vodafone360.people;
import android.app.Application;
import android.content.Intent;
import android.os.Handler;
import com.vodafone360.people.database.DatabaseHelper;
import com.vodafone360.people.engine.EngineManager;
import com.vodafone360.people.engine.contactsync.NativeContactsApi;
import com.vodafone360.people.service.PersistSettings;
import com.vodafone360.people.service.RemoteService;
import com.vodafone360.people.service.ServiceStatus;
import com.vodafone360.people.service.PersistSettings.InternetAvail;
import com.vodafone360.people.service.interfaces.IPeopleService;
import com.vodafone360.people.utils.LogUtils;
import com.vodafone360.people.utils.LoginPreferences;
import com.vodafone360.people.utils.WidgetUtils;
/**
* Application class used to create the connection to the service and cache
* state between Activities.
*/
public class MainApplication extends Application {
private IPeopleService mServiceInterface;
private Handler mServiceLoadedHandler;
private DatabaseHelper mDatabaseHelper;
private final ApplicationCache mApplicationCache = new ApplicationCache();
/**
* Called when the Application is created.
*/
@Override
public void onCreate() {
super.onCreate();
SettingsManager.loadProperties(this);
mDatabaseHelper = new DatabaseHelper(this);
mDatabaseHelper.start();
LoginPreferences.getCurrentLoginActivity(this);
/** Start the Service. **/
startService(new Intent(this, RemoteService.class));
}
/**
* Called when the Application is exited.
*/
@Override
public void onTerminate() {
// FlurryAgent.onEndSession(this);
if (mDatabaseHelper != null) {
mDatabaseHelper.close();
}
super.onTerminate();
}
/**
* Return handle to DatabaseHelper, currently provides main point of access
* to People client's database tables.
*
* @return Handle to DatabaseHelper.
*/
public DatabaseHelper getDatabase() {
return mDatabaseHelper;
}
/**
* Return handle to ApplicationCache.
*
* @return handle to ApplicationCache.
*/
public ApplicationCache getCache() {
return mApplicationCache;
}
/**
* Remove all user data from People client, this includes all account
* information (downloaded contacts, login credentials etc.) and all cached
* settings.
*/
public synchronized void removeUserData() {
EngineManager mEngineManager = EngineManager.getInstance();
if (mEngineManager != null) {
// Resets all the engines, the call will block until every engines
// have been reset.
mEngineManager.resetAllEngines();
}
// Remove NAB Account at this point (does nothing on 1.X)
NativeContactsApi.getInstance().removePeopleAccount();
// the same action as in NetworkSettingsActivity onChecked()
setInternetAvail(InternetAvail.ALWAYS_CONNECT, false);
mDatabaseHelper.removeUserData();
// Before clearing the Application cache, kick the widget update. Pref's
// file contain the widget ID.
WidgetUtils.kickWidgetUpdateNow(this);
mApplicationCache.clearCachedData(this);
}
/**
* Register a Handler to receive notification when the People service has
* loaded. If mServiceInterface == NULL then this means that the UI is
* starting before the service has loaded - in this case the UI registers to
* be notified when the service is loaded using the serviceLoadedHandler.
* TODO: consider any pitfalls in this situation.
*
* @param serviceLoadedHandler Handler that receives notification of service
* being loaded.
*/
public synchronized void registerServiceLoadHandler(Handler serviceLoadedHandler) {
if (mServiceInterface != null) {
onServiceLoaded();
} else {
mServiceLoadedHandler = serviceLoadedHandler;
LogUtils.logI("MainApplication.registerServiceLoadHandler() mServiceInterface is NULL "
+ "- need to wait for service to be loaded");
}
}
/**
* Un-register People service loading handler.
*/
public synchronized void unRegisterServiceLoadHandler() {
mServiceLoadedHandler = null;
}
private void onServiceLoaded() {
if (mServiceLoadedHandler != null) {
mServiceLoadedHandler.sendEmptyMessage(0);
}
}
/**
* Set IPeopleService interface - this is the interface by which we
* interface to People service.
*
* @param serviceInterface IPeopleService handle.
*/
public synchronized void setServiceInterface(IPeopleService serviceInterface) {
if (serviceInterface == null) {
LogUtils.logE("MainApplication.setServiceInterface() "
+ "New serviceInterface should not be NULL");
}
mServiceInterface = serviceInterface;
onServiceLoaded();
}
/**
* Return current IPeopleService interface. TODO: The case where
* mServiceInterface = NULL needs to be considered.
*
* @return current IPeopleService interface (can be null).
*/
public synchronized IPeopleService getServiceInterface() {
if (mServiceInterface == null) {
LogUtils.logE("MainApplication.getServiceInterface() "
+ "mServiceInterface should not be NULL");
}
return mServiceInterface;
}
/**
* Set Internet availability - always makes Internet available, only
* available in home network, allow manual connection only. This setting is
* stored in People database.
*
* @param internetAvail Internet availability setting.
* @param forwardToSyncAdapter TRUE if the SyncAdater needs to know about the changes, FALSE otherwise
* @return SerivceStatus indicating whether the Internet availability
* setting has been successfully updated in the database.
*/
public ServiceStatus setInternetAvail(InternetAvail internetAvail, boolean forwardToSyncAdapter) {
if (getInternetAvail() == internetAvail) {
return ServiceStatus.SUCCESS;
}
if(internetAvail == InternetAvail.ALWAYS_CONNECT &&
!NativeContactsApi.getInstance().getMasterSyncAutomatically()) {
// FIXME: Perhaps an abusive use of this error code for when
// Master Sync Automatically is OFF, should have a different
LogUtils.logW("ServiceStatus.setInternetAvail() [master sync is off]");
return ServiceStatus.ERROR_NO_AUTO_CONNECT;
}
PersistSettings mPersistSettings = new PersistSettings();
mPersistSettings.putInternetAvail(internetAvail);
ServiceStatus ss = mDatabaseHelper.setOption(mPersistSettings);
// FIXME: This is a hack in order to set the system auto sync on/off depending on our data settings
if (forwardToSyncAdapter) {
NativeContactsApi.getInstance().setSyncAutomatically(internetAvail == InternetAvail.ALWAYS_CONNECT);
}
synchronized (this) {
if (mServiceInterface != null) {
mServiceInterface.notifyDataSettingChanged(internetAvail);
} else {
LogUtils.logE("MainApplication.setInternetAvail() "
+ "mServiceInterface should not be NULL");
}
}
return ss;
}
/**
* Retrieve Internet availability setting from People database.
*
* @return current Internet availability setting.
*/
public InternetAvail getInternetAvail() {
return mDatabaseHelper.fetchOption(PersistSettings.Option.INTERNETAVAIL).getInternetAvail();
}
}