package com.vaguehope.onosendai.storage; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import com.vaguehope.onosendai.util.LogWrapper; public class DbClient { private final LogWrapper log = new LogWrapper(); private final Context context; private Runnable dbIsReady = null; private DbInterface boundDbService; private boolean boundToService = false; public DbClient (final Context context, final String name) { this(context, name, null); } public DbClient (final Context context, final String name, final Runnable dbIsReady) { this.context = context; this.log.setPrefix(name); this.dbIsReady = dbIsReady; bindDbService(); } public void dispose () { clearReadyListener(); unbindDbService(); } @Override protected void finalize () throws Throwable { // NOSONAR finalize throws Throwable. unbindDbService(); super.finalize(); } public void clearReadyListener () { this.dbIsReady = null; } public DbInterface getDb () { return this.boundDbService; } protected LogWrapper getLog () { return this.log; } protected void callDbReadyListener () { if (this.dbIsReady != null) this.dbIsReady.run(); } protected void setBoundDbService (final DbInterface boundDbService) { this.boundDbService = boundDbService; } private final ServiceConnection mDbServiceConnection = new ServiceConnection() { @Override public void onServiceConnected (final ComponentName className, final IBinder service) { setBoundDbService(((DbService.LocalBinder) service).getService()); if (getDb() == null) getLog().e("Got service call back, but mBoundDbService==null. Expect more error messags!"); callDbReadyListener(); } @Override public void onServiceDisconnected (final ComponentName className) { // This is called when the connection with the service has been // unexpectedly disconnected -- that is, its process crashed. // Because it is running in our same process, we should never // see this happen. setBoundDbService(null); getLog().w("DbService unexpectadly disconnected."); } }; private void bindDbService () { this.boundToService = this.context.bindService(new Intent(this.context, DbService.class), this.mDbServiceConnection, Context.BIND_AUTO_CREATE); if (!this.boundToService) { this.log.e("Failed to bind to DBService. Expect further nasty errors."); } } private void unbindDbService () { if (this.boundToService && this.boundDbService != null) { try { this.context.unbindService(this.mDbServiceConnection); } catch (Exception e) { this.log.e("Exception caught in unbindDbService().", e); } } this.boundDbService = null; } }