From 69d6dde5442ab93e3c2476361436ccbdda92fb04 Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Fri, 16 May 2014 12:12:21 +0200 Subject: [PATCH 1/4] added user plugin update mechanism --- mobile/README.md | 4 +- .../cradle/iitc_mobile/IITC_FileManager.java | 2 + .../iitc_mobile/async/UpdateScript.java | 90 +++++++++++++++++++ 3 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 mobile/src/com/cradle/iitc_mobile/async/UpdateScript.java diff --git a/mobile/README.md b/mobile/README.md index 136db28e..c2039b19 100644 --- a/mobile/README.md +++ b/mobile/README.md @@ -7,7 +7,7 @@ The Android App behaves like the desktop version, but uses the mobile view, whic - supports all official IITC plugins -- easy installation of unofficial plugins (installation via plugin preference, click on *.user.js file or URL, email attachement etc.) +- easy installation and update of unofficial plugins (installation via plugin preference, click on *.user.js file or URL, email attachement etc.) - show users current location @@ -19,7 +19,7 @@ The Android App behaves like the desktop version, but uses the mobile view, whic - configurable fullscreen modes (includes immersive mode on Android 4.4+) -- navigation drawers for IITC views, layer chooser and highlighters +- navigation drawers for IITC panes, layer chooser and highlighters - in-app screenshots diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java b/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java index 639f7021..64ade391 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java @@ -19,6 +19,7 @@ import android.webkit.WebResourceResponse; import android.widget.Toast; import com.cradle.iitc_mobile.IITC_Mobile.ResponseHandler; +import com.cradle.iitc_mobile.async.UpdateScript; import org.json.JSONObject; @@ -199,6 +200,7 @@ public class IITC_FileManager { final InputStream data = prepareUserScript(stream); + new UpdateScript(mActivity).execute(uri.getPath()); return new WebResourceResponse("application/x-javascript", "UTF-8", data); } diff --git a/mobile/src/com/cradle/iitc_mobile/async/UpdateScript.java b/mobile/src/com/cradle/iitc_mobile/async/UpdateScript.java new file mode 100644 index 00000000..d684a489 --- /dev/null +++ b/mobile/src/com/cradle/iitc_mobile/async/UpdateScript.java @@ -0,0 +1,90 @@ +package com.cradle.iitc_mobile.async; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.os.AsyncTask; +import android.preference.PreferenceManager; + +import com.cradle.iitc_mobile.IITC_FileManager; +import com.cradle.iitc_mobile.Log; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +public class UpdateScript extends AsyncTask { + + private final Activity mActivity; + // update interval is 2 days + private final long updateInterval = 1000*60*60*24*2; + private String mFilePath; + private String mScript; + + public UpdateScript(final Activity activity) { + mActivity = activity; + } + + @Override + protected Boolean doInBackground(final String... urls) { + try { + mFilePath = urls[0]; + // check last script update + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mActivity); + final long lastUpdated = prefs.getLong(mFilePath + "-update", 0); + final long now = System.currentTimeMillis(); + + // return if no update wanted + if (now - lastUpdated < updateInterval) return false; + prefs + .edit() + .putLong(mFilePath + "-update", now) + .commit(); + + // get local script meta information + mScript = IITC_FileManager.readStream(new FileInputStream(new File(mFilePath))); + final String updateURL = IITC_FileManager.getScriptInfo(mScript).get("updateURL"); + final String downloadURL = IITC_FileManager.getScriptInfo(mScript).get("downloadURL"); + + // get remote script meta information + final File file_old = new File(mFilePath); + final InputStream is = new URL(updateURL).openStream(); + final String old_version = IITC_FileManager.getScriptInfo(mScript).get("version"); + final String new_version = IITC_FileManager.getScriptInfo(IITC_FileManager.readStream(is)).get("version"); + + // update script if neccessary + if (old_version.compareTo(new_version) < 0) { + Log.d("plugin " + mFilePath + " outdated\n" + old_version + " vs " + new_version); + Log.d("updating file...."); + IITC_FileManager.copyStream(new URL(downloadURL).openStream(), new FileOutputStream(file_old), true); + Log.d("...done"); + return true; + } + } catch (final IOException e) { + return false; + } + return false; + } + + protected void onPostExecute(Boolean updated) { + if (updated) { + final String name = IITC_FileManager.getScriptInfo(mScript).get("name"); + new AlertDialog.Builder(mActivity) + .setTitle("Plugin updated") + .setMessage(name) + .setCancelable(true) + .setNeutralButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }) + .create() + .show(); + } + } +} From 4bec474b21a2919b9e4e0f6938b76867c2feb3b9 Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Fri, 16 May 2014 14:14:09 +0200 Subject: [PATCH 2/4] added preferences for user plugin updates --- mobile/res/values/strings.xml | 3 ++ mobile/res/xml/preferences.xml | 8 +++ .../cradle/iitc_mobile/IITC_FileManager.java | 30 ++++++++++- .../IITC_ForceUpdatePreference.java | 54 +++++++++++++++++++ .../com/cradle/iitc_mobile/IITC_Mobile.java | 5 ++ .../iitc_mobile/async/UpdateScript.java | 24 ++++----- 6 files changed, 108 insertions(+), 16 deletions(-) create mode 100644 mobile/src/com/cradle/iitc_mobile/IITC_ForceUpdatePreference.java diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index 5eb600b9..4a1500a7 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -130,6 +130,9 @@ Note: If just want to use the desktop mode use the \'force desktop mode\' setting Configure IITCm menu Toggle visibility of IITCm menu entries + Manage plugin updates + Force plugin update + Update all enabled user plugins System Bar diff --git a/mobile/res/xml/preferences.xml b/mobile/res/xml/preferences.xml index dbea9820..9758ec01 100644 --- a/mobile/res/xml/preferences.xml +++ b/mobile/res/xml/preferences.xml @@ -92,6 +92,14 @@ android:key="pref_disable_splash" android:title="@string/pref_disable_splash"/> + + + diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java b/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java index 64ade391..de7cae41 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java @@ -40,6 +40,8 @@ import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; public class IITC_FileManager { private static final WebResourceResponse EMPTY = @@ -50,6 +52,8 @@ public class IITC_FileManager { + "(document.body || document.head || document.documentElement).appendChild(script);"; public static final String DOMAIN = ".iitcm.localhost"; + // update interval is 2 days by default + public static long updateInterval = 1000*60*60*24*2; /** * copies the contents of a stream into another stream and (optionally) closes the output stream afterwards @@ -200,7 +204,6 @@ public class IITC_FileManager { final InputStream data = prepareUserScript(stream); - new UpdateScript(mActivity).execute(uri.getPath()); return new WebResourceResponse("application/x-javascript", "UTF-8", data); } @@ -315,6 +318,31 @@ public class IITC_FileManager { } } + public void updatePlugins(boolean force) { + // check last script update + final long lastUpdated = mPrefs.getLong("pref_last_plugin_update", 0); + final long now = System.currentTimeMillis(); + + // return if no update wanted + if (!force && (now - lastUpdated < updateInterval)) return; + // get the plugin preferences + final TreeMap all_prefs = new TreeMap(mPrefs.getAll()); + + // iterate through all plugins + for (final Map.Entry entry : all_prefs.entrySet()) { + final String plugin = entry.getKey(); + if (plugin.endsWith(".user.js") && entry.getValue().toString().equals("true")) { + if (plugin.startsWith(PLUGINS_PATH)) { + new UpdateScript(mActivity).execute(plugin); + } + } + } + mPrefs + .edit() + .putLong("pref_last_plugin_update", now) + .commit(); + } + private class FileRequest extends WebResourceResponse implements ResponseHandler, Runnable { private Intent mData; private final String mFunctionName; diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_ForceUpdatePreference.java b/mobile/src/com/cradle/iitc_mobile/IITC_ForceUpdatePreference.java new file mode 100644 index 00000000..1a6c4fbe --- /dev/null +++ b/mobile/src/com/cradle/iitc_mobile/IITC_ForceUpdatePreference.java @@ -0,0 +1,54 @@ +package com.cradle.iitc_mobile; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.preference.Preference; +import android.preference.PreferenceManager; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +import com.cradle.iitc_mobile.IITC_FileManager; +import com.cradle.iitc_mobile.IITC_Mobile; + +/** + * The OptionDialogPreference will display a dialog, and will persist the + * true when pressing the positive button and false + * otherwise. It will persist to the android:key specified in xml-preference. + */ +public class IITC_ForceUpdatePreference extends Preference { + + public IITC_ForceUpdatePreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onClick() { + super.onClick(); + new AlertDialog.Builder(getContext()) + .setTitle(R.string.pref_force_plugin_update) + .setMessage(R.string.pref_force_plugin_update_sum) + .setCancelable(true) + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + PreferenceManager.getDefaultSharedPreferences(getContext()) + .edit() + .putLong("pref_last_plugin_update", 0) + .commit(); + dialog.cancel(); + } + }) + .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }) + .create() + .show(); + } +} \ No newline at end of file diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 1ee36f8b..853995d3 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -191,6 +191,10 @@ public class IITC_Mobile extends Activity return; } else if (key.equals("pref_fake_user_agent")) { mIitcWebView.setUserAgent(); + } else if (key.equals("pref_last_plugin_update")) { + Long forceUpdate = sharedPreferences.getLong("pref_last_plugin_update", 0); + if (forceUpdate == 0) mFileManager.updatePlugins(true); + return; } else if (key.equals("pref_press_twice_to_exit") || key.equals("pref_share_selected_tab") || key.equals("pref_messages") @@ -704,6 +708,7 @@ public class IITC_Mobile extends Activity mNavigationHelper.onLoadingStateChanged(); invalidateOptionsMenu(); updateViews(); + if (!isLoading) mFileManager.updatePlugins(false); if (mSearchTerm != null && !isLoading) { new Handler().postDelayed(new Runnable() { diff --git a/mobile/src/com/cradle/iitc_mobile/async/UpdateScript.java b/mobile/src/com/cradle/iitc_mobile/async/UpdateScript.java index d684a489..aca03e42 100644 --- a/mobile/src/com/cradle/iitc_mobile/async/UpdateScript.java +++ b/mobile/src/com/cradle/iitc_mobile/async/UpdateScript.java @@ -8,6 +8,7 @@ import android.os.AsyncTask; import android.preference.PreferenceManager; import com.cradle.iitc_mobile.IITC_FileManager; +import com.cradle.iitc_mobile.IITC_Mobile; import com.cradle.iitc_mobile.Log; import java.io.File; @@ -20,8 +21,6 @@ import java.net.URL; public class UpdateScript extends AsyncTask { private final Activity mActivity; - // update interval is 2 days - private final long updateInterval = 1000*60*60*24*2; private String mFilePath; private String mScript; @@ -33,18 +32,6 @@ public class UpdateScript extends AsyncTask { protected Boolean doInBackground(final String... urls) { try { mFilePath = urls[0]; - // check last script update - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mActivity); - final long lastUpdated = prefs.getLong(mFilePath + "-update", 0); - final long now = System.currentTimeMillis(); - - // return if no update wanted - if (now - lastUpdated < updateInterval) return false; - prefs - .edit() - .putLong(mFilePath + "-update", now) - .commit(); - // get local script meta information mScript = IITC_FileManager.readStream(new FileInputStream(new File(mFilePath))); final String updateURL = IITC_FileManager.getScriptInfo(mScript).get("updateURL"); @@ -77,12 +64,19 @@ public class UpdateScript extends AsyncTask { .setTitle("Plugin updated") .setMessage(name) .setCancelable(true) - .setNeutralButton("OK", new DialogInterface.OnClickListener() { + .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }) + .setNegativeButton("Reload", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + ((IITC_Mobile) mActivity).reloadIITC(); + } + }) .create() .show(); } From 7c68567d179dab5a6deefeab662facb8ce8a893a Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Fri, 16 May 2014 17:43:40 +0200 Subject: [PATCH 3/4] made plugin update interval configurable --- mobile/res/values/strings.xml | 20 ++++++++++++++++++- mobile/res/xml/preferences.xml | 7 +++++++ .../cradle/iitc_mobile/IITC_FileManager.java | 11 ++++++++-- .../com/cradle/iitc_mobile/IITC_Mobile.java | 5 +++++ 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index 4a1500a7..0f84061c 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -130,7 +130,9 @@ Note: If just want to use the desktop mode use the \'force desktop mode\' setting Configure IITCm menu Toggle visibility of IITCm menu entries - Manage plugin updates + User plugin updates + Configure plugin update interval + How often IITCm should search for new plugin versions Force plugin update Update all enabled user plugins @@ -181,6 +183,22 @@ 2 + + Disable + 1 day + 2 days + 1 week + 2 weeks + + + + 0 + 1 + 2 + 7 + 14 + + Reload IITC Toggle fullscreen Layer Chooser diff --git a/mobile/res/xml/preferences.xml b/mobile/res/xml/preferences.xml index 9758ec01..b6eaa36c 100644 --- a/mobile/res/xml/preferences.xml +++ b/mobile/res/xml/preferences.xml @@ -95,6 +95,13 @@ + all_prefs = new TreeMap(mPrefs.getAll()); @@ -343,6 +346,10 @@ public class IITC_FileManager { .commit(); } + public void setUpdateInterval(int interval) { + mUpdateInterval = 1000*60*60*24 * interval; + } + private class FileRequest extends WebResourceResponse implements ResponseHandler, Runnable { private Intent mData; private final String mFunctionName; diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 853995d3..cb312220 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -145,6 +145,7 @@ public class IITC_Mobile extends Activity mIitcWebView.updateFullscreenStatus(); mFileManager = new IITC_FileManager(this); + mFileManager.setUpdateInterval(Integer.parseInt(mSharedPrefs.getString("pref_update_plugins_interval", "7"))); mUserLocation = new IITC_UserLocation(this); mUserLocation.setLocationMode(Integer.parseInt(mSharedPrefs.getString("pref_user_location_mode", "0"))); @@ -195,6 +196,10 @@ public class IITC_Mobile extends Activity Long forceUpdate = sharedPreferences.getLong("pref_last_plugin_update", 0); if (forceUpdate == 0) mFileManager.updatePlugins(true); return; + } else if (key.equals("pref_update_plugins_interval")) { + final int interval = Integer.parseInt(mSharedPrefs.getString("pref_update_plugins_interval", "7")); + mFileManager.setUpdateInterval(interval); + return; } else if (key.equals("pref_press_twice_to_exit") || key.equals("pref_share_selected_tab") || key.equals("pref_messages") From 5b41dddb1515d5e5edaf4e82d9674ce7de74c026 Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Fri, 16 May 2014 17:58:46 +0200 Subject: [PATCH 4/4] move all preference related stuff in prefs subfolder --- mobile/AndroidManifest.xml | 4 +-- mobile/res/xml/preferences.xml | 6 ++-- .../cradle/iitc_mobile/IITC_FileManager.java | 3 +- .../com/cradle/iitc_mobile/IITC_Mobile.java | 6 ++-- .../iitc_mobile/fragments/MainSettings.java | 4 +-- .../fragments/PluginsFragment.java | 10 +++--- .../AboutDialogPreference.java} | 8 +++-- .../ForceUpdatePreference.java} | 13 +++---- .../PluginPreference.java} | 6 ++-- .../PluginPreferenceActivity.java} | 34 +++++++++++-------- .../PreferenceActivity.java} | 4 +-- 11 files changed, 51 insertions(+), 47 deletions(-) rename mobile/src/com/cradle/iitc_mobile/{IITC_AboutDialogPreference.java => prefs/AboutDialogPreference.java} (86%) rename mobile/src/com/cradle/iitc_mobile/{IITC_ForceUpdatePreference.java => prefs/ForceUpdatePreference.java} (80%) rename mobile/src/com/cradle/iitc_mobile/{IITC_PluginPreference.java => prefs/PluginPreference.java} (84%) rename mobile/src/com/cradle/iitc_mobile/{IITC_PluginPreferenceActivity.java => prefs/PluginPreferenceActivity.java} (91%) rename mobile/src/com/cradle/iitc_mobile/{IITC_PreferenceActivity.java => prefs/PreferenceActivity.java} (92%) diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml index 041ddde8..2606e95f 100644 --- a/mobile/AndroidManifest.xml +++ b/mobile/AndroidManifest.xml @@ -115,11 +115,11 @@ @@ -102,7 +102,7 @@ android:key="pref_update_plugins_interval" android:title="@string/pref_update_plugins_interval" android:summary="@string/pref_update_plugins_interval_sum"/> - @@ -121,7 +121,7 @@ android:key="pref_about_screen" android:persistent="false" android:title="@string/pref_about_title"> - diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java b/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java index b5af729c..ac875156 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_FileManager.java @@ -20,6 +20,7 @@ import android.widget.Toast; import com.cradle.iitc_mobile.IITC_Mobile.ResponseHandler; import com.cradle.iitc_mobile.async.UpdateScript; +import com.cradle.iitc_mobile.prefs.PluginPreferenceActivity; import org.json.JSONObject; @@ -312,7 +313,7 @@ public class IITC_FileManager { if (invalidateHeaders) { try { thread.join(); - ((IITC_PluginPreferenceActivity) mActivity).invalidateHeaders(); + ((PluginPreferenceActivity) mActivity).invalidateHeaders(); } catch (final InterruptedException e) { Log.w(e); } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index cb312220..55ab13dc 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -40,6 +40,8 @@ import android.widget.TextView; import android.widget.Toast; import com.cradle.iitc_mobile.IITC_NavigationHelper.Pane; +import com.cradle.iitc_mobile.prefs.PluginPreferenceActivity; +import com.cradle.iitc_mobile.prefs.PreferenceActivity; import com.cradle.iitc_mobile.share.ShareActivity; import org.json.JSONException; @@ -257,7 +259,7 @@ public class IITC_Mobile extends Activity final String type = intent.getType() == null ? "" : intent.getType(); final String path = uri.getPath() == null ? "" : uri.getPath(); if (path.endsWith(".user.js") || type.contains("javascript")) { - final Intent prefIntent = new Intent(this, IITC_PluginPreferenceActivity.class); + final Intent prefIntent = new Intent(this, PluginPreferenceActivity.class); prefIntent.setDataAndType(uri, intent.getType()); startActivity(prefIntent); } @@ -574,7 +576,7 @@ public class IITC_Mobile extends Activity } return true; case R.id.action_settings: // start settings activity - final Intent intent = new Intent(this, IITC_PreferenceActivity.class); + final Intent intent = new Intent(this, PreferenceActivity.class); try { intent.putExtra("iitc_version", mFileManager.getIITCVersion()); } catch (final IOException e) { diff --git a/mobile/src/com/cradle/iitc_mobile/fragments/MainSettings.java b/mobile/src/com/cradle/iitc_mobile/fragments/MainSettings.java index f12e5267..e6b1a79f 100644 --- a/mobile/src/com/cradle/iitc_mobile/fragments/MainSettings.java +++ b/mobile/src/com/cradle/iitc_mobile/fragments/MainSettings.java @@ -16,9 +16,9 @@ import android.view.ViewParent; import android.widget.FrameLayout; import android.widget.LinearLayout; -import com.cradle.iitc_mobile.IITC_AboutDialogPreference; import com.cradle.iitc_mobile.Log; import com.cradle.iitc_mobile.R; +import com.cradle.iitc_mobile.prefs.AboutDialogPreference; public class MainSettings extends PreferenceFragment { @Override @@ -40,7 +40,7 @@ public class MainSettings extends PreferenceFragment { Log.w(e); } - final IITC_AboutDialogPreference pref_about = (IITC_AboutDialogPreference) findPreference("pref_about"); + final AboutDialogPreference pref_about = (AboutDialogPreference) findPreference("pref_about"); pref_about.setVersions(iitcVersion, buildVersion); final ListPreference pref_user_location_mode = (ListPreference) findPreference("pref_user_location_mode"); diff --git a/mobile/src/com/cradle/iitc_mobile/fragments/PluginsFragment.java b/mobile/src/com/cradle/iitc_mobile/fragments/PluginsFragment.java index 65fa90ab..b90248d1 100644 --- a/mobile/src/com/cradle/iitc_mobile/fragments/PluginsFragment.java +++ b/mobile/src/com/cradle/iitc_mobile/fragments/PluginsFragment.java @@ -4,9 +4,9 @@ import android.app.ActionBar; import android.os.Bundle; import android.preference.PreferenceFragment; -import com.cradle.iitc_mobile.IITC_PluginPreference; -import com.cradle.iitc_mobile.IITC_PluginPreferenceActivity; import com.cradle.iitc_mobile.R; +import com.cradle.iitc_mobile.prefs.PluginPreference; +import com.cradle.iitc_mobile.prefs.PluginPreferenceActivity; import java.util.ArrayList; @@ -26,11 +26,11 @@ public class PluginsFragment extends PreferenceFragment { // get plugins category for this fragments and plugins list String category = getArguments().getString("category"); boolean userPlugin = getArguments().getBoolean("userPlugin"); - ArrayList prefs = - IITC_PluginPreferenceActivity.getPluginPreference(category, userPlugin); + ArrayList prefs = + PluginPreferenceActivity.getPluginPreference(category, userPlugin); // add plugin checkbox preferences - for (IITC_PluginPreference pref : prefs) { + for (PluginPreference pref : prefs) { getPreferenceScreen().addPreference(pref); } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_AboutDialogPreference.java b/mobile/src/com/cradle/iitc_mobile/prefs/AboutDialogPreference.java similarity index 86% rename from mobile/src/com/cradle/iitc_mobile/IITC_AboutDialogPreference.java rename to mobile/src/com/cradle/iitc_mobile/prefs/AboutDialogPreference.java index 1bfd0fbe..ce25a780 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_AboutDialogPreference.java +++ b/mobile/src/com/cradle/iitc_mobile/prefs/AboutDialogPreference.java @@ -1,4 +1,4 @@ -package com.cradle.iitc_mobile; +package com.cradle.iitc_mobile.prefs; import android.content.Context; import android.preference.Preference; @@ -9,11 +9,13 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -public class IITC_AboutDialogPreference extends Preference { +import com.cradle.iitc_mobile.R; + +public class AboutDialogPreference extends Preference { private String mBuildVersion = ""; private String mIitcVersion = ""; - public IITC_AboutDialogPreference(Context context, AttributeSet attrs) { + public AboutDialogPreference(Context context, AttributeSet attrs) { super(context, attrs); } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_ForceUpdatePreference.java b/mobile/src/com/cradle/iitc_mobile/prefs/ForceUpdatePreference.java similarity index 80% rename from mobile/src/com/cradle/iitc_mobile/IITC_ForceUpdatePreference.java rename to mobile/src/com/cradle/iitc_mobile/prefs/ForceUpdatePreference.java index 1a6c4fbe..1cb5bcb2 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_ForceUpdatePreference.java +++ b/mobile/src/com/cradle/iitc_mobile/prefs/ForceUpdatePreference.java @@ -1,27 +1,22 @@ -package com.cradle.iitc_mobile; +package com.cradle.iitc_mobile.prefs; -import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; -import android.content.SharedPreferences; import android.preference.Preference; import android.preference.PreferenceManager; import android.util.AttributeSet; -import android.view.View; -import android.view.ViewGroup; -import com.cradle.iitc_mobile.IITC_FileManager; -import com.cradle.iitc_mobile.IITC_Mobile; +import com.cradle.iitc_mobile.R; /** * The OptionDialogPreference will display a dialog, and will persist the * true when pressing the positive button and false * otherwise. It will persist to the android:key specified in xml-preference. */ -public class IITC_ForceUpdatePreference extends Preference { +public class ForceUpdatePreference extends Preference { - public IITC_ForceUpdatePreference(Context context, AttributeSet attrs) { + public ForceUpdatePreference(Context context, AttributeSet attrs) { super(context, attrs); } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_PluginPreference.java b/mobile/src/com/cradle/iitc_mobile/prefs/PluginPreference.java similarity index 84% rename from mobile/src/com/cradle/iitc_mobile/IITC_PluginPreference.java rename to mobile/src/com/cradle/iitc_mobile/prefs/PluginPreference.java index 32d6541b..8ee53343 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_PluginPreference.java +++ b/mobile/src/com/cradle/iitc_mobile/prefs/PluginPreference.java @@ -1,4 +1,4 @@ -package com.cradle.iitc_mobile; +package com.cradle.iitc_mobile.prefs; import android.content.Context; import android.preference.CheckBoxPreference; @@ -7,9 +7,9 @@ import android.view.ViewGroup; import android.widget.TextView; // multiline checkbox preference -public class IITC_PluginPreference extends CheckBoxPreference { +public class PluginPreference extends CheckBoxPreference { - public IITC_PluginPreference(Context context) { + public PluginPreference(Context context) { super(context); } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_PluginPreferenceActivity.java b/mobile/src/com/cradle/iitc_mobile/prefs/PluginPreferenceActivity.java similarity index 91% rename from mobile/src/com/cradle/iitc_mobile/IITC_PluginPreferenceActivity.java rename to mobile/src/com/cradle/iitc_mobile/prefs/PluginPreferenceActivity.java index a20ed8f0..8eb17b22 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_PluginPreferenceActivity.java +++ b/mobile/src/com/cradle/iitc_mobile/prefs/PluginPreferenceActivity.java @@ -1,4 +1,4 @@ -package com.cradle.iitc_mobile; +package com.cradle.iitc_mobile.prefs; import android.content.ActivityNotFoundException; import android.content.Context; @@ -18,6 +18,10 @@ import android.widget.ListAdapter; import android.widget.TextView; import android.widget.Toast; +import com.cradle.iitc_mobile.IITC_FileManager; +import com.cradle.iitc_mobile.IITC_NotificationHelper; +import com.cradle.iitc_mobile.Log; +import com.cradle.iitc_mobile.R; import com.cradle.iitc_mobile.fragments.PluginsFragment; import java.io.File; @@ -31,7 +35,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -public class IITC_PluginPreferenceActivity extends PreferenceActivity { +public class PluginPreferenceActivity extends PreferenceActivity { private final static int COPY_PLUGIN_REQUEST = 1; @@ -39,10 +43,10 @@ public class IITC_PluginPreferenceActivity extends PreferenceActivity { // we use a tree map to have a map with alphabetical order // don't initialize the asset plugin map, because it tells us if the settings are started the first time // and we have to parse plugins to build the preference screen - private static TreeMap> sAssetPlugins = null; + private static TreeMap> sAssetPlugins = null; // user plugins can be initialized. - private static final TreeMap> sUserPlugins = - new TreeMap>(); + private static final TreeMap> sUserPlugins = + new TreeMap>(); private static int mDeletedPlugins = 0; private IITC_FileManager mFileManager; @@ -69,7 +73,7 @@ public class IITC_PluginPreferenceActivity extends PreferenceActivity { // it is enough to parse the plugin only on first start. if (sAssetPlugins == null) { Log.d("opened plugin prefs the first time since app start -> parse plugins"); - sAssetPlugins = new TreeMap>(); + sAssetPlugins = new TreeMap>(); setUpPluginPreferenceScreen(); } else { checkForNewPlugins(); @@ -170,7 +174,7 @@ public class IITC_PluginPreferenceActivity extends PreferenceActivity { } // called by Plugins Fragment - public static ArrayList getPluginPreference(final String key, final boolean userPlugin) { + public static ArrayList getPluginPreference(final String key, final boolean userPlugin) { if (userPlugin) return sUserPlugins.get(key); return sAssetPlugins.get(key); @@ -203,10 +207,10 @@ public class IITC_PluginPreferenceActivity extends PreferenceActivity { final File[] userPlugins = getUserPlugins(); final String[] officialPlugins = getAssetPlugins(); int numPlugins = 0; - for (final Map.Entry> entry : sUserPlugins.entrySet()) { + for (final Map.Entry> entry : sUserPlugins.entrySet()) { numPlugins += entry.getValue().size(); } - for (final Map.Entry> entry : sAssetPlugins.entrySet()) { + for (final Map.Entry> entry : sAssetPlugins.entrySet()) { numPlugins += entry.getValue().size(); } if ((userPlugins.length + officialPlugins.length) != (numPlugins + mDeletedPlugins)) { @@ -267,24 +271,24 @@ public class IITC_PluginPreferenceActivity extends PreferenceActivity { // first check if we need a new category if (userPlugin) { if (!sUserPlugins.containsKey(plugin_cat)) { - sUserPlugins.put(plugin_cat, new ArrayList()); + sUserPlugins.put(plugin_cat, new ArrayList()); Log.d("create " + plugin_cat + " and add " + plugin_name); } } else { if (!sAssetPlugins.containsKey(plugin_cat)) { - sAssetPlugins.put(plugin_cat, new ArrayList()); + sAssetPlugins.put(plugin_cat, new ArrayList()); Log.d("create " + plugin_cat + " and add " + plugin_name); } } // now build a new checkable preference for the plugin - final IITC_PluginPreference plugin_pref = new IITC_PluginPreference(this); + final PluginPreference plugin_pref = new PluginPreference(this); plugin_pref.setKey(plugin_key); plugin_pref.setTitle(plugin_name); plugin_pref.setSummary(plugin_desc); plugin_pref.setDefaultValue(false); plugin_pref.setPersistent(true); - final ArrayList list = + final ArrayList list = userPlugin ? sUserPlugins.get(plugin_cat) : sAssetPlugins.get(plugin_cat); list.add(plugin_pref); } @@ -294,7 +298,7 @@ public class IITC_PluginPreferenceActivity extends PreferenceActivity { final Header category = new Header(); category.title = "User Plugins"; mHeaders.add(category); - for (final Map.Entry> entry : sUserPlugins.entrySet()) { + for (final Map.Entry> entry : sUserPlugins.entrySet()) { addHeader(entry.getKey(), true); } } @@ -302,7 +306,7 @@ public class IITC_PluginPreferenceActivity extends PreferenceActivity { final Header category = new Header(); category.title = "Official Plugins"; mHeaders.add(category); - for (final Map.Entry> entry : sAssetPlugins.entrySet()) { + for (final Map.Entry> entry : sAssetPlugins.entrySet()) { addHeader(entry.getKey(), false); } } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_PreferenceActivity.java b/mobile/src/com/cradle/iitc_mobile/prefs/PreferenceActivity.java similarity index 92% rename from mobile/src/com/cradle/iitc_mobile/IITC_PreferenceActivity.java rename to mobile/src/com/cradle/iitc_mobile/prefs/PreferenceActivity.java index a5521541..eb45ff62 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_PreferenceActivity.java +++ b/mobile/src/com/cradle/iitc_mobile/prefs/PreferenceActivity.java @@ -1,4 +1,4 @@ -package com.cradle.iitc_mobile; +package com.cradle.iitc_mobile.prefs; import android.app.Activity; import android.os.Bundle; @@ -6,7 +6,7 @@ import android.view.MenuItem; import com.cradle.iitc_mobile.fragments.MainSettings; -public class IITC_PreferenceActivity extends Activity { +public class PreferenceActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) {