From 1f81238fef9822266241902247efb9819f583cd5 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Sat, 26 Sep 2015 15:43:44 +0000 Subject: [PATCH] removed manual opening of geo/pro files; added ability to import full model (zip) archives --- contrib/mobile/Android/AndroidManifest.xml | 43 ++++++------ contrib/mobile/Android/res/layout/model.xml | 4 +- contrib/mobile/Android/res/values/strings.xml | 6 -- .../src/org/geuz/onelab/MainActivity.java | 10 ++- .../src/org/geuz/onelab/ModelList.java | 19 +----- .../src/org/geuz/onelab/SplashScreen.java | 68 +++++++++---------- 6 files changed, 62 insertions(+), 88 deletions(-) diff --git a/contrib/mobile/Android/AndroidManifest.xml b/contrib/mobile/Android/AndroidManifest.xml index 932751369d..d3be7c65c1 100644 --- a/contrib/mobile/Android/AndroidManifest.xml +++ b/contrib/mobile/Android/AndroidManifest.xml @@ -9,7 +9,7 @@ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-feature android:glEsVersion="0x00010000" android:required="true" /> - + <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" @@ -22,34 +22,33 @@ <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> - </activity> - <activity android:name=".ModelList" - android:label="@string/title_activity_main" /> - <activity android:name=".AboutActivity" - android:label="@string/title_activity_about" /> - <activity android:name=".MainActivity" - android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> - <data android:scheme="file" - android:host="*" - android:pathPattern=".*\\.msh" - android:mimeType="*/*" /> - <data android:scheme="file" - android:host="*" - android:pathPattern=".*\\.geo" - android:mimeType="*/*" /> - <data android:scheme="file" - android:host="*" - android:pathPattern=".*\\.pro" - android:mimeType="*/*" /> + <category android:name="android.intent.category.BROWSABLE" /> + <data android:scheme="file" /> + <data android:mimeType="application/zip" /> + <data android:pathPattern=".*\\.zip" /> + </intent-filter> + <intent-filter> + <action android:name="android.intent.action.VIEW" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + <data android:scheme="content" /> + <data android:mimeType="application/zip" /> </intent-filter> </activity> + <activity android:name=".MainActivity" + android:label="@string/title_activity_main"/> + <activity android:name=".ModelList" + android:label="@string/title_activity_main"/> + <activity android:name=".AboutActivity" + android:label="@string/title_activity_about"/> <activity android:name=".PostProcessingActivity" - android:label="@string/title_activity_main" /> + android:label="@string/title_activity_main"/> <activity android:name=".OptionsActivity" - android:label="@string/title_activity_options" /> + android:label="@string/title_activity_options"> + </activity> </application> </manifest> diff --git a/contrib/mobile/Android/res/layout/model.xml b/contrib/mobile/Android/res/layout/model.xml index 758dae0559..7d439d305b 100644 --- a/contrib/mobile/Android/res/layout/model.xml +++ b/contrib/mobile/Android/res/layout/model.xml @@ -6,8 +6,8 @@ <ImageView android:id="@+id/icon" - android:layout_height="100dp" - android:layout_width="100dp" + android:layout_height="64dp" + android:layout_width="64dp" android:layout_gravity="center" android:contentDescription="preview" android:src="@drawable/ic_launcher" diff --git a/contrib/mobile/Android/res/values/strings.xml b/contrib/mobile/Android/res/values/strings.xml index 30b32ac375..8aca51fdea 100644 --- a/contrib/mobile/Android/res/values/strings.xml +++ b/contrib/mobile/Android/res/values/strings.xml @@ -1,14 +1,8 @@ <resources> <string name="app_name">Onelab</string> - <string name="button_open_file">Open file</string> - <string name="button_ok">OK</string> - <string name="button_recalculate_param">Recompute with new parameters</string> - <string name="dialog_title_choosefile">Choose a file</string> - <string name="error_nosdcard">No SDcard found on your device</string> <string name="title_activity_main">Onelab</string> <string name="title_activity_about">About</string> <string name="title_activity_options">Parameters</string> - <string name="error_nomshfile">No compatible files or directories in this folder</string> <string name="title_share">Share screenshot with …</string> <string name="menu_share">Share screenshot</string> <string name="menu_parameters">Parameters</string> diff --git a/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java b/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java index 5f758e434e..e1c5146224 100644 --- a/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java +++ b/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java @@ -57,13 +57,11 @@ public class MainActivity extends Activity{ actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#64000000"))); Intent intent = getIntent(); Bundle extras = intent.getExtras(); - if(savedInstanceState != null); - else if(intent.getAction() != null && - intent.getAction().equals(Intent.ACTION_VIEW)) { - String tmp = intent.getData().getPath(); - _gmsh.load(tmp); - } + if(savedInstanceState != null){ + // nothing + } else if(extras != null) { + // request to load a file (from ModelList) String name = extras.getString("name"); this.getActionBar().setTitle(name); String tmp = extras.getString("file"); diff --git a/contrib/mobile/Android/src/org/geuz/onelab/ModelList.java b/contrib/mobile/Android/src/org/geuz/onelab/ModelList.java index c337870614..d942edeb68 100644 --- a/contrib/mobile/Android/src/org/geuz/onelab/ModelList.java +++ b/contrib/mobile/Android/src/org/geuz/onelab/ModelList.java @@ -26,6 +26,7 @@ import android.widget.AdapterView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Toast; +import android.util.Log; public class ModelList extends Activity { @@ -35,6 +36,7 @@ public class ModelList extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + _modelArrayAdapter = new ModelArrayAdapter(this); try { this.getModels(); @@ -108,28 +110,13 @@ public class ModelList extends Activity { MenuItem about = menu.add("About"); about.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - // FIXME: should we keep this, only accept .zip files, and call it "import model" ? - //MenuItem loadFile = menu.add(R.string.button_open_file); - //loadFile.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); return super.onCreateOptionsMenu(menu); } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { - if(item.getTitle().equals(getString(R.string.button_open_file))) { - Intent fileBrowserIntent = new Intent(); - fileBrowserIntent.setAction(Intent.ACTION_GET_CONTENT); - fileBrowserIntent.setType("file/*"); - try { - startActivityForResult(fileBrowserIntent, 1); - } - catch(ActivityNotFoundException e) { - Toast.makeText(this, "No application found on your device to open the files.", - Toast.LENGTH_LONG).show(); - } - } - else if(item.getTitle().equals("About")) { + if(item.getTitle().equals("About")) { Intent intent = new Intent(ModelList.this, AboutActivity.class); startActivity(intent); } diff --git a/contrib/mobile/Android/src/org/geuz/onelab/SplashScreen.java b/contrib/mobile/Android/src/org/geuz/onelab/SplashScreen.java index 13febbf5dd..91ce5a572d 100644 --- a/contrib/mobile/Android/src/org/geuz/onelab/SplashScreen.java +++ b/contrib/mobile/Android/src/org/geuz/onelab/SplashScreen.java @@ -1,5 +1,6 @@ package org.geuz.onelab; +import java.io.InputStream; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; @@ -11,31 +12,18 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.content.ContentResolver; import android.os.Handler; import android.os.Message; import android.util.Log; public class SplashScreen extends Activity{ - private static final int SPLASHTIME = 1000; // duration for the splash screen in milliseconds - - private static final int STOPSPLASH = 0; - private static final int EXITAPP = 1; - - private Intent newIntent; private final Handler handler = new Handler() { public void handleMessage(Message msg) { - switch (msg.what) { - case STOPSPLASH: - startActivity(newIntent); - finish(); - break; - case EXITAPP: - finish(); - break; - default: - break; - } + Intent i = new Intent(SplashScreen.this, ModelList.class); + startActivity(i); + finish(); }; }; @@ -43,15 +31,8 @@ public class SplashScreen extends Activity{ { super.onCreate(savedInstanceState); setContentView(R.layout.splash); - Intent oldIntent = this.getIntent(); - if(oldIntent != null && oldIntent.getAction() != null && - oldIntent.getAction().equals(Intent.ACTION_VIEW)){ - newIntent = new Intent(SplashScreen.this, MainActivity.class); - newIntent.setAction(oldIntent.getAction()); - newIntent.setData(oldIntent.getData()); - } - else - newIntent = new Intent(SplashScreen.this, ModelList.class); + + // import built-in models SharedPreferences sharedPref = getSharedPreferences(getPackageName(), Context.MODE_PRIVATE); int codev = 0; try { @@ -65,22 +46,37 @@ public class SplashScreen extends Activity{ SharedPreferences.Editor editor = sharedPref.edit(); editor.putInt("OnelabModelsVersion", codev); editor.commit(); - loadNative(); + // import built-in models from from res/raw/ + ImportZipArchive(new BufferedInputStream(getResources().openRawResource(R.raw.models))); } - else Log.d("Models", "Leaving models as-is (version "+modelsv+")"); + else{ + Log.d("Models", "Leaving models as-is (version "+modelsv+")"); + } + + // import user model + Intent intent = getIntent(); + String action = intent.getAction(); + if(action != null && action.equals(Intent.ACTION_VIEW)) { + Log.d("Models", "Importing user model " + intent.getData()); + try { + ImportZipArchive(getContentResolver().openInputStream(intent.getData())); + } + catch(IOException e1) { + e1.printStackTrace(); + } + } + final Message msg = new Message(); - msg.what = STOPSPLASH; - handler.sendMessageDelayed(msg, SPLASHTIME); + handler.sendMessageDelayed(msg, 500); // 500 milliseconds } /** - * Load file from res/raw/ directory to the files directory of the application. + * Uncompress zip archive into the files directory of the application. */ - private void loadNative() + private void ImportZipArchive(InputStream stream) { try { - ZipInputStream zipStream = new ZipInputStream - (new BufferedInputStream(getResources().openRawResource(R.raw.models))); + ZipInputStream zipStream = new ZipInputStream(stream); ZipEntry entry; while ((entry = zipStream.getNextEntry()) != null) { String name = entry.getName(); @@ -90,7 +86,7 @@ public class SplashScreen extends Activity{ } else if(name.lastIndexOf("/") > 0) { File document = this.getFilesDir(); - File currentDirectory = new File(document,name.substring(0, name.lastIndexOf("/"))); + File currentDirectory = new File(document, name.substring(0, name.lastIndexOf("/"))); currentDirectory.mkdir(); File currentFile = new File(currentDirectory, name.substring(name.lastIndexOf("/")+1)); outputStream = new FileOutputStream(currentFile); @@ -101,7 +97,7 @@ public class SplashScreen extends Activity{ byte[] buffer = new byte[2048]; for (int i = zipStream.read(buffer, 0, buffer.length); i > 0; i = zipStream.read(buffer, 0, buffer.length)) - outputStream.write(buffer,0,i); + outputStream.write(buffer, 0, i); } zipStream.close(); } -- GitLab