app/src/main/java/org/mcopenplatform/muoapi/managerIapi/ManagerIapiBase.java
c732d49e
 /*
  *
74ca6d11
  *   Copyright (C) 2020, University of the Basque Country (UPV/EHU)
c732d49e
  *
  *  Contact for licensing options: <licensing-mcpttclient(at)mcopenplatform(dot)com>
  *
  *  This file is part of MCOP MCPTT Client
  *
  *  This 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.
  *
  *  This 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 this program; if not, write to the Free Software Foundation, Inc.,
  *  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  */
 
 package org.mcopenplatform.muoapi.managerIapi;
 
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
175b478c
 import android.os.Build;
c732d49e
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
 import android.util.Log;
 
 import org.mcopenplatform.iapi.McopMessenger;
 import org.mcopenplatform.muoapi.BuildConfig;
 
 import static android.content.Context.BIND_AUTO_CREATE;
 
 
 public abstract class ManagerIapiBase {
     private final static String TAG = org.mcopenplatform.muoapi.utils.Utils.getTAG(ManagerIapiBase.class.getCanonicalName());
     protected ServiceConnection mConnection;
     protected Object mService;
     protected McopMessenger mcopMessenger;
     protected boolean isConnect;
     protected String PACKET_SERVICE="org.mcopenplatform.iapi.test";
     protected Context mContext;
     protected Handler handler;
     protected OnIapiListener onIapiListener;
175b478c
     protected boolean changedPacket=false;
c732d49e
     public ManagerIapiBase() {
         mContext=null;
         isConnect=false;
         handler = new Handler(Looper.getMainLooper()) {
             @Override
             public void handleMessage(Message message) {
                 if(BuildConfig.DEBUG)Log.d(TAG,"Received Message from: "+getPACKET_SERVICE());
                 //TODO: receive Message and process data from other Service
                 receiveEvent(message);
             }
         };
         mcopMessenger=new McopMessenger(handler);
     }
 
175b478c
     public boolean start(Context context
             ,String packetService
             ,String packetMainService
         ) {
         if(packetService!=null){
             setPACKET_SERVICE(packetService);
         }
         if(packetMainService !=null){
             setPACKET_MAIN_SERVICE(packetMainService);
         }
c732d49e
         if(BuildConfig.DEBUG)Log.d(TAG, "Starting..."+getPACKET_SERVICE());
         mContext=context;
 
         if(mConnection==null)
             mConnection = new ServiceConnection() {
 
                 @Override
                 public void onServiceConnected(ComponentName className, IBinder service) {
                     Log.d(TAG,"Service binded! "+getPACKET_SERVICE());
                     mService=registerInterface(service);
                     isConnect=true;
175b478c
                     isServiceConnected();
c732d49e
                 }
 
                 @Override
                 public void onServiceDisconnected(ComponentName className) {
                     mService = null;
                     //This method is only invoked when the service quits from the other end or gets killed
                     //Invoking exit() from the AIDL interface makes the Service kill itself, thus invoking this.
                     Log.e(TAG,"Service disconnected "+getPACKET_SERVICE());
                     isConnect=false;
                 }
 
                 @Override
                 public void onBindingDied(ComponentName name) {
                     Log.e(TAG,"Service died."+getPACKET_SERVICE());
                 }
             };
 
         Intent serviceIntent = new Intent()
                 .setComponent(new ComponentName(
                         getPACKET_MAIN_SERVICE(),
                         getPACKET_SERVICE()));
         serviceIntent.setAction(getPACKET_SERVICE());
 
         try{
175b478c
             ComponentName componentName=null;
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                 componentName=mContext.startForegroundService(serviceIntent);
             }
             else
                 componentName=mContext.startService(serviceIntent);
c732d49e
             if(componentName!=null){
                 Log.d(TAG,"Start Service: "+componentName.getPackageName());
             }else{
175b478c
                 if(BuildConfig.DEBUG)Log.e(TAG,"Service Error: "+getPACKET_SERVICE() +" "+getPACKET_MAIN_SERVICE());
c732d49e
             }
         }catch (Exception e){
             if(BuildConfig.DEBUG)Log.w(TAG,"Error in start service: "+e.getMessage());
         }
         Log.d(TAG,"Bind Service "+getPACKET_SERVICE()+":"+context.bindService(serviceIntent, mConnection, BIND_AUTO_CREATE));
         startInternal();
         return true;
     }
 
     public boolean stop() {
         if(BuildConfig.DEBUG)Log.d(TAG, "Stopping..."+getPACKET_SERVICE());
         if(mContext!=null)
         mContext.unbindService(mConnection);
 
         isConnect=false;
         stopInternal();
         return true;
     }
 
175b478c
     abstract protected void isServiceConnected();
 
c732d49e
     abstract protected void startInternal();
 
     abstract protected void stopInternal();
 
     abstract protected Object registerInterface(IBinder service);
 
     abstract protected boolean receiveEvent(Message message);
 
 
     /**
      * It allows to distinguish between the different PACKET_SERVICE for each of the extended class of ManagerIapiBase
      * @return PACKET_SERVICE constant
      */
     abstract protected String getPACKET_SERVICE();
 
     abstract protected String getPACKET_MAIN_SERVICE();
 
175b478c
 
     abstract protected void setPACKET_SERVICE(String packetService);
 
     abstract protected void setPACKET_MAIN_SERVICE(String packetMainService);
 
 
     abstract protected boolean checkChangedPacket();
 
 
 
 
 
c732d49e
     public boolean isConnect() {
         return isConnect;
     }
 
     interface OnIapiListener{
         void onIapiError(int codeError,String error);
     }
 
     public void setOnIapiListener(OnIapiListener onIapiListener){
         this.onIapiListener=onIapiListener;
     }
 }