Commit 18d4f148 authored by Andrey Kamaev's avatar Andrey Kamaev Committed by OpenCV Buildbot

Merge pull request #792 from asmorkalov:manager_incompat_wh

parents 9ba25e9d ec6f0e1b
...@@ -4,23 +4,43 @@ import android.os.IBinder; ...@@ -4,23 +4,43 @@ import android.os.IBinder;
public class BinderConnector public class BinderConnector
{ {
public BinderConnector(MarketConnector Market) public BinderConnector(MarketConnector Market) {
{ mMarket = Market;
Init(Market); }
public boolean Init() {
boolean result = false;
if (mIsReady)
result = Init(mMarket);
return result;
} }
public native IBinder Connect(); public native IBinder Connect();
public boolean Disconnect() public boolean Disconnect()
{ {
if (mIsReady)
Final(); Final();
return true;
return mIsReady;
} }
static private native boolean Init(MarketConnector Market);
{ private native void Final();
private static boolean mIsReady = false;
private MarketConnector mMarket;
static {
try {
System.loadLibrary("OpenCVEngine"); System.loadLibrary("OpenCVEngine");
System.loadLibrary("OpenCVEngine_jni"); System.loadLibrary("OpenCVEngine_jni");
mIsReady = true;
}
catch(UnsatisfiedLinkError e) {
mIsReady = false;
e.printStackTrace();
}
} }
private native boolean Init(MarketConnector Market);
public native void Final();
} }
...@@ -47,9 +47,17 @@ public class HardwareDetector ...@@ -47,9 +47,17 @@ public class HardwareDetector
public static native int DetectKnownPlatforms(); public static native int DetectKnownPlatforms();
static public static boolean mIsReady = false;
{
static {
try {
System.loadLibrary("OpenCVEngine"); System.loadLibrary("OpenCVEngine");
System.loadLibrary("OpenCVEngine_jni"); System.loadLibrary("OpenCVEngine_jni");
mIsReady = true;
}
catch(UnsatisfiedLinkError e) {
mIsReady = false;
e.printStackTrace();
}
} }
} }
...@@ -3,31 +3,62 @@ package org.opencv.engine; ...@@ -3,31 +3,62 @@ package org.opencv.engine;
import android.app.Service; import android.app.Service;
import android.content.Intent; import android.content.Intent;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log; import android.util.Log;
public class OpenCVEngineService extends Service public class OpenCVEngineService extends Service
{ {
private static final String TAG = "OpenCVEngine/Service"; private static final String TAG = "OpenCVEngine/Service";
private IBinder mEngineInterface; private IBinder mEngineInterface = null;
private MarketConnector mMarket; private MarketConnector mMarket;
private BinderConnector mNativeBinder; private BinderConnector mNativeBinder;
public void onCreate()
{ public void onCreate() {
Log.i(TAG, "Service starting"); Log.i(TAG, "Service starting");
super.onCreate(); super.onCreate();
Log.i(TAG, "Engine binder component creating"); Log.i(TAG, "Engine binder component creating");
mMarket = new MarketConnector(getBaseContext()); mMarket = new MarketConnector(getBaseContext());
mNativeBinder = new BinderConnector(mMarket); mNativeBinder = new BinderConnector(mMarket);
if (mNativeBinder.Init()) {
mEngineInterface = mNativeBinder.Connect(); mEngineInterface = mNativeBinder.Connect();
Log.i(TAG, "Service started successfully"); Log.i(TAG, "Service started successfully");
} else {
Log.e(TAG, "Cannot initialize native part of OpenCV Manager!");
Log.e(TAG, "Using stub instead");
mEngineInterface = new OpenCVEngineInterface.Stub() {
@Override
public boolean installVersion(String version) throws RemoteException {
// TODO Auto-generated method stub
return false;
} }
public IBinder onBind(Intent intent) @Override
{ public String getLibraryList(String version) throws RemoteException {
// TODO Auto-generated method stub
return null;
}
@Override
public String getLibPathByVersion(String version) throws RemoteException {
// TODO Auto-generated method stub
return null;
}
@Override
public int getEngineVersion() throws RemoteException {
return -1;
}
};
}
}
public IBinder onBind(Intent intent) {
Log.i(TAG, "Service onBind called for intent " + intent.toString()); Log.i(TAG, "Service onBind called for intent " + intent.toString());
return mEngineInterface; return mEngineInterface;
} }
public boolean onUnbind(Intent intent) public boolean onUnbind(Intent intent)
{ {
Log.i(TAG, "Service onUnbind called for intent " + intent.toString()); Log.i(TAG, "Service onUnbind called for intent " + intent.toString());
......
...@@ -42,6 +42,26 @@ public class ManagerActivity extends Activity ...@@ -42,6 +42,26 @@ public class ManagerActivity extends Activity
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if (!HardwareDetector.mIsReady) {
Log.e(TAG, "Cannot initialize native part of OpenCV Manager!");
AlertDialog dialog = new AlertDialog.Builder(this).create();
dialog.setTitle("OpenCV Manager Error");
dialog.setMessage("OpenCV Manager is incompatible with this device. Please replace it with an appropriate package.");
dialog.setCancelable(false);
dialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
dialog.show();
return;
}
setContentView(R.layout.main); setContentView(R.layout.main);
TextView OsVersionView = (TextView)findViewById(R.id.OsVersionValue); TextView OsVersionView = (TextView)findViewById(R.id.OsVersionValue);
...@@ -186,6 +206,20 @@ public class ManagerActivity extends Activity ...@@ -186,6 +206,20 @@ public class ManagerActivity extends Activity
} }
}); });
mPackageChangeReciever = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("OpenCVManager/Reciever", "Bradcast message " + intent.getAction() + " reciever");
Log.d("OpenCVManager/Reciever", "Filling package list on broadcast message");
if (!bindService(new Intent("org.opencv.engine.BIND"), new OpenCVEngineServiceConnection(), Context.BIND_AUTO_CREATE))
{
TextView EngineVersionView = (TextView)findViewById(R.id.EngineVersionValue);
EngineVersionView.setText("not avaliable");
}
}
};
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_ADDED); filter.addAction(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
...@@ -199,17 +233,23 @@ public class ManagerActivity extends Activity ...@@ -199,17 +233,23 @@ public class ManagerActivity extends Activity
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
if (mPackageChangeReciever != null)
unregisterReceiver(mPackageChangeReciever); unregisterReceiver(mPackageChangeReciever);
} }
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (HardwareDetector.mIsReady) {
Log.d(TAG, "Filling package list on resume"); Log.d(TAG, "Filling package list on resume");
if (!bindService(new Intent("org.opencv.engine.BIND"), new OpenCVEngineServiceConnection(), Context.BIND_AUTO_CREATE)) OpenCVEngineServiceConnection connection = new OpenCVEngineServiceConnection();
{ if (!bindService(new Intent("org.opencv.engine.BIND"), connection, Context.BIND_AUTO_CREATE)) {
Log.e(TAG, "Cannot bind to OpenCV Manager service!");
TextView EngineVersionView = (TextView)findViewById(R.id.EngineVersionValue); TextView EngineVersionView = (TextView)findViewById(R.id.EngineVersionValue);
if (EngineVersionView != null)
EngineVersionView.setText("not avaliable"); EngineVersionView.setText("not avaliable");
unbindService(connection);
}
} }
} }
...@@ -225,19 +265,7 @@ public class ManagerActivity extends Activity ...@@ -225,19 +265,7 @@ public class ManagerActivity extends Activity
protected int ManagerApiLevel = 0; protected int ManagerApiLevel = 0;
protected String ManagerVersion; protected String ManagerVersion;
protected BroadcastReceiver mPackageChangeReciever = new BroadcastReceiver() { protected BroadcastReceiver mPackageChangeReciever = null;
@Override
public void onReceive(Context context, Intent intent) {
Log.d("OpenCVManager/Reciever", "Bradcast message " + intent.getAction() + " reciever");
Log.d("OpenCVManager/Reciever", "Filling package list on broadcast message");
if (!bindService(new Intent("org.opencv.engine.BIND"), new OpenCVEngineServiceConnection(), Context.BIND_AUTO_CREATE))
{
TextView EngineVersionView = (TextView)findViewById(R.id.EngineVersionValue);
EngineVersionView.setText("not avaliable");
}
}
};
protected class OpenCVEngineServiceConnection implements ServiceConnection protected class OpenCVEngineServiceConnection implements ServiceConnection
{ {
...@@ -246,6 +274,12 @@ public class ManagerActivity extends Activity ...@@ -246,6 +274,12 @@ public class ManagerActivity extends Activity
public void onServiceConnected(ComponentName name, IBinder service) { public void onServiceConnected(ComponentName name, IBinder service) {
OpenCVEngineInterface EngineService = OpenCVEngineInterface.Stub.asInterface(service); OpenCVEngineInterface EngineService = OpenCVEngineInterface.Stub.asInterface(service);
if (EngineService == null) {
Log.e(TAG, "Cannot connect to OpenCV Manager Service!");
unbindService(this);
return;
}
try { try {
ManagerApiLevel = EngineService.getEngineVersion(); ManagerApiLevel = EngineService.getEngineVersion();
} catch (RemoteException e) { } catch (RemoteException e) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment