diff --git a/platform/app/AndroidManifest.xml b/platform/app/AndroidManifest.xml
index 6ec2fd6..f33fbfc 100644
--- a/platform/app/AndroidManifest.xml
+++ b/platform/app/AndroidManifest.xml
@@ -17,6 +17,9 @@
+
+
+
diff --git a/platform/app/assets/GpiiDataResources.xml b/platform/app/assets/GpiiDataResources.xml
new file mode 100644
index 0000000..24def93
--- /dev/null
+++ b/platform/app/assets/GpiiDataResources.xml
@@ -0,0 +1,9 @@
+
+http://docs.google.com/uc?authuser=0&id=0B9NaK6yZUAngMzdsRDdQWi1rbDg&export=download
+https://github.com/javihernandez/android-user-listeners/releases/download/v0.1/AndroidUserListeners-debug.apk
+http://wiki.gpii.net/index.php/GPII_Android_Devices_Compatibility_Table
+http://wiki.gpii.net/w/List_of_root_devices
+gpii-android.tar.gz
+net.gpii.app-1.apk
+cloud4all.UserListener.NFC-1.apk
+
\ No newline at end of file
diff --git a/platform/app/assets/gpii-android b/platform/app/assets/gpii-android
new file mode 100644
index 0000000..e0ce2d3
Binary files /dev/null and b/platform/app/assets/gpii-android differ
diff --git a/platform/app/res/layout-land/main.xml b/platform/app/res/layout-land/main.xml
new file mode 100644
index 0000000..1c65d9d
--- /dev/null
+++ b/platform/app/res/layout-land/main.xml
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/platform/app/res/layout-land/progress_download_layout.xml b/platform/app/res/layout-land/progress_download_layout.xml
new file mode 100644
index 0000000..8bfd463
--- /dev/null
+++ b/platform/app/res/layout-land/progress_download_layout.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/platform/app/res/layout-xlarge-land/main.xml b/platform/app/res/layout-xlarge-land/main.xml
new file mode 100644
index 0000000..9e7645c
--- /dev/null
+++ b/platform/app/res/layout-xlarge-land/main.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/platform/app/res/layout-xlarge-land/progress_download_layout.xml b/platform/app/res/layout-xlarge-land/progress_download_layout.xml
new file mode 100644
index 0000000..8bfd463
--- /dev/null
+++ b/platform/app/res/layout-xlarge-land/progress_download_layout.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/platform/app/res/layout-xlarge/main.xml b/platform/app/res/layout-xlarge/main.xml
new file mode 100644
index 0000000..bbd6136
--- /dev/null
+++ b/platform/app/res/layout-xlarge/main.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/platform/app/res/layout-xlarge/progress_download_layout.xml b/platform/app/res/layout-xlarge/progress_download_layout.xml
new file mode 100644
index 0000000..8bfd463
--- /dev/null
+++ b/platform/app/res/layout-xlarge/progress_download_layout.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/platform/app/res/layout/main.xml b/platform/app/res/layout/main.xml
index 199f28b..93348c5 100644
--- a/platform/app/res/layout/main.xml
+++ b/platform/app/res/layout/main.xml
@@ -21,92 +21,127 @@
android:scaleX="0.65"
android:scaleY="0.65"
android:contentDescription="@string/gpii_logo_content" />
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+ android:layout_below="@+id/imageView1"
+ android:layout_centerHorizontal="true"
+ android:layout_marginLeft="92dp"
+ android:visibility="gone"
+ android:text="@string/button_intallation" />
-
+ android:layout_below="@+id/imageView1">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:text="@string/button_download" />
diff --git a/platform/app/res/layout/progress_download_layout.xml b/platform/app/res/layout/progress_download_layout.xml
new file mode 100644
index 0000000..8bfd463
--- /dev/null
+++ b/platform/app/res/layout/progress_download_layout.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/platform/app/res/values-de/strings.xml b/platform/app/res/values-de/strings.xml
index 5b0b283..ab459ae 100644
--- a/platform/app/res/values-de/strings.xml
+++ b/platform/app/res/values-de/strings.xml
@@ -33,5 +33,8 @@
/sdcard/gpii/android/gpii.js
Logo des GPII Projekts
Status prüfen
+ Bitte warten Sie, bis Cloud4All heruntergeladen wurde
+ Installieren Cloud4All Platform
+ Laden Sie Cloud4All Platform
diff --git a/platform/app/res/values-el/strings.xml b/platform/app/res/values-el/strings.xml
index 75e5908..3c6c80a 100644
--- a/platform/app/res/values-el/strings.xml
+++ b/platform/app/res/values-el/strings.xml
@@ -33,5 +33,8 @@
/sdcard/gpii/android/gpii.js
Λογότυπο GPII
Έλεγχος κατάστασης
+ Παρακαλώ, περιμένετε μέχρι Cloud4All έχει κατεβάσει
+ Εγκαταστήστε Cloud4All Πλατφόρμα
+ Κατεβάστε Cloud4All Πλατφόρμα
diff --git a/platform/app/res/values-es/strings.xml b/platform/app/res/values-es/strings.xml
index 14dea0f..56858d3 100644
--- a/platform/app/res/values-es/strings.xml
+++ b/platform/app/res/values-es/strings.xml
@@ -33,5 +33,8 @@
/sdcard/gpii/android/gpii.js
Logo delproyecto GPII
Comprobar el estado
+ Por favor, espere hasta que Cloud4All se haya descargado
+ Instalar Plataforma Cloud4All
+ Descargar Plataforma Cloud4All
diff --git a/platform/app/res/values/strings.xml b/platform/app/res/values/strings.xml
index 4bc7a3f..e89a281 100644
--- a/platform/app/res/values/strings.xml
+++ b/platform/app/res/values/strings.xml
@@ -33,5 +33,8 @@
/sdcard/gpii/android/gpii.js
Logo of the GPII project
Check status
+ Please, wait until Cloud4All has been downloaded
+ Install Cloud4All Platform
+ Download Cloud4All Platform
diff --git a/platform/app/src/net/gpii/app/GpiiActivity.java b/platform/app/src/net/gpii/app/GpiiActivity.java
index a6d1a15..aa796e9 100644
--- a/platform/app/src/net/gpii/app/GpiiActivity.java
+++ b/platform/app/src/net/gpii/app/GpiiActivity.java
@@ -1,47 +1,113 @@
/*
- * GPII Android Personalization Framework
- *
- * Licensed under the New BSD license. You may not use this file except in
- * compliance with this License.
- *
- * The research leading to these results has received funding from the European Union's
- * Seventh Framework Programme (FP7/2007-2013)
- * under grant agreement no. 289016.
- *
- * You may obtain a copy of the License at
- * https://github.com/GPII/universal/blob/master/LICENSE.txt
- */
-
+* GPII Android Personalization Framework
+*
+* Licensed under the New BSD license. You may not use this file except in
+* compliance with this License.
+*
+* The research leading to these results has received funding from the European Union's
+* Seventh Framework Programme (FP7/2007-2013)
+* under grant agreement no. 289016.
+*
+* You may obtain a copy of the License at
+* https://github.com/GPII/universal/blob/master/LICENSE.txt
+*/
package net.gpii.app;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
+import java.util.Arrays;
import java.util.List;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Process;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+
+import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DownloadManager;
+import android.app.DownloadManager.Query;
+import android.app.DownloadManager.Request;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.AssetManager;
+import android.database.Cursor;
import android.graphics.Color;
+import android.graphics.PixelFormat;
import android.graphics.Typeface;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Process;
import android.util.Log;
-import android.view.Menu;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
+import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
+import android.widget.RelativeLayout;
import android.widget.TextView;
+import android.widget.Toast;
+
+@SuppressLint("NewApi")
+public class GpiiActivity extends Activity {
+
+ private Context ctx;
+ private boolean isSystemApp;
+ private static String TAG = "Cloud4all";
+ private static String filepathgpii = Environment
+ .getExternalStorageDirectory() + "/";
+
+ private boolean higherVersionKitKat = false;
+
+ private static String uriTar;
+
+ private static String gpiiCompatibleAndroidDevicesUrl;
+
+ private static String gpiiRootDevicesUrl;
+
+ private static String gpiiJS;
+ private static String gpiiAPK;
+ private static String uriUserListeners;
+ private static String gpiiUserListenersAPK;
+
+ private static String privSystemDir = "/system/priv-app";
+ private static String systemDir = "/system/app";
+
+ private View progressView;
-public class GpiiActivity extends Activity
-{
+ private WindowManager.LayoutParams progressparams;
+
+ private WindowManager wm;
public static final int GPII_STATE_RUNNING = 0;
public static final int GPII_STATE_NOT_RUNNING = 1;
+ private static final String ACTION_GPII_UNZIP_COMPLETE = "net.gpii.app.ACTION_GPII_UNZIP_COMPLETE";
private TextView gpiiStatus;
private EditText gpiiScriptUri;
@@ -49,20 +115,239 @@ public class GpiiActivity extends Activity
private Button gpiiStopButton;
private Button gpiiKillButton;
private Button gpiiUpdateStatusButton;
+ private Button installationButton;
+ private Button downloadButton;
+ private RelativeLayout gpiiInfo;
+ private File file;
+ private File userListenersFile;
+
+ private long enqueue;
+ private DownloadManager dm;
+ private boolean tarIncluded = false;
+ private boolean userListenersInstalled = true;
+ private boolean installationUserListenersEnabled = false;
+
+ private AlertDialog.Builder alertDialogBuilder;
/** Called when the activity is first created. */
@Override
- public void onCreate(Bundle savedInstanceState)
- {
+ public void onCreate(Bundle savedInstanceState) {
+
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
- gpiiStatus = (TextView)findViewById(R.id.gpii_status);
- gpiiScriptUri = (EditText)findViewById(R.id.gpii_script_uri);
- gpiiStartButton = (Button)findViewById(R.id.gpii_start_button);
- gpiiStopButton = (Button)findViewById(R.id.gpii_stop_button);
- gpiiKillButton = (Button)findViewById(R.id.gpii_kill_button);
- gpiiUpdateStatusButton = (Button)findViewById(R.id.gpii_update_status_button);
+ try {
+ isSystemApp = isSystemPackage(this.getPackageManager()
+ .getApplicationInfo("net.gpii.app", 0));
+ } catch (NameNotFoundException e1) {
+ e1.printStackTrace();
+ }
+
+ ctx = this;
+ wm = (WindowManager) getSystemService(WINDOW_SERVICE);
+ getAndroidVersion();
+ executeShellCommand("su");
+ appInstalled("stericson.busybox");
+
+ progressparams = new WindowManager.LayoutParams(
+ WindowManager.LayoutParams.MATCH_PARENT,
+ WindowManager.LayoutParams.MATCH_PARENT,
+ WindowManager.LayoutParams.TYPE_SYSTEM_ALERT |
+ WindowManager.LayoutParams.TYPE_PHONE |
+ WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
+ WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
+ WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
+ PixelFormat.TRANSLUCENT);
+
+ LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
+ progressView = inflater
+ .inflate(R.layout.progress_download_layout, null);
+
+ installationButton = (Button)findViewById(R.id.installButton);
+ downloadButton = (Button) findViewById(R.id.downloadButton);
+
+ gpiiInfo = (RelativeLayout) findViewById(R.id.gpii_Info);
+
+ file = new File(Environment.getExternalStorageDirectory(), "gpii");
+
+ AssetManager assetManager = getResources().getAssets();
+
+ try {
+ XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
+ factory.setValidating(false);
+ XmlPullParser myxml = factory.newPullParser();
+
+ InputStream raw = assetManager.open("GpiiDataResources.xml");
+ myxml.setInput(raw, null);
+ int eventType = myxml.getEventType();
+
+ while(eventType != XmlPullParser.END_DOCUMENT) {
+ if(eventType == XmlPullParser.TEXT) {
+
+ switch(myxml.getLineNumber()){
+ case 2:
+ uriTar = myxml.getText();
+ break;
+ case 3:
+ uriUserListeners = myxml.getText();
+ break;
+ case 4:
+ gpiiCompatibleAndroidDevicesUrl = myxml.getText();
+ break;
+ case 5:
+ gpiiRootDevicesUrl = myxml.getText();
+ break;
+ case 6:
+ gpiiJS = myxml.getText();
+ break;
+ case 7:
+ gpiiAPK = myxml.getText();
+ break;
+ case 8:
+ gpiiUserListenersAPK = myxml.getText();
+ break;
+ default:
+ Log.i(TAG,"Not suported XML entry");
+ break;
+ }
+ }
+ eventType = myxml.next();
+ }
+ } catch (XmlPullParserException e) {
+ e.printStackTrace();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+
+ userListenersFile = new File(Environment.getExternalStorageDirectory(),gpiiUserListenersAPK);
+
+ try {
+ tarIncluded=true;
+ Arrays.asList(getResources().getAssets().list("")).contains("gpii-android");
+ } catch (IOException e1) {
+
+ tarIncluded=false;
+ e1.printStackTrace();
+ }
+
+ if(!gpiiApkInstalled("cloud4all.UserListener.NFC")&&!userListenersFile.exists()){
+ installGPIIUserListeners();
+ userListenersInstalled = false;
+ installationUserListenersEnabled=true;
+
+ } else {
+
+ if(userListenersFile.exists()){
+ userListenersInstalled=true;
+ userListenersNotInstalledDialog(gpiiUserListenersAPK);
+ }
+
+ if(tarIncluded&&!file.exists()){
+ wm.addView(progressView, progressparams);
+ downloadButton.setVisibility(View.GONE);
+ installationButton.setVisibility(View.VISIBLE);
+
+ new ExtractGpiiZipFileSystem().execute();
+ }
+
+ if (file.exists()) {
+ downloadButton.setVisibility(View.GONE);
+ installationButton.setVisibility(View.VISIBLE);
+ }
+
+ if (isSystemApp) {
+
+ downloadButton.setVisibility(View.GONE);
+ installationButton.setVisibility(View.GONE);
+ gpiiInfo.setVisibility(View.VISIBLE);
+ }
+
+ if (!gpiiApkInstalled("net.gpii.app")) {
+ Toast.makeText(getApplicationContext(), "GPII NOT INSTALLED",
+ Toast.LENGTH_LONG).show();
+ downloadButton.setVisibility(View.VISIBLE);
+ installationButton.setVisibility(View.GONE);
+ }
+
+ }
+
+ final BroadcastReceiver receiver = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
+ long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
+ Query query = new Query();
+ query.setFilterById(enqueue);
+ Cursor c = dm.query(query);
+ if (c.moveToFirst()) {
+ int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
+ if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
+
+ if(!userListenersInstalled){
+
+ userListenersInstalled=true;
+ userListenersNotInstalledDialog(gpiiUserListenersAPK);
+
+ } else {
+ new ExtractGpiiZipFileSystem().execute();
+ }
+
+ }
+ }
+
+ } else if (action.equals(ACTION_GPII_UNZIP_COMPLETE)) {
+
+ downloadButton.setVisibility(View.GONE);
+ installationButton.setVisibility(View.VISIBLE);
+ wm.removeView(progressView);
+
+ }
+ }
+ };
+
+ try {
+ unregisterReceiver(receiver);
+ } catch (IllegalArgumentException iae) {
+ iae.printStackTrace();
+ }
+
+ registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
+
+ registerReceiver(receiver, new IntentFilter(ACTION_GPII_UNZIP_COMPLETE));
+
+ installationButton.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ new InstallationProccessTask().execute();
+
+ }
+ });
+
+ downloadButton.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ wm.addView(progressView, progressparams);
+ dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
+ Request request = new Request(Uri.parse(uriTar));
+ request.setDestinationUri(Uri.fromFile(new File(filepathgpii + gpiiJS)));
+ enqueue = dm.enqueue(request);
+
+ }
+ });
+
+ gpiiStatus = (TextView) findViewById(R.id.gpii_status);
+ gpiiScriptUri = (EditText) findViewById(R.id.gpii_script_uri);
+ gpiiStartButton = (Button) findViewById(R.id.gpii_start_button);
+ gpiiStopButton = (Button) findViewById(R.id.gpii_stop_button);
+ gpiiKillButton = (Button) findViewById(R.id.gpii_kill_button);
+ gpiiUpdateStatusButton = (Button) findViewById(R.id.gpii_update_status_button);
gpiiStartButton.setOnClickListener(new OnClickListener() {
@Override
@@ -87,13 +372,16 @@ public void onClick(View v) {
@Override
public void onClick(View v) {
try {
- ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
- List services = manager.getRunningAppProcesses();
+ ActivityManager manager =
+ (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+ List services = manager
+ .getRunningAppProcesses();
RunningAppProcessInfo process = null;
for (int i = 0; i < services.size(); i++) {
process = services.get(i);
String name = process.processName;
+
if (name.equals("net.gpii.app")) {
break;
}
@@ -105,6 +393,7 @@ public void onClick(View v) {
e.printStackTrace();
}
}
+
});
gpiiUpdateStatusButton.setOnClickListener(new OnClickListener() {
@@ -116,22 +405,59 @@ public void onClick(View v) {
checkGPIIServer();
gpiiStatus.requestFocus();
+
+ }
+
+ @Override
+ public void onResume(){
+ super.onResume();
+ if(installationUserListenersEnabled){
+ if(tarIncluded){
+
+ wm.addView(progressView, progressparams);
+ downloadButton.setVisibility(View.GONE);
+ installationButton.setVisibility(View.VISIBLE);
+
+ new ExtractGpiiZipFileSystem().execute();
+ }
+
+ if (file.exists()) {
+ downloadButton.setVisibility(View.GONE);
+ installationButton.setVisibility(View.VISIBLE);
+ }
+
+ if (isSystemApp) {
+
+ downloadButton.setVisibility(View.GONE);
+ installationButton.setVisibility(View.GONE);
+ gpiiInfo.setVisibility(View.VISIBLE);
+
+ }
+
+ if (!gpiiApkInstalled("net.gpii.app")&&!tarIncluded) {
+ Toast.makeText(getApplicationContext(), "GPII NOT INSTALLED AND NOT INCLUDED",
+ Toast.LENGTH_LONG).show();
+ downloadButton.setVisibility(View.VISIBLE);
+ installationButton.setVisibility(View.GONE);
+ }
+ installationUserListenersEnabled=false;
+ }
}
- protected void checkGPIIServer (){
+ protected void checkGPIIServer() {
SocketClient sc = new SocketClient();
sc.execute(GpiiActivity.this);
}
- public void updateStatus (Object status) {
- if (status == (Object) GpiiActivity.GPII_STATE_RUNNING){
+ public void updateStatus(Object status) {
+ if (status == (Object) GpiiActivity.GPII_STATE_RUNNING) {
gpiiStatus.setText(R.string.gpii_status_running);
gpiiStatus.setBackgroundColor(Color.GREEN);
- gpiiStatus.setTypeface(null,Typeface.BOLD);
+ gpiiStatus.setTypeface(null, Typeface.BOLD);
} else {
gpiiStatus.setText(R.string.gpii_status_not_running);
gpiiStatus.setBackgroundColor(Color.RED);
- gpiiStatus.setTypeface(null,Typeface.BOLD);
+ gpiiStatus.setTypeface(null, Typeface.BOLD);
}
}
@@ -149,7 +475,8 @@ protected Object doInBackground(Object... arg0) {
InetAddress address = InetAddress.getByName(GPII_SERVER_HOST);
Socket socket = new Socket();
- socket.connect(new InetSocketAddress(address, GPII_SERVER_PORT), CONNECTION_TIMEOUT);
+ socket.connect(new InetSocketAddress(address, GPII_SERVER_PORT),
+ CONNECTION_TIMEOUT);
if (socket.isConnected()) {
result = GpiiActivity.GPII_STATE_RUNNING;
@@ -169,4 +496,331 @@ protected void onPostExecute(Object result) {
GpiiActivity.this.updateStatus(result);
}
}
+
+ // Check Android version
+ public void getAndroidVersion() {
+
+ int sdkVersion = Build.VERSION.SDK_INT;
+ String release = Build.VERSION.RELEASE;
+
+ if (sdkVersion < 14 || sdkVersion > 21) {
+
+ launchWebPage(gpiiCompatibleAndroidDevicesUrl);
+
+ }
+
+ if (sdkVersion > 18) {
+ higherVersionKitKat = true;
+ }
+
+ }
+
+ // Check rooted device
+ private void executeShellCommand(String command) {
+
+ java.lang.Process process;
+
+ try {
+ process = Runtime.getRuntime().exec(command);
+ Log.i(TAG, "Rooted device");
+ } catch (Exception e) {
+ Log.i(TAG, "Not rooted device");
+ launchWebPage(gpiiRootDevicesUrl);
+ }
+ }
+
+ // Check BusyBox installed
+ private void appInstalled(String app) {
+
+ PackageManager pm = getPackageManager();
+
+ try {
+
+ pm.getPackageInfo(app, PackageManager.GET_ACTIVITIES);
+
+ } catch (PackageManager.NameNotFoundException e) {
+
+ busyBoxNotInstalledDialog(app);
+
+ }
+ }
+
+ private boolean gpiiApkInstalled(String app) {
+
+ PackageManager pm = getPackageManager();
+ try {
+ pm.getPackageInfo(app, PackageManager.GET_ACTIVITIES);
+ return true;
+ } catch (PackageManager.NameNotFoundException e) {
+
+ Log.i(TAG, "Gpii APK not installed");
+ return false;
+
+ }
+ }
+
+ protected void gunzip(File tarFile, File dest) {
+
+ try {
+ dest.mkdir();
+ TarArchiveInputStream tarIn = null;
+
+ tarIn = new TarArchiveInputStream(new GzipCompressorInputStream(
+ new BufferedInputStream(new FileInputStream(tarFile))));
+
+ TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
+
+ while (tarEntry != null) {
+
+ File destPath = new File(dest, tarEntry.getName());
+ System.out.println("working: " + destPath.getCanonicalPath());
+ if (tarEntry.isDirectory()) {
+ destPath.mkdirs();
+ } else {
+ destPath.createNewFile();
+ byte[] btoRead = new byte[1024];
+
+ BufferedOutputStream bout =
+ new BufferedOutputStream(new FileOutputStream(destPath));
+ int len = 0;
+
+ while ((len = tarIn.read(btoRead)) != -1) {
+ bout.write(btoRead, 0, len);
+ }
+
+ bout.close();
+ btoRead = null;
+
+ }
+ tarEntry = tarIn.getNextTarEntry();
+ }
+
+ tarIn.close();
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+ public static void installGpiiApkIntoSystem(String apkname,
+ String privilegedDir) {
+
+ java.lang.Process process;
+
+ try {
+
+ if (new File("/data/app", apkname).exists()) {
+
+ process = Runtime.getRuntime().exec("su");
+ DataOutputStream out = new DataOutputStream(
+ process.getOutputStream());
+ out.writeBytes("mount -o rw,remount yaffs2 /system\n");
+ out.writeBytes("chmod 777 " + privilegedDir + "\n");
+ out.writeBytes("chmod 777 /data/app/" + apkname + "\n");
+ out.writeBytes("cat /data/app/" + apkname + " > "
+ + privilegedDir + "/" + apkname + "\n");
+ out.writeBytes("chmod 644 " + privilegedDir + "/" + apkname
+ + "\n");
+ out.writeBytes("mount -o remount,ro -t yaffs2 /system\n");
+ out.writeBytes("reboot\n");
+ out.flush();
+ process.waitFor();
+
+ } else {
+
+ Log.e(TAG, "THERE IS NOT APK");
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private Dialog busyBoxNotInstalledDialog(String app) {
+
+ final String appInstalled = app;
+
+ alertDialogBuilder = new AlertDialog.Builder(this);
+
+ // set title
+ alertDialogBuilder.setTitle("BusyBox Not Installed");
+
+ // set dialog message
+ alertDialogBuilder.setMessage("Click download to download BusyBox")
+ .setPositiveButton("Download",
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ startActivity(new Intent(Intent.ACTION_VIEW,
+ Uri.parse("market://details?id="
+ + appInstalled)));
+ }
+ }
+ )
+ .setNegativeButton("Exit",
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+
+ dialog.cancel();
+ GpiiActivity.this.finish();
+
+ }
+ }
+ );
+
+ alertDialogBuilder.create();
+
+ return alertDialogBuilder.show();
+
+ }
+
+ private Dialog userListenersNotInstalledDialog(String app) {
+
+ final String appInstalled = app;
+
+ alertDialogBuilder = new AlertDialog.Builder(this);
+
+ alertDialogBuilder.setTitle("GPII User Listeners Not Installed");
+
+ alertDialogBuilder.setMessage("Do you want to install GPII User Listeners?")
+ .setPositiveButton("Install",
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+
+ Intent installUserListenersIntent = new Intent(Intent.ACTION_VIEW);
+ installUserListenersIntent.setDataAndType(Uri.fromFile(new File(filepathgpii+appInstalled)), "application/vnd.android.package-archive");
+ installUserListenersIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(installUserListenersIntent);
+
+ }
+ })
+ .setNegativeButton("Cancel",
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+
+ dialog.cancel();
+ installationUserListenersEnabled=true;
+
+ }
+ });
+
+ alertDialogBuilder.create();
+
+ return alertDialogBuilder.show();
+
+ }
+
+ private class ExtractGpiiZipFileSystem extends AsyncTask {
+
+ @Override
+ protected void onPostExecute(Void result) {
+
+ super.onPostExecute(result);
+
+ Intent nfcDiscoveredIntent = new Intent(ACTION_GPII_UNZIP_COMPLETE);
+ sendBroadcast(nfcDiscoveredIntent);
+
+ }
+
+ @Override
+ protected Void doInBackground(Void... params) {
+
+ File fileTar = new File(filepathgpii + gpiiJS);;
+ if(tarIncluded){
+
+ try {
+ InputStream inputStream = ctx.getResources().getAssets().open("gpii-android");
+ fileTar = createFileFromInputStream(inputStream,fileTar);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else {
+ fileTar = new File(filepathgpii + gpiiJS);
+ }
+ File fileDest = new File(filepathgpii);
+
+ if(fileTar!=null){
+ gunzip(fileTar, fileDest);
+ }
+ return null;
+ }
+
+ }
+
+
+ private class InstallationProccessTask extends AsyncTask {
+
+ @Override
+ protected void onPostExecute(Void result) {
+
+ super.onPostExecute(result);
+
+ }
+
+ @Override
+ protected Void doInBackground(Void... params) {
+
+ if (higherVersionKitKat) {
+
+ installGpiiApkIntoSystem(gpiiAPK, privSystemDir);
+
+ } else {
+
+ installGpiiApkIntoSystem(gpiiAPK, systemDir);
+ }
+
+ return null;
+ }
+
+ }
+
+ private File createFileFromInputStream(InputStream inputStream, File f) {
+
+ try{
+ OutputStream outputStream = new FileOutputStream(f);
+ byte buffer[] = new byte[1024];
+ int length = 0;
+
+ while((length=inputStream.read(buffer)) > 0) {
+ outputStream.write(buffer,0,length);
+ }
+
+ outputStream.close();
+ inputStream.close();
+
+ return f;
+
+ }catch (IOException e) {
+
+ e.printStackTrace();
+
+ }
+
+ return null;
+ }
+
+ private boolean isSystemPackage(ApplicationInfo applicationInfo) {
+
+ return ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
+ }
+
+ private void launchWebPage(String url){
+ Intent browserIntent = new Intent(Intent.ACTION_VIEW,
+ Uri.parse(url));
+ startActivity(browserIntent);
+ }
+
+ private void installGPIIUserListeners(){
+
+ dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
+ Request request = new Request(Uri.parse(uriUserListeners));
+ request.setDestinationUri(Uri.fromFile(new File(filepathgpii
+ + gpiiUserListenersAPK)));
+ enqueue = dm.enqueue(request);
+ }
+
}
diff --git a/platform/prebuild.sh b/platform/prebuild.sh
index aab1f1b..15886b3 100755
--- a/platform/prebuild.sh
+++ b/platform/prebuild.sh
@@ -25,6 +25,7 @@ else
fi
curl -o app/libs/jtar-1.0.4.jar https://jtar.googlecode.com/files/jtar-1.0.4.jar
+curl -o app/libs/commons-compress-1.5.jar http://central.maven.org/maven2/org/apache/commons/commons-compress/1.5/commons-compress-1.5.jar
# Create Assets directory if it doesn't exist yet
if [ -d 'app/assets' ]; then