package com.ghostsq.commander; import com.ghostsq.commander.adapters.CommanderAdapter; import com.ghostsq.commander.adapters.Engine; import com.ghostsq.commander.adapters.Engines; import android.content.Intent; import android.app.Service; import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; public class BackgroundWork extends Service implements IBackgroundWork { private final static String TAG = "BackgroundWork"; private Engines engines = null; private Commander commander = null; private WorkerHandler workerHandler = null; private class BackgroundWorkBinder extends Binder implements IBackgroundWorkBinder { public IBackgroundWork init( Commander c ) { commander = c; return BackgroundWork.this; } } private final IBinder binder = new BackgroundWorkBinder(); @Override public void onCreate() { super.onCreate(); engines = new Engines(); workerHandler = new WorkerHandler(); } @Override public void onStart( Intent intent, int start_id ) { super.onStart( intent, start_id ); } @Override public void onDestroy() { super.onDestroy(); engines.terminateAll(); Log.d( TAG, "onDestroy" ); } @Override public IBinder onBind( Intent intent ) { return binder; } protected class WorkerHandler extends Handler { @Override public void handleMessage( Message msg ) { Bundle b = msg.getData(); long id = b.getLong( Commander.NOTIFY_TASK ); try { String[] items = b.getStringArray( Engines.IReciever.NOTIFY_ITEMS_TO_RECEIVE ); if( items != null ) { Engine eng = engines.get( id ); if( eng != null ) { Engines.IReciever recipient = eng.getReciever(); if( recipient != null ) recipient.receiveItems( items, CommanderAdapter.MODE_MOVE_DEL_SRC_DIR ); } } } catch( Exception e ) { e.printStackTrace(); } if( commander == null || commander.notifyMe( msg ) ) { engines.remove( id ); } } }; // --- IBackgroundWork implementation public void start( Engine engine ) { engine.setHandler( workerHandler ); engines.addAndStart( engine ); } public boolean stopEngine( long task_id ) { engines.remove( task_id ); return true; } }