This source file includes following definitions.
- parseFile
- parseLibraryTag
- parseFileTag
- hasAllFiles
- isCompatible
- getFileList
- onCreate
- onBind
- onUnbind
- OnDestroy
package org.opencv.engine;
import android.app.Service;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.XmlResourceParser;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.text.TextUtils;
import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
public class OpenCVEngineService extends Service {
private static final String TAG = "OpenCVEngine/Service";
private IBinder mEngineInterface = null;
private List<LibVariant> variants = new ArrayList<LibVariant>();
private class LibVariant {
public String version;
public List<String> files;
public void parseFile(XmlResourceParser p) {
try {
int eventType = p.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if (p.getName().equals("library")) {
parseLibraryTag(p);
} else if (p.getName().equals("file")) {
parseFileTag(p);
}
}
eventType = p.next();
}
} catch (Exception e) {
Log.e(TAG, "Failed to parse xml library descriptor");
}
}
private void parseLibraryTag(XmlResourceParser p) {
version = p.getAttributeValue(null, "version");
files = new ArrayList<String>();
}
private void parseFileTag(XmlResourceParser p) {
files.add(p.getAttributeValue(null, "name"));
}
public boolean hasAllFiles(String path) {
boolean result = true;
List<String> actualFiles = Arrays.asList((new File(path)).list());
for (String f : files)
result &= actualFiles.contains(f);
return result;
}
public boolean isCompatible(String v) {
String[] expected = v.split("\\.");
String[] actual = version.split("\\.");
int i = 0;
for (; i < Math.min(expected.length, actual.length); ++i) {
int diff = Integer.valueOf(expected[i])
- Integer.valueOf(actual[i]);
if (diff > 0 || (diff != 0 && i == 0)) {
return false;
} else if (diff < 0) {
return true;
}
}
if (expected.length > i) {
return false;
}
return true;
}
public String getFileList() {
return TextUtils.join(";", files);
}
}
public void onCreate() {
Log.d(TAG, "Service starting");
for (Field field : R.xml.class.getDeclaredFields()) {
Log.d(TAG, "Found config: " + field.getName());
final LibVariant lib = new LibVariant();
try {
final int id = field.getInt(R.xml.class);
final XmlResourceParser p = getResources().getXml(id);
lib.parseFile(p);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (lib.version != null
&& lib.files.size() != 0
&& lib.hasAllFiles(getApplication().getApplicationInfo().nativeLibraryDir)) {
variants.add(lib);
Log.d(TAG, "Added config: " + lib.version);
}
}
super.onCreate();
mEngineInterface = new OpenCVEngineInterface.Stub() {
@Override
public boolean installVersion(String version)
throws RemoteException {
return false;
}
@Override
public String getLibraryList(String version) throws RemoteException {
for (LibVariant lib : variants)
if (lib.isCompatible(version))
return lib.getFileList();
return null;
}
@Override
public String getLibPathByVersion(String version)
throws RemoteException {
return getApplication().getApplicationInfo().nativeLibraryDir;
}
@Override
public int getEngineVersion() throws RemoteException {
int version = 3000;
try {
version = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return version / 1000;
}
};
}
public IBinder onBind(Intent intent) {
Log.i(TAG, "Service onBind called for intent " + intent.toString());
return mEngineInterface;
}
public boolean onUnbind(Intent intent) {
Log.i(TAG, "Service onUnbind called for intent " + intent.toString());
return true;
}
public void OnDestroy() {
Log.i(TAG, "OpenCV Engine service destruction");
}
}