From 40e05ad6600043c11843645f99a3a763083b45ef Mon Sep 17 00:00:00 2001 From: User99gmxat Date: Sat, 19 Jul 2014 09:54:33 +0200 Subject: [PATCH 1/9] Update German translation --- res/values-de/strings.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 3e1e856..2849c20 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -158,6 +158,13 @@ Unterstützt durch Google Werbeblocker Der Werbeblocker ist nur in Lightning Browser+ verfügbar und kann im Google Play Store gekauft werden! + Orbot aktivieren + Orbot ist installiert. Soll Tor verwendet werden? + Um Tor verwenden zu können, muß Orbot installiert sein! + Ja + Nein + Cookies beim Beenden löschen + Verlauf beim Beenden löschen Standard Andere From 005e75fc8d27b16ee909af4761acf2833c5b1178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Sieradzki?= Date: Sat, 19 Jul 2014 16:49:33 +0200 Subject: [PATCH 2/9] Restore consistency in code formatting * remove all trailing spaces * some files used spaces instead of tabs like the rest of codebase - fixed * make use of IDE "optimize import" feature * make use of IDE "auto format" feature to fix some missing spaces here and there --- src/acr/browser/lightning/AdBlock.java | 11 +- .../lightning/AdvancedSettingsActivity.java | 78 +- .../lightning/BookmarkPageVariables.java | 6 + .../browser/lightning/BrowserActivity.java | 683 +++++++++--------- .../browser/lightning/BrowserController.java | 27 +- src/acr/browser/lightning/ClickHandler.java | 3 +- src/acr/browser/lightning/Constants.java | 28 +- .../browser/lightning/DatabaseHandler.java | 39 +- .../browser/lightning/DownloadHandler.java | 370 +++++----- .../browser/lightning/FetchMimeUrlType.java | 164 +++-- src/acr/browser/lightning/HistoryItem.java | 29 +- .../lightning/HistoryPageVariables.java | 6 + .../browser/lightning/HomepageVariables.java | 1 + .../browser/lightning/IncognitoActivity.java | 4 +- src/acr/browser/lightning/IntentUtils.java | 15 +- .../browser/lightning/LicenseActivity.java | 19 +- .../lightning/LightningDownloadListener.java | 23 +- src/acr/browser/lightning/LightningView.java | 353 ++++----- src/acr/browser/lightning/MainActivity.java | 4 +- .../lightning/PreferenceConstants.java | 34 +- .../lightning/ReplacingInputStream.java | 158 ++-- src/acr/browser/lightning/SearchAdapter.java | 94 +-- .../browser/lightning/SettingsActivity.java | 339 ++++----- .../browser/lightning/SettingsController.java | 9 +- src/acr/browser/lightning/SpaceTokenizer.java | 2 +- src/acr/browser/lightning/Utils.java | 61 +- src/acr/browser/lightning/WebAddress.java | 282 ++++---- 27 files changed, 1483 insertions(+), 1359 deletions(-) diff --git a/src/acr/browser/lightning/AdBlock.java b/src/acr/browser/lightning/AdBlock.java index a0cb17e..e5a679b 100644 --- a/src/acr/browser/lightning/AdBlock.java +++ b/src/acr/browser/lightning/AdBlock.java @@ -1,5 +1,9 @@ package acr.browser.lightning; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.AssetManager; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -8,14 +12,12 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.TreeMap; -import android.content.Context; -import android.content.SharedPreferences; -import android.content.res.AssetManager; - public class AdBlock { private static TreeMap mAdBlockMap = null; + private SharedPreferences mPreferences; + private boolean mBlockAds = false; public AdBlock(Context context) { @@ -88,5 +90,4 @@ public class AdBlock { } return domain.startsWith("www.") ? domain.substring(4) : domain; } - } diff --git a/src/acr/browser/lightning/AdvancedSettingsActivity.java b/src/acr/browser/lightning/AdvancedSettingsActivity.java index 8cab2b8..be7e3bd 100644 --- a/src/acr/browser/lightning/AdvancedSettingsActivity.java +++ b/src/acr/browser/lightning/AdvancedSettingsActivity.java @@ -3,27 +3,21 @@ */ package acr.browser.lightning; -import java.io.File; - -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.provider.Browser; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.database.Cursor; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.provider.Browser; import android.view.MenuItem; import android.view.View; -import android.view.WindowManager; import android.view.View.OnClickListener; -import android.webkit.CookieManager; -import android.webkit.CookieSyncManager; -import android.webkit.WebIconDatabase; -import android.webkit.WebView; -import android.webkit.WebViewDatabase; +import android.view.WindowManager; +import android.webkit.*; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; @@ -34,15 +28,22 @@ public class AdvancedSettingsActivity extends Activity { // mPreferences variables private static final int API = android.os.Build.VERSION.SDK_INT; + private static SharedPreferences mPreferences; + private static SharedPreferences.Editor mEditPrefs; + private static RelativeLayout r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, rIncognitoCookies, rClearCache, rSearchSuggestions, rClearHistoryExit, rClearCookiesExit; + private static CheckBox cb1, cb2, cb3, cb4, cb5, cb6, cb7, cb8, cb9, cb10, cb11, cbIncognitoCookies, cbSearchSuggestions, cbClearHistoryExit, cbClearCookiesExit; + private static Context mContext; + private boolean mSystemBrowser; + private Handler messageHandler; @Override @@ -199,18 +200,18 @@ public class AdvancedSettingsActivity extends Activity { @Override public void handleMessage(Message msg) { switch (msg.what) { - case 1: - Utils.showToast( - mContext, - mContext.getResources().getString( - R.string.message_clear_history)); - break; - case 2: - Utils.showToast( - mContext, - mContext.getResources().getString( - R.string.message_cookies_cleared)); - break; + case 1: + Utils.showToast( + mContext, + mContext.getResources().getString( + R.string.message_clear_history)); + break; + case 2: + Utils.showToast( + mContext, + mContext.getResources().getString( + R.string.message_cookies_cleared)); + break; } super.handleMessage(msg); } @@ -244,7 +245,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - + void cbClearHistoryExit(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @@ -258,6 +259,7 @@ public class AdvancedSettingsActivity extends Activity { }); } + void cbClearCookiesExit(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @@ -408,9 +410,9 @@ public class AdvancedSettingsActivity extends Activity { }); } - - void cbSearchSuggestions(CheckBox view){ - view.setOnCheckedChangeListener(new OnCheckedChangeListener(){ + + void cbSearchSuggestions(CheckBox view) { + view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, @@ -418,7 +420,7 @@ public class AdvancedSettingsActivity extends Activity { mEditPrefs.putBoolean(PreferenceConstants.GOOGLE_SEARCH_SUGGESTIONS, isChecked); mEditPrefs.commit(); } - + }); } @@ -445,7 +447,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - + void rClearHistoryExit(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @@ -469,7 +471,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - + void r3(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @@ -690,15 +692,15 @@ public class AdvancedSettingsActivity extends Activity { }); } - - void rSearchSuggestions(RelativeLayout view){ - view.setOnClickListener(new OnClickListener(){ + + void rSearchSuggestions(RelativeLayout view) { + view.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { cbSearchSuggestions.setChecked(!cbSearchSuggestions.isChecked()); } - + }); } @@ -810,8 +812,8 @@ public class AdvancedSettingsActivity extends Activity { public void importFromStockBrowser() { if (mSystemBrowser) { try { - String[] proj = new String[] { Browser.BookmarkColumns.TITLE, - Browser.BookmarkColumns.URL }; + String[] proj = new String[]{Browser.BookmarkColumns.TITLE, + Browser.BookmarkColumns.URL}; // use 0 for history, 1 for bookmarks String sel = Browser.BookmarkColumns.BOOKMARK + " = 1"; Cursor mCur; @@ -846,4 +848,4 @@ public class AdvancedSettingsActivity extends Activity { } } -} \ No newline at end of file +} diff --git a/src/acr/browser/lightning/BookmarkPageVariables.java b/src/acr/browser/lightning/BookmarkPageVariables.java index 16c5735..76b6c53 100644 --- a/src/acr/browser/lightning/BookmarkPageVariables.java +++ b/src/acr/browser/lightning/BookmarkPageVariables.java @@ -4,12 +4,18 @@ package acr.browser.lightning; public class BookmarkPageVariables { + public static final String Heading = "" + BrowserApp.getAppContext().getString(R.string.action_bookmarks) + "
"; + public static final String Part1 = "

"; + public static final String Part4 = "

"; + public static final String End = "
"; } diff --git a/src/acr/browser/lightning/BrowserActivity.java b/src/acr/browser/lightning/BrowserActivity.java index dc4da07..8169d42 100644 --- a/src/acr/browser/lightning/BrowserActivity.java +++ b/src/acr/browser/lightning/BrowserActivity.java @@ -4,38 +4,10 @@ package acr.browser.lightning; -import info.guardianproject.onionkit.ui.OrbotHelper; -import info.guardianproject.onionkit.web.WebkitProxy; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; - import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; +import android.content.*; import android.content.res.Configuration; import android.content.res.Resources.Theme; import android.content.res.TypedArray; @@ -64,96 +36,131 @@ import android.support.v4.widget.DrawerLayout; import android.text.TextUtils; import android.util.Log; import android.util.TypedValue; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; +import android.view.*; import android.view.View.OnClickListener; import android.view.View.OnKeyListener; import android.view.View.OnTouchListener; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; -import android.webkit.CookieManager; -import android.webkit.CookieSyncManager; -import android.webkit.ValueCallback; -import android.webkit.WebViewDatabase; +import android.webkit.*; import android.webkit.WebChromeClient.CustomViewCallback; -import android.webkit.WebIconDatabase; -import android.webkit.WebView; import android.webkit.WebView.HitTestResult; -import android.widget.AdapterView; +import android.widget.*; import android.widget.AdapterView.OnItemClickListener; -import android.widget.ArrayAdapter; -import android.widget.AutoCompleteTextView; -import android.widget.EditText; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.ProgressBar; -import android.widget.RelativeLayout; -import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; -import android.widget.VideoView; +import info.guardianproject.onionkit.ui.OrbotHelper; +import info.guardianproject.onionkit.web.WebkitProxy; + +import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URLEncoder; +import java.util.*; public class BrowserActivity extends Activity implements BrowserController { + private DrawerLayout mDrawerLayout; + private ListView mDrawerList; + private RelativeLayout mDrawer; + private LinearLayout mDrawerRight; + private ListView mDrawerListRight; + private RelativeLayout mNewTab; + private ActionBarDrawerToggle mDrawerToggle; + private List mWebViews = new ArrayList(); + private List mIdList = new ArrayList(); + private LightningView mCurrentView; + private int mIdGenerator; + private LightningViewAdapter mTitleAdapter; + private List mBookmarkList; + private BookmarkViewAdapter mBookmarkAdapter; + private AutoCompleteTextView mSearch; + private ClickHandler mClickHandler; + private ProgressBar mProgress; + private boolean mSystemBrowser = false; + private ValueCallback mUploadMessage; + private View mCustomView; + private int mOriginalOrientation; + private int mActionBarSize; + private ActionBar mActionBar; + private boolean mFullScreen; + private FrameLayout mBrowserFrame; + private FullscreenHolder mFullscreenContainer; + private CustomViewCallback mCustomViewCallback; + private final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + private Bitmap mDefaultVideoPoster; + private View mVideoProgressView; + private DatabaseHandler mHistoryHandler; + private SQLiteDatabase mHistoryDatabase; + private SharedPreferences mPreferences; + private SharedPreferences.Editor mEditPrefs; + private Context mContext; + private Bitmap mWebpageBitmap; + private String mSearchText; + private Activity mActivity; + private CookieManager mCookieManager; + private final int API = android.os.Build.VERSION.SDK_INT; + private Drawable mDeleteIcon; + private Drawable mRefreshIcon; + private Drawable mCopyIcon; + private Drawable mIcon; + private int mActionBarSizeDp; + private int mNumberIconColor; + private String mHomepage; + private boolean mIsNewIntent = false; + private VideoView mVideoView; + private static SearchAdapter mSearchAdapter; + private boolean isIncognito = false; @Override @@ -203,7 +210,7 @@ public class BrowserActivity extends Activity implements BrowserController { mActionBar = getActionBar(); final TypedArray styledAttributes = mContext.getTheme() .obtainStyledAttributes( - new int[] { android.R.attr.actionBarSize }); + new int[]{android.R.attr.actionBarSize}); mActionBarSize = (int) styledAttributes.getDimension(0, 0); if (pixelsToDp(mActionBarSize) < 48) { mActionBarSize = getDp(48); @@ -298,16 +305,16 @@ public class BrowserActivity extends Activity implements BrowserController { public boolean onKey(View arg0, int arg1, KeyEvent arg2) { switch (arg1) { - case KeyEvent.KEYCODE_ENTER: - InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(mSearch.getWindowToken(), 0); - searchTheWeb(mSearch.getText().toString()); - if (mCurrentView != null) { - mCurrentView.requestFocus(); - } - return true; - default: - break; + case KeyEvent.KEYCODE_ENTER: + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(mSearch.getWindowToken(), 0); + searchTheWeb(mSearch.getText().toString()); + if (mCurrentView != null) { + mCurrentView.requestFocus(); + } + return true; + default: + break; } return false; } @@ -402,10 +409,10 @@ public class BrowserActivity extends Activity implements BrowserController { // ActionBarDrawerToggle ties together the the proper interactions // between the sliding drawer and the action bar app icon mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */ - mDrawerLayout, /* DrawerLayout object */ - R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ - R.string.drawer_open, /* "open drawer" description for accessibility */ - R.string.drawer_close /* "close drawer" description for accessibility */ + mDrawerLayout, /* DrawerLayout object */ + R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ + R.string.drawer_open, /* "open drawer" description for accessibility */ + R.string.drawer_close /* "close drawer" description for accessibility */ ) { public void onDrawerClosed(View view) { super.onDrawerClosed(view); @@ -470,7 +477,7 @@ public class BrowserActivity extends Activity implements BrowserController { OrbotHelper oh = new OrbotHelper(this); if (oh.isOrbotInstalled() && !mPreferences.getBoolean( - PreferenceConstants.INITIAL_CHECK_FOR_TOR, false)) { + PreferenceConstants.INITIAL_CHECK_FOR_TOR, false)) { mEditPrefs.putBoolean(PreferenceConstants.INITIAL_CHECK_FOR_TOR, true); mEditPrefs.apply(); @@ -478,20 +485,20 @@ public class BrowserActivity extends Activity implements BrowserController { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { - case DialogInterface.BUTTON_POSITIVE: - mPreferences - .edit() - .putBoolean(PreferenceConstants.USE_PROXY, true) - .apply(); + case DialogInterface.BUTTON_POSITIVE: + mPreferences + .edit() + .putBoolean(PreferenceConstants.USE_PROXY, true) + .apply(); - initializeTor(); - break; - case DialogInterface.BUTTON_NEGATIVE: - mPreferences - .edit() - .putBoolean(PreferenceConstants.USE_PROXY, - false).apply(); - break; + initializeTor(); + break; + case DialogInterface.BUTTON_NEGATIVE: + mPreferences + .edit() + .putBoolean(PreferenceConstants.USE_PROXY, + false).apply(); + break; } } }; @@ -518,8 +525,9 @@ public class BrowserActivity extends Activity implements BrowserController { public void initializeTor() { OrbotHelper oh = new OrbotHelper(this); - if (!oh.isOrbotRunning()) + if (!oh.isOrbotRunning()) { oh.requestOrbotStart(this); + } WebkitProxy wkp = new WebkitProxy(); try { @@ -620,44 +628,44 @@ public class BrowserActivity extends Activity implements BrowserController { } switch (mPreferences.getInt(PreferenceConstants.SEARCH, 1)) { - case 0: - mSearchText = mPreferences.getString( - PreferenceConstants.SEARCH_URL, Constants.GOOGLE_SEARCH); - if (!mSearchText.startsWith(Constants.HTTP) - && !mSearchText.startsWith(Constants.HTTPS)) { + case 0: + mSearchText = mPreferences.getString( + PreferenceConstants.SEARCH_URL, Constants.GOOGLE_SEARCH); + if (!mSearchText.startsWith(Constants.HTTP) + && !mSearchText.startsWith(Constants.HTTPS)) { + mSearchText = Constants.GOOGLE_SEARCH; + } + break; + case 1: mSearchText = Constants.GOOGLE_SEARCH; - } - break; - case 1: - mSearchText = Constants.GOOGLE_SEARCH; - break; - case 2: - mSearchText = Constants.ANDROID_SEARCH; - break; - case 3: - mSearchText = Constants.BING_SEARCH; - break; - case 4: - mSearchText = Constants.YAHOO_SEARCH; - break; - case 5: - mSearchText = Constants.STARTPAGE_SEARCH; - break; - case 6: - mSearchText = Constants.STARTPAGE_MOBILE_SEARCH; - break; - case 7: - mSearchText = Constants.DUCK_SEARCH; - break; - case 8: - mSearchText = Constants.DUCK_LITE_SEARCH; - break; - case 9: - mSearchText = Constants.BAIDU_SEARCH; - break; - case 10: - mSearchText = Constants.YANDEX_SEARCH; - break; + break; + case 2: + mSearchText = Constants.ANDROID_SEARCH; + break; + case 3: + mSearchText = Constants.BING_SEARCH; + break; + case 4: + mSearchText = Constants.YAHOO_SEARCH; + break; + case 5: + mSearchText = Constants.STARTPAGE_SEARCH; + break; + case 6: + mSearchText = Constants.STARTPAGE_MOBILE_SEARCH; + break; + case 7: + mSearchText = Constants.DUCK_SEARCH; + break; + case 8: + mSearchText = Constants.DUCK_LITE_SEARCH; + break; + case 9: + mSearchText = Constants.BAIDU_SEARCH; + break; + case 10: + mSearchText = Constants.YANDEX_SEARCH; + break; } updateCookiePreference(); @@ -712,82 +720,84 @@ public class BrowserActivity extends Activity implements BrowserController { } // Handle action buttons switch (item.getItemId()) { - case android.R.id.home: - if (mDrawerLayout.isDrawerOpen(mDrawerRight)) { - mDrawerLayout.closeDrawer(mDrawerRight); - } - mDrawerToggle.syncState(); - return true; - case R.id.action_back: - if (mCurrentView != null) { - if (mCurrentView.canGoBack()) - mCurrentView.goBack(); - } - return true; - case R.id.action_forward: - if (mCurrentView != null) { - if (mCurrentView.canGoForward()) - mCurrentView.goForward(); - } - return true; - case R.id.action_new_tab: - newTab(null, true); - return true; - case R.id.action_incognito: - startActivity(new Intent(this, IncognitoActivity.class)); - return true; - case R.id.action_share: - if (!mCurrentView.getUrl().startsWith(Constants.FILE)) { - Intent shareIntent = new Intent( - android.content.Intent.ACTION_SEND); - shareIntent.setType("text/plain"); - shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, - mCurrentView.getTitle()); - String shareMessage = mCurrentView.getUrl(); - shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, - shareMessage); - startActivity(Intent.createChooser(shareIntent, getResources() - .getString(R.string.dialog_title_share))); - } - return true; - case R.id.action_bookmarks: - openBookmarks(); - return true; - case R.id.action_copy: - if (mCurrentView != null) { + case android.R.id.home: + if (mDrawerLayout.isDrawerOpen(mDrawerRight)) { + mDrawerLayout.closeDrawer(mDrawerRight); + } + mDrawerToggle.syncState(); + return true; + case R.id.action_back: + if (mCurrentView != null) { + if (mCurrentView.canGoBack()) { + mCurrentView.goBack(); + } + } + return true; + case R.id.action_forward: + if (mCurrentView != null) { + if (mCurrentView.canGoForward()) { + mCurrentView.goForward(); + } + } + return true; + case R.id.action_new_tab: + newTab(null, true); + return true; + case R.id.action_incognito: + startActivity(new Intent(this, IncognitoActivity.class)); + return true; + case R.id.action_share: if (!mCurrentView.getUrl().startsWith(Constants.FILE)) { - ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("label", mCurrentView - .getUrl().toString()); - clipboard.setPrimaryClip(clip); - Utils.showToast(mContext, mContext.getResources() - .getString(R.string.message_link_copied)); + Intent shareIntent = new Intent( + android.content.Intent.ACTION_SEND); + shareIntent.setType("text/plain"); + shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, + mCurrentView.getTitle()); + String shareMessage = mCurrentView.getUrl(); + shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, + shareMessage); + startActivity(Intent.createChooser(shareIntent, getResources() + .getString(R.string.dialog_title_share))); } - } - return true; - case R.id.action_settings: - startActivity(new Intent(this, SettingsActivity.class)); - return true; - case R.id.action_history: - openHistory(); - return true; - case R.id.action_add_bookmark: - if (!mCurrentView.getUrl().startsWith(Constants.FILE)) { - addBookmark(this, mCurrentView.getTitle(), - mCurrentView.getUrl()); - } - return true; - case R.id.action_find: - findInPage(); - return true; - default: - return super.onOptionsItemSelected(item); + return true; + case R.id.action_bookmarks: + openBookmarks(); + return true; + case R.id.action_copy: + if (mCurrentView != null) { + if (!mCurrentView.getUrl().startsWith(Constants.FILE)) { + ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("label", mCurrentView + .getUrl().toString()); + clipboard.setPrimaryClip(clip); + Utils.showToast(mContext, mContext.getResources() + .getString(R.string.message_link_copied)); + } + } + return true; + case R.id.action_settings: + startActivity(new Intent(this, SettingsActivity.class)); + return true; + case R.id.action_history: + openHistory(); + return true; + case R.id.action_add_bookmark: + if (!mCurrentView.getUrl().startsWith(Constants.FILE)) { + addBookmark(this, mCurrentView.getTitle(), + mCurrentView.getUrl()); + } + return true; + case R.id.action_find: + findInPage(); + return true; + default: + return super.onOptionsItemSelected(item); } } /** - * refreshes the underlying list of the Bookmark adapter since the bookmark - * adapter doesn't always change when notifyDataChanged gets called. + * refreshes the underlying list of the Bookmark adapter since the bookmark adapter doesn't always change when + * notifyDataChanged gets called. */ private void notifyBookmarkDataSetChanged() { mBookmarkAdapter.clear(); @@ -796,8 +806,7 @@ public class BrowserActivity extends Activity implements BrowserController { } /** - * method that shows a dialog asking what string the user wishes to search - * for. It highlights the text entered. + * method that shows a dialog asking what string the user wishes to search for. It highlights the text entered. */ private void findInPage() { final AlertDialog.Builder finder = new AlertDialog.Builder(mActivity); @@ -820,9 +829,12 @@ public class BrowserActivity extends Activity implements BrowserController { finder.show(); } - /** The click listener for ListView in the navigation drawer */ + /** + * The click listener for ListView in the navigation drawer + */ private class DrawerItemClickListener implements ListView.OnItemClickListener { + @Override public void onItemClick(AdapterView parent, View view, int position, long id) { @@ -831,9 +843,12 @@ public class BrowserActivity extends Activity implements BrowserController { } } - /** long click listener for Navigation Drawer */ + /** + * long click listener for Navigation Drawer + */ private class DrawerItemLongClickListener implements ListView.OnItemLongClickListener { + @Override public boolean onItemLongClick(AdapterView arg0, View arg1, int position, long arg3) { @@ -844,6 +859,7 @@ public class BrowserActivity extends Activity implements BrowserController { private class BookmarkItemClickListener implements ListView.OnItemClickListener { + @Override public void onItemClick(AdapterView parent, View view, int position, long id) { @@ -864,6 +880,7 @@ public class BrowserActivity extends Activity implements BrowserController { private class BookmarkItemLongClickListener implements ListView.OnItemLongClickListener { + @Override public boolean onItemLongClick(AdapterView arg0, View arg1, final int position, long arg3) { @@ -913,11 +930,10 @@ public class BrowserActivity extends Activity implements BrowserController { } /** - * Takes in the id of which bookmark was selected and shows a dialog that - * allows the user to rename and change the url of the bookmark - * - * @param id - * which id in the list was chosen + * Takes in the id of which bookmark was selected and shows a dialog that allows the user to rename and change the + * url of the bookmark + * + * @param id which id in the list was chosen */ public synchronized void editBookmark(final int id) { final AlertDialog.Builder homePicker = new AlertDialog.Builder( @@ -979,7 +995,7 @@ public class BrowserActivity extends Activity implements BrowserController { if (mCurrentView.getUrl() .startsWith(Constants.FILE) && mCurrentView.getUrl().endsWith( - "bookmarks.html")) { + "bookmarks.html")) { openBookmarkPage(mCurrentView.getWebView()); } } @@ -989,11 +1005,9 @@ public class BrowserActivity extends Activity implements BrowserController { } /** - * displays the WebView contained in the LightningView Also handles the - * removal of previous views - * - * @param view - * the LightningView to show + * displays the WebView contained in the LightningView Also handles the removal of previous views + * + * @param view the LightningView to show */ private synchronized void showTab(LightningView view) { if (view == null) { @@ -1037,8 +1051,9 @@ public class BrowserActivity extends Activity implements BrowserController { url = intent.getDataString(); } int num = 0; - if (intent != null && intent.getExtras() != null) + if (intent != null && intent.getExtras() != null) { num = intent.getExtras().getInt(getPackageName() + ".Origin"); + } if (num == 1) { mCurrentView.loadUrl(url); } else if (url != null) { @@ -1085,8 +1100,7 @@ public class BrowserActivity extends Activity implements BrowserController { } /** - * When using the ActionBarDrawerToggle, you must call it during - * onPostCreate() and onConfigurationChanged()... + * When using the ActionBarDrawerToggle, you must call it during onPostCreate() and onConfigurationChanged()... */ @Override @@ -1224,8 +1238,9 @@ public class BrowserActivity extends Activity implements BrowserController { } mCurrentView = null; for (int n = 0; n < mWebViews.size(); n++) { - if (mWebViews.get(n) != null) + if (mWebViews.get(n) != null) { mWebViews.get(n).onDestroy(); + } } mWebViews.clear(); mTitleAdapter.notifyDataSetChanged(); @@ -1297,12 +1312,14 @@ public class BrowserActivity extends Activity implements BrowserController { mCurrentView.onPause(); } if (mHistoryDatabase != null) { - if (mHistoryDatabase.isOpen()) + if (mHistoryDatabase.isOpen()) { mHistoryDatabase.close(); + } } if (mHistoryHandler != null) { - if (mHistoryHandler.isOpen()) + if (mHistoryHandler.isOpen()) { mHistoryHandler.close(); + } } } @@ -1325,12 +1342,14 @@ public class BrowserActivity extends Activity implements BrowserController { protected void onDestroy() { Log.i(Constants.TAG, "onDestroy"); if (mHistoryDatabase != null) { - if (mHistoryDatabase.isOpen()) + if (mHistoryDatabase.isOpen()) { mHistoryDatabase.close(); + } } if (mHistoryHandler != null) { - if (mHistoryHandler.isOpen()) + if (mHistoryHandler.isOpen()) { mHistoryHandler.close(); + } } super.onDestroy(); } @@ -1380,8 +1399,7 @@ public class BrowserActivity extends Activity implements BrowserController { } /** - * searches the web for the query fixing any and all problems with the input - * checks if it is a search, url, etc. + * searches the web for the query fixing any and all problems with the input checks if it is a search, url, etc. */ void searchTheWeb(String query) { if (query.equals("")) { @@ -1405,12 +1423,12 @@ public class BrowserActivity extends Activity implements BrowserController { boolean validURL = (query.startsWith("ftp://") || query.startsWith(Constants.HTTP) || query.startsWith(Constants.FILE) || query - .startsWith(Constants.HTTPS)) || isIPAddress; + .startsWith(Constants.HTTPS)) || isIPAddress; boolean isSearch = ((query.contains(" ") || !containsPeriod) && !aboutScheme); if (isIPAddress && (!query.startsWith(Constants.HTTP) || !query - .startsWith(Constants.HTTPS))) { + .startsWith(Constants.HTTPS))) { query = Constants.HTTP + query; } @@ -1466,8 +1484,7 @@ public class BrowserActivity extends Activity implements BrowserController { /** * converts the int num into density pixels - * - * @param num + * * @return density pixels */ private int getDp(int num) { @@ -1493,18 +1510,19 @@ public class BrowserActivity extends Activity implements BrowserController { paint.setAntiAlias(true); paint.setStyle(Style.FILL); paint.setColor(mNumberIconColor); - if (number > 99) + if (number > 99) { number = 99; + } // pixels, 36 dp if (mActionBarSizeDp < 50) { if (number > 9) { paint.setTextSize(mActionBarSize * 3 / 4); // originally - // 40 - // pixels, - // 24 dp + // 40 + // pixels, + // 24 dp } else { paint.setTextSize(mActionBarSize * 9 / 10); // originally 50 - // pixels, 30 dp + // pixels, 30 dp } } else { paint.setTextSize(mActionBarSize * 3 / 4); @@ -1524,7 +1542,9 @@ public class BrowserActivity extends Activity implements BrowserController { public class LightningViewAdapter extends ArrayAdapter { Context context; + int layoutResourceId; + List data = null; public LightningViewAdapter(Context context, int layoutResourceId, @@ -1578,8 +1598,11 @@ public class BrowserActivity extends Activity implements BrowserController { } class LightningViewHolder { + TextView txtTitle; + ImageView favicon; + ImageView exit; } } @@ -1587,7 +1610,9 @@ public class BrowserActivity extends Activity implements BrowserController { public class BookmarkViewAdapter extends ArrayAdapter { Context context; + int layoutResourceId; + List data = null; public BookmarkViewAdapter(Context context, int layoutResourceId, @@ -1628,7 +1653,9 @@ public class BrowserActivity extends Activity implements BrowserController { } class BookmarkViewHolder { + TextView txtTitle; + ImageView favicon; } } @@ -1646,7 +1673,9 @@ public class BrowserActivity extends Activity implements BrowserController { } private class DownloadImageTask extends AsyncTask { + ImageView bmImage; + HistoryItem mWeb; public DownloadImageTask(ImageView bmImage, HistoryItem web) { @@ -1729,8 +1758,9 @@ public class BrowserActivity extends Activity implements BrowserController { @Override public void updateUrl(String url) { - if (url == null) + if (url == null) { return; + } url = url.replaceFirst(Constants.HTTP, ""); if (url.startsWith(Constants.FILE)) { url = ""; @@ -1741,8 +1771,9 @@ public class BrowserActivity extends Activity implements BrowserController { @Override public void updateProgress(int n) { - if (!mProgress.isShown()) + if (!mProgress.isShown()) { mProgress.setVisibility(View.VISIBLE); + } mProgress.setProgress(n); if (n == 100) { mProgress.setVisibility(View.INVISIBLE); @@ -1788,8 +1819,8 @@ public class BrowserActivity extends Activity implements BrowserController { .getReadableDatabase(); } Cursor cursor = mHistoryDatabase.query( - DatabaseHandler.TABLE_HISTORY, new String[] { "id", - "url", "title" }, sb.toString(), null, + DatabaseHandler.TABLE_HISTORY, new String[]{"id", + "url", "title"}, sb.toString(), null, null, null, null); if (!cursor.moveToFirst()) { mHistoryHandler.addHistoryItem(new HistoryItem(url, @@ -1821,20 +1852,19 @@ public class BrowserActivity extends Activity implements BrowserController { } /** - * 1, 2, 3, testing... is there a system browser that has some nice - * bookmarks for us? + * 1, 2, 3, testing... is there a system browser that has some nice bookmarks for us? */ public boolean isSystemBrowserAvailable() { return mSystemBrowser; } /** - * 1, 2, 3, testing... is there a system browser that has some nice - * bookmarks for us? helper method for isSystemBrowserAvailable + * 1, 2, 3, testing... is there a system browser that has some nice bookmarks for us? helper method for + * isSystemBrowserAvailable */ public boolean getSystemBrowser() { Cursor c = null; - String[] columns = new String[] { "url", "title" }; + String[] columns = new String[]{"url", "title"}; boolean browserFlag = false; try { @@ -1863,8 +1893,7 @@ public class BrowserActivity extends Activity implements BrowserController { } /** - * method to generate search suggestions for the AutoCompleteTextView from - * previously searched URLs + * method to generate search suggestions for the AutoCompleteTextView from previously searched URLs */ private void initializeSearchSuggestions(final AutoCompleteTextView getUrl) { @@ -1936,8 +1965,6 @@ public class BrowserActivity extends Activity implements BrowserController { /** * returns a list of HistoryItems - * - * @return */ private List getLatestHistory() { DatabaseHandler historyHandler = new DatabaseHandler(mContext); @@ -2096,8 +2123,9 @@ public class BrowserActivity extends Activity implements BrowserController { protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == 1) { - if (null == mUploadMessage) + if (null == mUploadMessage) { return; + } Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData(); mUploadMessage.onReceiveValue(result); @@ -2156,8 +2184,9 @@ public class BrowserActivity extends Activity implements BrowserController { @Override public void onHideCustomView() { if (mCustomView == null || mCustomViewCallback == null - || mCurrentView == null) + || mCurrentView == null) { return; + } Log.i(Constants.TAG, "onHideCustomView"); mCurrentView.setVisibility(View.VISIBLE); mCustomView.setKeepScreenOn(false); @@ -2202,9 +2231,8 @@ public class BrowserActivity extends Activity implements BrowserController { /** * turns on fullscreen mode in the app - * - * @param enabled - * whether to enable fullscreen or not + * + * @param enabled whether to enable fullscreen or not */ public void setFullscreen(boolean enabled) { Window win = getWindow(); @@ -2330,22 +2358,21 @@ public class BrowserActivity extends Activity implements BrowserController { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { - case DialogInterface.BUTTON_POSITIVE: { - newTab(url, false); - break; - } - case DialogInterface.BUTTON_NEGATIVE: { - mCurrentView.loadUrl(url); - break; - } - case DialogInterface.BUTTON_NEUTRAL: { - if (API > 8) { - Utils.downloadFile(mActivity, url, - mCurrentView.getUserAgent(), - "attachment", false); - } - break; - } + case DialogInterface.BUTTON_POSITIVE: + newTab(url, false); + break; + + case DialogInterface.BUTTON_NEGATIVE: + mCurrentView.loadUrl(url); + break; + + case DialogInterface.BUTTON_NEUTRAL: + if (API > 8) { + Utils.downloadFile(mActivity, url, + mCurrentView.getUserAgent(), + "attachment", false); + } + break; } } }; @@ -2374,22 +2401,20 @@ public class BrowserActivity extends Activity implements BrowserController { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { - case DialogInterface.BUTTON_POSITIVE: { - newTab(url, false); - break; - } - case DialogInterface.BUTTON_NEGATIVE: { - mCurrentView.loadUrl(url); - break; - } - case DialogInterface.BUTTON_NEUTRAL: { - ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("label", - url); - clipboard.setPrimaryClip(clip); - - break; - } + case DialogInterface.BUTTON_POSITIVE: + newTab(url, false); + break; + + case DialogInterface.BUTTON_NEGATIVE: + mCurrentView.loadUrl(url); + break; + + case DialogInterface.BUTTON_NEUTRAL: + ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("label", + url); + clipboard.setPrimaryClip(clip); + break; } } }; @@ -2418,21 +2443,20 @@ public class BrowserActivity extends Activity implements BrowserController { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { - case DialogInterface.BUTTON_POSITIVE: { - newTab(url, false); - break; - } - case DialogInterface.BUTTON_NEGATIVE: { - mCurrentView.loadUrl(url); - break; - } - case DialogInterface.BUTTON_NEUTRAL: { - ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("label", url); - clipboard.setPrimaryClip(clip); + case DialogInterface.BUTTON_POSITIVE: + newTab(url, false); + break; - break; - } + case DialogInterface.BUTTON_NEGATIVE: + mCurrentView.loadUrl(url); + break; + + case DialogInterface.BUTTON_NEUTRAL: + ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("label", url); + clipboard.setPrimaryClip(clip); + + break; } } }; @@ -2461,22 +2485,21 @@ public class BrowserActivity extends Activity implements BrowserController { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { - case DialogInterface.BUTTON_POSITIVE: { - newTab(newUrl, false); - break; - } - case DialogInterface.BUTTON_NEGATIVE: { - mCurrentView.loadUrl(newUrl); - break; - } - case DialogInterface.BUTTON_NEUTRAL: { - if (API > 8) { - Utils.downloadFile(mActivity, newUrl, - mCurrentView.getUserAgent(), - "attachment", false); - } - break; - } + case DialogInterface.BUTTON_POSITIVE: + newTab(newUrl, false); + break; + + case DialogInterface.BUTTON_NEGATIVE: + mCurrentView.loadUrl(newUrl); + break; + + case DialogInterface.BUTTON_NEUTRAL: + if (API > 8) { + Utils.downloadFile(mActivity, newUrl, + mCurrentView.getUserAgent(), + "attachment", false); + } + break; } } }; @@ -2505,22 +2528,21 @@ public class BrowserActivity extends Activity implements BrowserController { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { - case DialogInterface.BUTTON_POSITIVE: { - newTab(newUrl, false); - break; - } - case DialogInterface.BUTTON_NEGATIVE: { - mCurrentView.loadUrl(newUrl); - break; - } - case DialogInterface.BUTTON_NEUTRAL: { - ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("label", - newUrl); - clipboard.setPrimaryClip(clip); + case DialogInterface.BUTTON_POSITIVE: + newTab(newUrl, false); + break; - break; - } + case DialogInterface.BUTTON_NEGATIVE: + mCurrentView.loadUrl(newUrl); + break; + + case DialogInterface.BUTTON_NEUTRAL: + ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("label", + newUrl); + clipboard.setPrimaryClip(clip); + + break; } } }; @@ -2552,9 +2574,8 @@ public class BrowserActivity extends Activity implements BrowserController { } /** - * This method lets the search bar know that the page is currently loading - * and that it should display the stop icon to indicate to the user that - * pressing it stops the page from loading + * This method lets the search bar know that the page is currently loading and that it should display the stop icon + * to indicate to the user that pressing it stops the page from loading */ public void setIsLoading() { if (!mSearch.hasFocus()) { @@ -2564,8 +2585,7 @@ public class BrowserActivity extends Activity implements BrowserController { } /** - * This tells the search bar that the page is finished loading and it should - * display the refresh icon + * This tells the search bar that the page is finished loading and it should display the refresh icon */ public void setIsFinishedLoading() { if (!mSearch.hasFocus()) { @@ -2575,9 +2595,9 @@ public class BrowserActivity extends Activity implements BrowserController { } /** - * handle presses on the refresh icon in the search bar, if the page is - * loading, stop the page, if it is done loading refresh the page. - * + * handle presses on the refresh icon in the search bar, if the page is loading, stop the page, if it is done + * loading refresh the page. + * * See setIsFinishedLoading and setIsLoading for displaying the correct icon */ public void refreshOrStop() { @@ -2612,5 +2632,4 @@ public class BrowserActivity extends Activity implements BrowserController { } } - -} \ No newline at end of file +} diff --git a/src/acr/browser/lightning/BrowserController.java b/src/acr/browser/lightning/BrowserController.java index 7599087..f6b2f6d 100644 --- a/src/acr/browser/lightning/BrowserController.java +++ b/src/acr/browser/lightning/BrowserController.java @@ -13,6 +13,7 @@ import android.webkit.WebChromeClient.CustomViewCallback; import android.webkit.WebView; public interface BrowserController { + public void updateUrl(String title); public void updateProgress(int n); @@ -22,30 +23,30 @@ public interface BrowserController { public void openFileChooser(ValueCallback uploadMsg); public void update(); - + public void onLongPress(); - + public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback); - + public void onHideCustomView(); - + public Bitmap getDefaultVideoPoster(); - + public View getVideoLoadingProgressView(); - + public void onCreateWindow(boolean isUserGesture, Message resultMsg); - + public Activity getActivity(); - + public void hideActionBar(); - + public void showActionBar(); - + public void longClickPage(String url); - + public void openBookmarkPage(WebView view); - + public boolean isActionBarShowing(); - + public void closeEmptyTab(); } diff --git a/src/acr/browser/lightning/ClickHandler.java b/src/acr/browser/lightning/ClickHandler.java index d9f2b4c..7aa35b0 100644 --- a/src/acr/browser/lightning/ClickHandler.java +++ b/src/acr/browser/lightning/ClickHandler.java @@ -27,5 +27,4 @@ public class ClickHandler extends Handler { url = msg.getData().getString("url"); mBrowserController.longClickPage(url); } - -} \ No newline at end of file +} diff --git a/src/acr/browser/lightning/Constants.java b/src/acr/browser/lightning/Constants.java index e5f47ec..ba27e0c 100644 --- a/src/acr/browser/lightning/Constants.java +++ b/src/acr/browser/lightning/Constants.java @@ -10,30 +10,52 @@ public class Constants { public Constants() { // TODO Auto-generated constructor stub } - + public static final String DESKTOP_USER_AGENT = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/20 Safari/537.17"; + public static final String MOBILE_USER_AGENT = "Mozilla/5.0 (Linux; U; Android 4.2; en-us; Nexus 4 Build/JOP24G) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"; + public static final int API = android.os.Build.VERSION.SDK_INT; + public static final String YAHOO_SEARCH = "http://search.yahoo.com/search?p="; + public static final String GOOGLE_SEARCH = "https://www.google.com/search?client=lightning&ie=UTF-8&oe=UTF-8&q="; + public static final String BING_SEARCH = "http://www.bing.com/search?q="; + public static final String DUCK_SEARCH = "https://duckduckgo.com/?t=lightning&q="; + public static final String DUCK_LITE_SEARCH = "https://duckduckgo.com/lite/?t=lightning&q="; + public static final String STARTPAGE_MOBILE_SEARCH = "https://startpage.com/do/m/mobilesearch?language=english&query="; + public static final String STARTPAGE_SEARCH = "https://startpage.com/do/search?language=english&query="; + public static final String ANDROID_SEARCH = "http://www.androidsearchresult.com/search.pg?aff=olb&keyword="; + public static final String HOMEPAGE = "about:home"; + public static final String BAIDU_SEARCH = "http://www.baidu.com/s?wd="; + public static final String YANDEX_SEARCH = "http://yandex.ru/yandsearch?lr=21411&text="; + public static final String ADVANCED_SETTINGS_INTENT = "android.intent.action.ADVANCED_SETTINGS"; + public static final String LICENSE_INTENT = "android.intent.action.LICENSE"; - public static final String SETTINGS_INTENT = "android.intent.action.SETTINGS"; + + public static final String SETTINGS_INTENT = "android.intent.action.SETTINGS"; + public static final String INCOGNITO_INTENT = "android.intent.action.INCOGNITO"; + public static final String EXTERNAL_STORAGE = Environment.getExternalStorageDirectory().toString(); + public static final String SEPARATOR = "\\|\\$\\|SEPARATOR\\|\\$\\|"; + public static final String HTTP = "http://"; + public static final String HTTPS = "https://"; + public static final String FILE = "file://"; + public static final String TAG = "Lightning"; - } diff --git a/src/acr/browser/lightning/DatabaseHandler.java b/src/acr/browser/lightning/DatabaseHandler.java index 68f2e16..4439b13 100644 --- a/src/acr/browser/lightning/DatabaseHandler.java +++ b/src/acr/browser/lightning/DatabaseHandler.java @@ -3,15 +3,15 @@ */ package acr.browser.lightning; -import java.util.ArrayList; -import java.util.List; - import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; +import java.util.ArrayList; +import java.util.List; + public class DatabaseHandler extends SQLiteOpenHelper { // All Static variables @@ -26,8 +26,11 @@ public class DatabaseHandler extends SQLiteOpenHelper { // HistoryItems Table Columns names public static final String KEY_ID = "id"; + public static final String KEY_URL = "url"; + public static final String KEY_TITLE = "title"; + public static SQLiteDatabase mDatabase; public DatabaseHandler(Context context) { @@ -54,18 +57,20 @@ public class DatabaseHandler extends SQLiteOpenHelper { // Create tables again onCreate(db); } - - public boolean isOpen(){ - if(mDatabase != null) + + public boolean isOpen() { + if (mDatabase != null) { return mDatabase.isOpen(); - else + } else { return false; + } } @Override public synchronized void close() { - if(mDatabase != null) + if (mDatabase != null) { mDatabase.close(); + } super.close(); } @@ -75,8 +80,9 @@ public class DatabaseHandler extends SQLiteOpenHelper { public synchronized void delete(String url) { String n = getHistoryItem(url); - if(n != null) + if (n != null) { deleteHistoryItem(n); + } } // Adding new item @@ -90,8 +96,8 @@ public class DatabaseHandler extends SQLiteOpenHelper { // Getting single item String getHistoryItem(String url) { - Cursor cursor = mDatabase.query(TABLE_HISTORY, new String[] { KEY_ID, KEY_URL, - KEY_TITLE }, KEY_URL + "=?", new String[] { url }, null, null, + Cursor cursor = mDatabase.query(TABLE_HISTORY, new String[]{KEY_ID, KEY_URL, + KEY_TITLE}, KEY_URL + "=?", new String[]{url}, null, null, null, null); String m = null; if (cursor != null) { @@ -103,11 +109,11 @@ public class DatabaseHandler extends SQLiteOpenHelper { // return item return m; } - + public List findItemsContaining(String search) { List itemList = new ArrayList(); //select query - String selectQuery = "SELECT * FROM " +TABLE_HISTORY +" WHERE "+KEY_TITLE+" LIKE '%" + search + "%'"; + String selectQuery = "SELECT * FROM " + TABLE_HISTORY + " WHERE " + KEY_TITLE + " LIKE '%" + search + "%'"; Cursor cursor = mDatabase.rawQuery(selectQuery, null); // looping through all rows and adding to list @@ -126,7 +132,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { // return item list return itemList; } - + public List getLastHundredItems() { List itemList = new ArrayList(); String selectQuery = "SELECT * FROM " + TABLE_HISTORY; @@ -175,7 +181,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { values.put(KEY_URL, item.getUrl()); values.put(KEY_TITLE, item.getTitle()); int n = mDatabase.update(TABLE_HISTORY, values, KEY_ID + " = ?", - new String[] { String.valueOf(item.getId()) }); + new String[]{String.valueOf(item.getId())}); // updating row return n; } @@ -183,7 +189,7 @@ public class DatabaseHandler extends SQLiteOpenHelper { // Deleting single item public synchronized void deleteHistoryItem(String id) { mDatabase.delete(TABLE_HISTORY, KEY_ID + " = ?", - new String[] { String.valueOf(id) }); + new String[]{String.valueOf(id)}); } // Getting items Count @@ -195,5 +201,4 @@ public class DatabaseHandler extends SQLiteOpenHelper { // return count return cursor.getCount(); } - } diff --git a/src/acr/browser/lightning/DownloadHandler.java b/src/acr/browser/lightning/DownloadHandler.java index d831896..a6d7ed4 100644 --- a/src/acr/browser/lightning/DownloadHandler.java +++ b/src/acr/browser/lightning/DownloadHandler.java @@ -3,8 +3,6 @@ */ package acr.browser.lightning; - - import android.app.Activity; import android.app.AlertDialog; import android.app.DownloadManager; @@ -27,189 +25,191 @@ import android.widget.Toast; */ public class DownloadHandler { - - private static final String LOGTAG = "DLHandler"; - private static Activity mActivity; - - /** - * Notify the host application a download should be done, or that - * the data should be streamed if a streaming viewer is available. - * @param activity Activity requesting the download. - * @param url The full url to the content that should be downloaded - * @param userAgent User agent of the downloading application. - * @param contentDisposition Content-disposition http header, if present. - * @param mimetype The mimetype of the content reported by the server - * @param privateBrowsing If the request is coming from a private browsing tab. - */ - public static void onDownloadStart(Activity activity, String url, - String userAgent, String contentDisposition, String mimetype, - boolean privateBrowsing) { - mActivity = activity; - // if we're dealing wih A/V content that's not explicitly marked - // for download, check if it's streamable. - if (contentDisposition == null - || !contentDisposition.regionMatches( - true, 0, "attachment", 0, 10)) { - // query the package manager to see if there's a registered handler - // that matches. - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setDataAndType(Uri.parse(url), mimetype); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - ResolveInfo info = activity.getPackageManager().resolveActivity(intent, - PackageManager.MATCH_DEFAULT_ONLY); - if (info != null) { - ComponentName myName = activity.getComponentName(); - // If we resolved to ourselves, we don't want to attempt to - // load the url only to try and download it again. - if (!myName.getPackageName().equals( - info.activityInfo.packageName) - || !myName.getClassName().equals( - info.activityInfo.name)) { - // someone (other than us) knows how to handle this mime - // type with this scheme, don't download. - try { - activity.startActivity(intent); - return; - } catch (ActivityNotFoundException ex) { - // Best behavior is to fall back to a download in this - // case - } - } - } - } - onDownloadStartNoStream(activity, url, userAgent, contentDisposition, - mimetype, privateBrowsing); - } - - // This is to work around the fact that java.net.URI throws Exceptions - // instead of just encoding URL's properly - // Helper method for onDownloadStartNoStream - private static String encodePath(String path) { - char[] chars = path.toCharArray(); - - boolean needed = false; - for (char c : chars) { - if (c == '[' || c == ']' || c == '|') { - needed = true; - break; - } - } - if (needed == false) { - return path; - } - - StringBuilder sb = new StringBuilder(""); - for (char c : chars) { - if (c == '[' || c == ']' || c == '|') { - sb.append('%'); - sb.append(Integer.toHexString(c)); - } else { - sb.append(c); - } - } - - return sb.toString(); - } - - /** - * Notify the host application a download should be done, even if there - * is a streaming viewer available for thise type. - * @param activity Activity requesting the download. - * @param url The full url to the content that should be downloaded - * @param userAgent User agent of the downloading application. - * @param contentDisposition Content-disposition http header, if present. - * @param mimetype The mimetype of the content reported by the server - * @param privateBrowsing If the request is coming from a private browsing tab. - */ - /*package */ static void onDownloadStartNoStream(Activity activity, - String url, String userAgent, String contentDisposition, - String mimetype, boolean privateBrowsing) { - - String filename = URLUtil.guessFileName(url, - contentDisposition, mimetype); - - // Check to see if we have an SDCard - String status = Environment.getExternalStorageState(); - if (!status.equals(Environment.MEDIA_MOUNTED)) { - int title; - String msg; - - // Check to see if the SDCard is busy, same as the music app - if (status.equals(Environment.MEDIA_SHARED)) { - msg = activity.getString(R.string.download_sdcard_busy_dlg_msg); - title = R.string.download_sdcard_busy_dlg_title; - } else { - msg = activity.getString(R.string.download_no_sdcard_dlg_msg, filename); - title = R.string.download_no_sdcard_dlg_title; - } - - new AlertDialog.Builder(activity) - .setTitle(title) - .setIcon(android.R.drawable.ic_dialog_alert) - .setMessage(msg) - .setPositiveButton(R.string.action_ok, null) - .show(); - return; - } - - // java.net.URI is a lot stricter than KURL so we have to encode some - // extra characters. Fix for b 2538060 and b 1634719 - WebAddress webAddress; - try { - webAddress = new WebAddress(url); - webAddress.setPath(encodePath(webAddress.getPath())); - } catch (Exception e) { - // This only happens for very bad urls, we want to chatch the - // exception here - Log.e(LOGTAG, "Exception trying to parse url:" + url); - return; - } - - String addressString = webAddress.toString(); - Uri uri = Uri.parse(addressString); - final DownloadManager.Request request; - try { - request = new DownloadManager.Request(uri); - } catch (IllegalArgumentException e) { - Toast.makeText(activity, R.string.cannot_download, Toast.LENGTH_SHORT).show(); - return; - } - request.setMimeType(mimetype); - // set downloaded file destination to /sdcard/Download. - // or, should it be set to one of several Environment.DIRECTORY* dirs depending on mimetype? + private static final String LOGTAG = "DLHandler"; + + private static Activity mActivity; + + /** + * Notify the host application a download should be done, or that the data should be streamed if a streaming viewer + * is available. + * + * @param activity Activity requesting the download. + * @param url The full url to the content that should be downloaded + * @param userAgent User agent of the downloading application. + * @param contentDisposition Content-disposition http header, if present. + * @param mimetype The mimetype of the content reported by the server + * @param privateBrowsing If the request is coming from a private browsing tab. + */ + public static void onDownloadStart(Activity activity, String url, + String userAgent, String contentDisposition, String mimetype, + boolean privateBrowsing) { + mActivity = activity; + // if we're dealing wih A/V content that's not explicitly marked + // for download, check if it's streamable. + if (contentDisposition == null + || !contentDisposition.regionMatches( + true, 0, "attachment", 0, 10)) { + // query the package manager to see if there's a registered handler + // that matches. + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(Uri.parse(url), mimetype); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + ResolveInfo info = activity.getPackageManager().resolveActivity(intent, + PackageManager.MATCH_DEFAULT_ONLY); + if (info != null) { + ComponentName myName = activity.getComponentName(); + // If we resolved to ourselves, we don't want to attempt to + // load the url only to try and download it again. + if (!myName.getPackageName().equals( + info.activityInfo.packageName) + || !myName.getClassName().equals( + info.activityInfo.name)) { + // someone (other than us) knows how to handle this mime + // type with this scheme, don't download. + try { + activity.startActivity(intent); + return; + } catch (ActivityNotFoundException ex) { + // Best behavior is to fall back to a download in this + // case + } + } + } + } + onDownloadStartNoStream(activity, url, userAgent, contentDisposition, + mimetype, privateBrowsing); + } + + // This is to work around the fact that java.net.URI throws Exceptions + // instead of just encoding URL's properly + // Helper method for onDownloadStartNoStream + private static String encodePath(String path) { + char[] chars = path.toCharArray(); + + boolean needed = false; + for (char c : chars) { + if (c == '[' || c == ']' || c == '|') { + needed = true; + break; + } + } + if (needed == false) { + return path; + } + + StringBuilder sb = new StringBuilder(""); + for (char c : chars) { + if (c == '[' || c == ']' || c == '|') { + sb.append('%'); + sb.append(Integer.toHexString(c)); + } else { + sb.append(c); + } + } + + return sb.toString(); + } + + /** + * Notify the host application a download should be done, even if there is a streaming viewer available for thise + * type. + * + * @param activity Activity requesting the download. + * @param url The full url to the content that should be downloaded + * @param userAgent User agent of the downloading application. + * @param contentDisposition Content-disposition http header, if present. + * @param mimetype The mimetype of the content reported by the server + * @param privateBrowsing If the request is coming from a private browsing tab. + */ + /*package */ + static void onDownloadStartNoStream(Activity activity, + String url, String userAgent, String contentDisposition, + String mimetype, boolean privateBrowsing) { + + String filename = URLUtil.guessFileName(url, + contentDisposition, mimetype); + + // Check to see if we have an SDCard + String status = Environment.getExternalStorageState(); + if (!status.equals(Environment.MEDIA_MOUNTED)) { + int title; + String msg; + + // Check to see if the SDCard is busy, same as the music app + if (status.equals(Environment.MEDIA_SHARED)) { + msg = activity.getString(R.string.download_sdcard_busy_dlg_msg); + title = R.string.download_sdcard_busy_dlg_title; + } else { + msg = activity.getString(R.string.download_no_sdcard_dlg_msg, filename); + title = R.string.download_no_sdcard_dlg_title; + } + + new AlertDialog.Builder(activity) + .setTitle(title) + .setIcon(android.R.drawable.ic_dialog_alert) + .setMessage(msg) + .setPositiveButton(R.string.action_ok, null) + .show(); + return; + } + + // java.net.URI is a lot stricter than KURL so we have to encode some + // extra characters. Fix for b 2538060 and b 1634719 + WebAddress webAddress; + try { + webAddress = new WebAddress(url); + webAddress.setPath(encodePath(webAddress.getPath())); + } catch (Exception e) { + // This only happens for very bad urls, we want to chatch the + // exception here + Log.e(LOGTAG, "Exception trying to parse url:" + url); + return; + } + + String addressString = webAddress.toString(); + Uri uri = Uri.parse(addressString); + final DownloadManager.Request request; + try { + request = new DownloadManager.Request(uri); + } catch (IllegalArgumentException e) { + Toast.makeText(activity, R.string.cannot_download, Toast.LENGTH_SHORT).show(); + return; + } + request.setMimeType(mimetype); + // set downloaded file destination to /sdcard/Download. + // or, should it be set to one of several Environment.DIRECTORY* dirs depending on mimetype? String location = mActivity.getSharedPreferences(PreferenceConstants.PREFERENCES, 0) .getString(PreferenceConstants.DOWNLOAD_DIRECTORY, Environment.DIRECTORY_DOWNLOADS); - request.setDestinationInExternalPublicDir(location, filename); - // let this downloaded file be scanned by MediaScanner - so that it can - // show up in Gallery app, for example. - request.allowScanningByMediaScanner(); - request.setDescription(webAddress.getHost()); - // XXX: Have to use the old url since the cookies were stored using the - // old percent-encoded url. - String cookies = CookieManager.getInstance().getCookie(url); - request.addRequestHeader("cookie", cookies); - request.setNotificationVisibility( - DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); - if (mimetype == null) { - if (TextUtils.isEmpty(addressString)) { - return; - } - // We must have long pressed on a link or image to download it. We - // are not sure of the mimetype in this case, so do a head request - new FetchUrlMimeType(activity, request, addressString, cookies, - userAgent).start(); - } else { - final DownloadManager manager - = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE); - new Thread("Browser download") { - public void run() { - manager.enqueue(request); - } - }.start(); - } - Toast.makeText(activity, R.string.download_pending, Toast.LENGTH_SHORT) - .show(); - } - -} \ No newline at end of file + request.setDestinationInExternalPublicDir(location, filename); + // let this downloaded file be scanned by MediaScanner - so that it can + // show up in Gallery app, for example. + request.allowScanningByMediaScanner(); + request.setDescription(webAddress.getHost()); + // XXX: Have to use the old url since the cookies were stored using the + // old percent-encoded url. + String cookies = CookieManager.getInstance().getCookie(url); + request.addRequestHeader("cookie", cookies); + request.setNotificationVisibility( + DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); + if (mimetype == null) { + if (TextUtils.isEmpty(addressString)) { + return; + } + // We must have long pressed on a link or image to download it. We + // are not sure of the mimetype in this case, so do a head request + new FetchUrlMimeType(activity, request, addressString, cookies, + userAgent).start(); + } else { + final DownloadManager manager + = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE); + new Thread("Browser download") { + public void run() { + manager.enqueue(request); + } + }.start(); + } + Toast.makeText(activity, R.string.download_pending, Toast.LENGTH_SHORT) + .show(); + } +} diff --git a/src/acr/browser/lightning/FetchMimeUrlType.java b/src/acr/browser/lightning/FetchMimeUrlType.java index 2fe25bd..4d4e303 100644 --- a/src/acr/browser/lightning/FetchMimeUrlType.java +++ b/src/acr/browser/lightning/FetchMimeUrlType.java @@ -3,107 +3,105 @@ */ package acr.browser.lightning; - -import org.apache.http.Header; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpHead; import android.app.DownloadManager; import android.content.Context; import android.net.http.AndroidHttpClient; import android.os.Environment; import android.webkit.MimeTypeMap; import android.webkit.URLUtil; +import org.apache.http.Header; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpHead; import java.io.IOException; /** - * This class is used to pull down the http headers of a given URL so that - * we can analyse the mimetype and make any correction needed before we give - * the URL to the download manager. - * This operation is needed when the user long-clicks on a link or image and - * we don't know the mimetype. If the user just clicks on the link, we will - * do the same steps of correcting the mimetype down in - * android.os.webkit.LoadListener rather than handling it here. - * + * This class is used to pull down the http headers of a given URL so that we can analyse the mimetype and make any + * correction needed before we give the URL to the download manager. This operation is needed when the user long-clicks + * on a link or image and we don't know the mimetype. If the user just clicks on the link, we will do the same steps of + * correcting the mimetype down in android.os.webkit.LoadListener rather than handling it here. */ class FetchUrlMimeType extends Thread { - private Context mContext; - private DownloadManager.Request mRequest; - private String mUri; - private String mCookies; - private String mUserAgent; + private Context mContext; + + private DownloadManager.Request mRequest; + + private String mUri; + + private String mCookies; + + private String mUserAgent; - public FetchUrlMimeType(Context context, DownloadManager.Request request, - String uri, String cookies, String userAgent) { - mContext = context.getApplicationContext(); - mRequest = request; - mUri = uri; - mCookies = cookies; - mUserAgent = userAgent; - } + public FetchUrlMimeType(Context context, DownloadManager.Request request, + String uri, String cookies, String userAgent) { + mContext = context.getApplicationContext(); + mRequest = request; + mUri = uri; + mCookies = cookies; + mUserAgent = userAgent; + } - @Override - public void run() { - // User agent is likely to be null, though the AndroidHttpClient - // seems ok with that. - AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent); - - HttpHead request = new HttpHead(mUri); + @Override + public void run() { + // User agent is likely to be null, though the AndroidHttpClient + // seems ok with that. + AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent); - if (mCookies != null && mCookies.length() > 0) { - request.addHeader("Cookie", mCookies); - } + HttpHead request = new HttpHead(mUri); - HttpResponse response; - String mimeType = null; - String contentDisposition = null; - try { - response = client.execute(request); - // We could get a redirect here, but if we do lets let - // the download manager take care of it, and thus trust that - // the server sends the right mimetype - if (response.getStatusLine().getStatusCode() == 200) { - Header header = response.getFirstHeader("Content-Type"); - if (header != null) { - mimeType = header.getValue(); - final int semicolonIndex = mimeType.indexOf(';'); - if (semicolonIndex != -1) { - mimeType = mimeType.substring(0, semicolonIndex); - } - } - Header contentDispositionHeader = response.getFirstHeader("Content-Disposition"); - if (contentDispositionHeader != null) { - contentDisposition = contentDispositionHeader.getValue(); - } - } - } catch (IllegalArgumentException ex) { - request.abort(); - } catch (IOException ex) { - request.abort(); - } finally { - client.close(); - } + if (mCookies != null && mCookies.length() > 0) { + request.addHeader("Cookie", mCookies); + } - if (mimeType != null) { - if (mimeType.equalsIgnoreCase("text/plain") || - mimeType.equalsIgnoreCase("application/octet-stream")) { - String newMimeType = - MimeTypeMap.getSingleton().getMimeTypeFromExtension( - MimeTypeMap.getFileExtensionFromUrl(mUri)); - if (newMimeType != null) { - mRequest.setMimeType(newMimeType); - } - } - String filename = URLUtil.guessFileName(mUri, contentDisposition, - mimeType); - mRequest.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename); - } + HttpResponse response; + String mimeType = null; + String contentDisposition = null; + try { + response = client.execute(request); + // We could get a redirect here, but if we do lets let + // the download manager take care of it, and thus trust that + // the server sends the right mimetype + if (response.getStatusLine().getStatusCode() == 200) { + Header header = response.getFirstHeader("Content-Type"); + if (header != null) { + mimeType = header.getValue(); + final int semicolonIndex = mimeType.indexOf(';'); + if (semicolonIndex != -1) { + mimeType = mimeType.substring(0, semicolonIndex); + } + } + Header contentDispositionHeader = response.getFirstHeader("Content-Disposition"); + if (contentDispositionHeader != null) { + contentDisposition = contentDispositionHeader.getValue(); + } + } + } catch (IllegalArgumentException ex) { + request.abort(); + } catch (IOException ex) { + request.abort(); + } finally { + client.close(); + } - // Start the download - DownloadManager manager = (DownloadManager) mContext.getSystemService( - Context.DOWNLOAD_SERVICE); - manager.enqueue(mRequest); - } + if (mimeType != null) { + if (mimeType.equalsIgnoreCase("text/plain") || + mimeType.equalsIgnoreCase("application/octet-stream")) { + String newMimeType = + MimeTypeMap.getSingleton().getMimeTypeFromExtension( + MimeTypeMap.getFileExtensionFromUrl(mUri)); + if (newMimeType != null) { + mRequest.setMimeType(newMimeType); + } + } + String filename = URLUtil.guessFileName(mUri, contentDisposition, + mimeType); + mRequest.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename); + } + // Start the download + DownloadManager manager = (DownloadManager) mContext.getSystemService( + Context.DOWNLOAD_SERVICE); + manager.enqueue(mRequest); + } } diff --git a/src/acr/browser/lightning/HistoryItem.java b/src/acr/browser/lightning/HistoryItem.java index d660024..66aded0 100644 --- a/src/acr/browser/lightning/HistoryItem.java +++ b/src/acr/browser/lightning/HistoryItem.java @@ -9,9 +9,13 @@ public class HistoryItem implements Comparable { // private variables private int mId; + private String mUrl; + private String mTitle; + private Bitmap mBitmap; + private int mImageId; // Empty constructor @@ -33,21 +37,21 @@ public class HistoryItem implements Comparable { this.mTitle = title; this.mBitmap = null; } - + // constructor - public HistoryItem(String url, String title, int imageId) { - this.mUrl = url; - this.mTitle = title; - this.mBitmap = null; - this.mImageId = imageId; - } + public HistoryItem(String url, String title, int imageId) { + this.mUrl = url; + this.mTitle = title; + this.mBitmap = null; + this.mImageId = imageId; + } // getting ID public int getId() { return this.mId; } - - public int getImageId(){ + + public int getImageId() { return this.mImageId; } @@ -55,8 +59,8 @@ public class HistoryItem implements Comparable { public void setID(int id) { this.mId = id; } - - public void setImageId(int id){ + + public void setImageId(int id) { this.mImageId = id; } @@ -97,5 +101,4 @@ public class HistoryItem implements Comparable { public int compareTo(HistoryItem another) { return mTitle.compareTo(another.mTitle); } - -} \ No newline at end of file +} diff --git a/src/acr/browser/lightning/HistoryPageVariables.java b/src/acr/browser/lightning/HistoryPageVariables.java index 5e146e3..1d6f51e 100644 --- a/src/acr/browser/lightning/HistoryPageVariables.java +++ b/src/acr/browser/lightning/HistoryPageVariables.java @@ -4,12 +4,18 @@ package acr.browser.lightning; public class HistoryPageVariables { + public static final String Heading = "" + BrowserApp.getAppContext().getString(R.string.action_history) + "
"; + public static final String Part1 = "

"; + public static final String Part3 = "

"; + public static final String Part4 = "

"; + public static final String End = ""; } diff --git a/src/acr/browser/lightning/HomepageVariables.java b/src/acr/browser/lightning/HomepageVariables.java index def1679..2ab32a5 100644 --- a/src/acr/browser/lightning/HomepageVariables.java +++ b/src/acr/browser/lightning/HomepageVariables.java @@ -4,6 +4,7 @@ package acr.browser.lightning; public class HomepageVariables { + public static final String HEAD = "" + BrowserApp.getAppContext().getString(R.string.home) + "" diff --git a/src/acr/browser/lightning/IncognitoActivity.java b/src/acr/browser/lightning/IncognitoActivity.java index f7c6549..4ce8fed 100644 --- a/src/acr/browser/lightning/IncognitoActivity.java +++ b/src/acr/browser/lightning/IncognitoActivity.java @@ -10,6 +10,7 @@ import android.webkit.CookieSyncManager; public class IncognitoActivity extends BrowserActivity { SharedPreferences mPreferences; + CookieManager mCookieManager; @Override @@ -73,7 +74,4 @@ public class IncognitoActivity extends BrowserActivity { closeDrawers(); finish(); } - - - } diff --git a/src/acr/browser/lightning/IntentUtils.java b/src/acr/browser/lightning/IntentUtils.java index 9b08978..b1072dc 100644 --- a/src/acr/browser/lightning/IntentUtils.java +++ b/src/acr/browser/lightning/IntentUtils.java @@ -1,10 +1,5 @@ package acr.browser.lightning; -import java.net.URISyntaxException; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; @@ -15,10 +10,17 @@ import android.net.Uri; import android.util.Log; import android.webkit.WebView; +import java.net.URISyntaxException; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class IntentUtils { private Activity mActivity; + private BrowserController mController; + static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile("(?i)" + // switch on case insensitive matching "(" @@ -72,8 +74,7 @@ public class IntentUtils { } /** - * Search for intent handlers that are specific to this URL aka, specialized - * apps like google maps or youtube + * Search for intent handlers that are specific to this URL aka, specialized apps like google maps or youtube */ private boolean isSpecializedHandlerAvailable(Intent intent) { PackageManager pm = mActivity.getPackageManager(); diff --git a/src/acr/browser/lightning/LicenseActivity.java b/src/acr/browser/lightning/LicenseActivity.java index 1d07520..dc7c779 100644 --- a/src/acr/browser/lightning/LicenseActivity.java +++ b/src/acr/browser/lightning/LicenseActivity.java @@ -31,15 +31,15 @@ public class LicenseActivity extends Activity implements View.OnClickListener { @Override public void onClick(View v) { switch (v.getId()) { - case R.id.browserLicense: - actionView("http://www.mozilla.org/MPL/2.0/"); - break; - case R.id.licenseAOSP: - actionView("http://www.apache.org/licenses/LICENSE-2.0"); - break; - case R.id.licenseHosts: - actionView("http://hosts-file.net/"); - break; + case R.id.browserLicense: + actionView("http://www.mozilla.org/MPL/2.0/"); + break; + case R.id.licenseAOSP: + actionView("http://www.apache.org/licenses/LICENSE-2.0"); + break; + case R.id.licenseHosts: + actionView("http://hosts-file.net/"); + break; } } @@ -54,5 +54,4 @@ public class LicenseActivity extends Activity implements View.OnClickListener { finish(); return super.onOptionsItemSelected(item); } - } diff --git a/src/acr/browser/lightning/LightningDownloadListener.java b/src/acr/browser/lightning/LightningDownloadListener.java index 734d7f7..a27e493 100644 --- a/src/acr/browser/lightning/LightningDownloadListener.java +++ b/src/acr/browser/lightning/LightningDownloadListener.java @@ -11,11 +11,13 @@ import android.webkit.DownloadListener; import android.webkit.URLUtil; public class LightningDownloadListener implements DownloadListener { + private Activity mActivity; - LightningDownloadListener(Activity activity){ + + LightningDownloadListener(Activity activity) { mActivity = activity; } - + @Override public void onDownloadStart(final String url, final String userAgent, final String contentDisposition, final String mimetype, @@ -26,13 +28,12 @@ public class LightningDownloadListener implements DownloadListener { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { - case DialogInterface.BUTTON_POSITIVE: { - DownloadHandler.onDownloadStart(mActivity, url, userAgent, contentDisposition, mimetype, false); - break; - } - case DialogInterface.BUTTON_NEGATIVE: { - break; - } + case DialogInterface.BUTTON_POSITIVE: + DownloadHandler.onDownloadStart(mActivity, url, userAgent, contentDisposition, mimetype, false); + break; + + case DialogInterface.BUTTON_NEGATIVE: + break; } } }; @@ -45,8 +46,6 @@ public class LightningDownloadListener implements DownloadListener { .setNegativeButton(mActivity.getResources().getString(R.string.action_cancel), dialogClickListener) .show(); Log.i(Constants.TAG, "Downloading" + fileName); - - } + } } - diff --git a/src/acr/browser/lightning/LightningView.java b/src/acr/browser/lightning/LightningView.java index 3b96834..19a6b82 100644 --- a/src/acr/browser/lightning/LightningView.java +++ b/src/acr/browser/lightning/LightningView.java @@ -4,28 +4,10 @@ package acr.browser.lightning; -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.URISyntaxException; -import java.net.URL; - -import org.apache.http.util.ByteArrayBuffer; - import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; +import android.content.*; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.MailTo; @@ -33,7 +15,6 @@ import android.net.Uri; import android.net.http.SslError; import android.os.Message; import android.text.InputType; -import android.text.TextUtils; import android.text.method.PasswordTransformationMethod; import android.util.Log; import android.view.GestureDetector; @@ -42,39 +23,50 @@ import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.webkit.CookieManager; -import android.webkit.GeolocationPermissions; -import android.webkit.HttpAuthHandler; -import android.webkit.SslErrorHandler; -import android.webkit.ValueCallback; -import android.webkit.WebChromeClient; -import android.webkit.WebResourceResponse; -import android.webkit.WebSettings; +import android.webkit.*; import android.webkit.WebSettings.LayoutAlgorithm; import android.webkit.WebSettings.PluginState; -import android.webkit.WebView; -import android.webkit.WebViewClient; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.VideoView; +import org.apache.http.util.ByteArrayBuffer; + +import java.io.*; +import java.net.*; public class LightningView { private Title mTitle; + private WebView mWebView; + private BrowserController mBrowserController; + private GestureDetector mGestureDetector; + private Activity mActivity; + private WebSettings mSettings; + private static int API = android.os.Build.VERSION.SDK_INT; + private static String mHomepage; + private static String mDefaultUserAgent; + private static Bitmap mWebpageBitmap; + private static SharedPreferences mPreferences; + private static boolean mWideViewPort; + private static AdBlock mAdBlock; + private CookieManager mCookieManager; + private boolean isForgroundTab = false; + private IntentUtils mIntentUtils = null; @SuppressLint("NewApi") @@ -122,7 +114,9 @@ public class LightningView { mWebView.setOnTouchListener(new OnTouchListener() { float mLocation = 0; + float mY = 0; + int mAction = 0; @Override @@ -172,85 +166,85 @@ public class LightningView { String home = ""; home = HomepageVariables.HEAD; switch (mPreferences.getInt(PreferenceConstants.SEARCH, 1)) { - case 0: - // CUSTOM SEARCH - home = home + "file:///android_asset/lightning.png"; - home = home + HomepageVariables.MIDDLE; - home = home - + mPreferences.getString(PreferenceConstants.SEARCH_URL, - Constants.GOOGLE_SEARCH); - break; - case 1: - // GOOGLE_SEARCH; - home = home + "file:///android_asset/google.png"; - // + "https://www.google.com/images/srpr/logo11w.png"; - home = home + HomepageVariables.MIDDLE; - home = home + Constants.GOOGLE_SEARCH; - break; - case 2: - // ANDROID SEARCH; - home = home + "file:///android_asset/lightning.png"; - home = home + HomepageVariables.MIDDLE; - home = home + Constants.ANDROID_SEARCH; - break; - case 3: - // BING_SEARCH; - home = home + "file:///android_asset/bing.png"; - // + - // "http://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Bing_logo_%282013%29.svg/500px-Bing_logo_%282013%29.svg.png"; - home = home + HomepageVariables.MIDDLE; - home = home + Constants.BING_SEARCH; - break; - case 4: - // YAHOO_SEARCH; - home = home + "file:///android_asset/yahoo.png"; - // + - // "http://upload.wikimedia.org/wikipedia/commons/thumb/2/24/Yahoo%21_logo.svg/799px-Yahoo%21_logo.svg.png"; - home = home + HomepageVariables.MIDDLE; - home = home + Constants.YAHOO_SEARCH; - break; - case 5: - // STARTPAGE_SEARCH; - home = home + "file:///android_asset/startpage.png"; - // + "https://startpage.com/graphics/startp_logo.gif"; - home = home + HomepageVariables.MIDDLE; - home = home + Constants.STARTPAGE_SEARCH; - break; - case 6: - // STARTPAGE_MOBILE - home = home + "file:///android_asset/startpage.png"; - // + "https://startpage.com/graphics/startp_logo.gif"; - home = home + HomepageVariables.MIDDLE; - home = home + Constants.STARTPAGE_MOBILE_SEARCH; - case 7: - // DUCK_SEARCH; - home = home + "file:///android_asset/duckduckgo.png"; - // + "https://duckduckgo.com/assets/logo_homepage.normal.v101.png"; - home = home + HomepageVariables.MIDDLE; - home = home + Constants.DUCK_SEARCH; - break; - case 8: - // DUCK_LITE_SEARCH; - home = home + "file:///android_asset/duckduckgo.png"; - // + "https://duckduckgo.com/assets/logo_homepage.normal.v101.png"; - home = home + HomepageVariables.MIDDLE; - home = home + Constants.DUCK_LITE_SEARCH; - break; - case 9: - // BAIDU_SEARCH; - home = home + "file:///android_asset/baidu.png"; - // + "http://www.baidu.com/img/bdlogo.gif"; - home = home + HomepageVariables.MIDDLE; - home = home + Constants.BAIDU_SEARCH; - break; - case 10: - // YANDEX_SEARCH; - home = home + "file:///android_asset/yandex.png"; - // + - // "http://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Yandex.svg/600px-Yandex.svg.png"; - home = home + HomepageVariables.MIDDLE; - home = home + Constants.YANDEX_SEARCH; - break; + case 0: + // CUSTOM SEARCH + home = home + "file:///android_asset/lightning.png"; + home = home + HomepageVariables.MIDDLE; + home = home + + mPreferences.getString(PreferenceConstants.SEARCH_URL, + Constants.GOOGLE_SEARCH); + break; + case 1: + // GOOGLE_SEARCH; + home = home + "file:///android_asset/google.png"; + // + "https://www.google.com/images/srpr/logo11w.png"; + home = home + HomepageVariables.MIDDLE; + home = home + Constants.GOOGLE_SEARCH; + break; + case 2: + // ANDROID SEARCH; + home = home + "file:///android_asset/lightning.png"; + home = home + HomepageVariables.MIDDLE; + home = home + Constants.ANDROID_SEARCH; + break; + case 3: + // BING_SEARCH; + home = home + "file:///android_asset/bing.png"; + // + + // "http://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Bing_logo_%282013%29.svg/500px-Bing_logo_%282013%29.svg.png"; + home = home + HomepageVariables.MIDDLE; + home = home + Constants.BING_SEARCH; + break; + case 4: + // YAHOO_SEARCH; + home = home + "file:///android_asset/yahoo.png"; + // + + // "http://upload.wikimedia.org/wikipedia/commons/thumb/2/24/Yahoo%21_logo.svg/799px-Yahoo%21_logo.svg.png"; + home = home + HomepageVariables.MIDDLE; + home = home + Constants.YAHOO_SEARCH; + break; + case 5: + // STARTPAGE_SEARCH; + home = home + "file:///android_asset/startpage.png"; + // + "https://startpage.com/graphics/startp_logo.gif"; + home = home + HomepageVariables.MIDDLE; + home = home + Constants.STARTPAGE_SEARCH; + break; + case 6: + // STARTPAGE_MOBILE + home = home + "file:///android_asset/startpage.png"; + // + "https://startpage.com/graphics/startp_logo.gif"; + home = home + HomepageVariables.MIDDLE; + home = home + Constants.STARTPAGE_MOBILE_SEARCH; + case 7: + // DUCK_SEARCH; + home = home + "file:///android_asset/duckduckgo.png"; + // + "https://duckduckgo.com/assets/logo_homepage.normal.v101.png"; + home = home + HomepageVariables.MIDDLE; + home = home + Constants.DUCK_SEARCH; + break; + case 8: + // DUCK_LITE_SEARCH; + home = home + "file:///android_asset/duckduckgo.png"; + // + "https://duckduckgo.com/assets/logo_homepage.normal.v101.png"; + home = home + HomepageVariables.MIDDLE; + home = home + Constants.DUCK_LITE_SEARCH; + break; + case 9: + // BAIDU_SEARCH; + home = home + "file:///android_asset/baidu.png"; + // + "http://www.baidu.com/img/bdlogo.gif"; + home = home + HomepageVariables.MIDDLE; + home = home + Constants.BAIDU_SEARCH; + break; + case 10: + // YANDEX_SEARCH; + home = home + "file:///android_asset/yandex.png"; + // + + // "http://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Yandex.svg/600px-Yandex.svg.png"; + home = home + HomepageVariables.MIDDLE; + home = home + Constants.YANDEX_SEARCH; + break; } @@ -285,40 +279,39 @@ public class LightningView { if (API < 19) { switch (mPreferences.getInt( PreferenceConstants.ADOBE_FLASH_SUPPORT, 0)) { - case 0: - mSettings.setPluginState(PluginState.OFF); - break; - case 1: { - mSettings.setPluginState(PluginState.ON_DEMAND); - break; - } - case 2: { - mSettings.setPluginState(PluginState.ON); - break; - } - default: - break; + case 0: + mSettings.setPluginState(PluginState.OFF); + break; + case 1: + mSettings.setPluginState(PluginState.ON_DEMAND); + break; + case 2: + mSettings.setPluginState(PluginState.ON); + break; + default: + break; } } switch (mPreferences.getInt(PreferenceConstants.USER_AGENT, 1)) { - case 1: - if (API > 16) - mSettings.setUserAgentString(WebSettings - .getDefaultUserAgent(context)); - else - mSettings.setUserAgentString(mDefaultUserAgent); - break; - case 2: - mSettings.setUserAgentString(Constants.DESKTOP_USER_AGENT); - break; - case 3: - mSettings.setUserAgentString(Constants.MOBILE_USER_AGENT); - break; - case 4: - mSettings.setUserAgentString(mPreferences.getString( - PreferenceConstants.USER_AGENT_STRING, mDefaultUserAgent)); - break; + case 1: + if (API > 16) { + mSettings.setUserAgentString(WebSettings + .getDefaultUserAgent(context)); + } else { + mSettings.setUserAgentString(mDefaultUserAgent); + } + break; + case 2: + mSettings.setUserAgentString(Constants.DESKTOP_USER_AGENT); + break; + case 3: + mSettings.setUserAgentString(Constants.MOBILE_USER_AGENT); + break; + case 4: + mSettings.setUserAgentString(mPreferences.getString( + PreferenceConstants.USER_AGENT_STRING, mDefaultUserAgent)); + break; } if (mPreferences.getBoolean(PreferenceConstants.SAVE_PASSWORDS, false)) { @@ -350,25 +343,25 @@ public class LightningView { mSettings.setLoadWithOverviewMode(mPreferences.getBoolean( PreferenceConstants.OVERVIEW_MODE, true)); switch (mPreferences.getInt(PreferenceConstants.TEXT_SIZE, 3)) { - case 1: - mSettings.setTextZoom(200); - break; - case 2: - mSettings.setTextZoom(150); - break; - case 3: - mSettings.setTextZoom(100); - break; - case 4: - mSettings.setTextZoom(75); - break; - case 5: - mSettings.setTextZoom(50); - break; + case 1: + mSettings.setTextZoom(200); + break; + case 2: + mSettings.setTextZoom(150); + break; + case 3: + mSettings.setTextZoom(100); + break; + case 4: + mSettings.setTextZoom(75); + break; + case 5: + mSettings.setTextZoom(50); + break; } } - @SuppressLint({ "SetJavaScriptEnabled", "NewApi" }) + @SuppressLint({"SetJavaScriptEnabled", "NewApi"}) public void initializeSettings(WebSettings settings, Context context) { if (API < 18) { settings.setAppCacheMaxSize(Long.MAX_VALUE); @@ -403,20 +396,23 @@ public class LightningView { } public boolean isShown() { - if (mWebView != null) + if (mWebView != null) { return mWebView.isShown(); - else + } else { return false; + } } public synchronized void onPause() { - if (mWebView != null) + if (mWebView != null) { mWebView.onPause(); + } } public synchronized void onResume() { - if (mWebView != null) + if (mWebView != null) { mWebView.onResume(); + } } public void setIsForgroundTab(boolean isForground) { @@ -456,8 +452,9 @@ public class LightningView { public void requestFocus() { if (mWebView != null) { - if (!mWebView.hasFocus()) + if (!mWebView.hasFocus()) { mWebView.requestFocus(); + } } } @@ -508,8 +505,9 @@ public class LightningView { } public synchronized void goBack() { - if (mWebView != null) + if (mWebView != null) { mWebView.goBack(); + } } public String getUserAgent() { @@ -521,8 +519,9 @@ public class LightningView { } public synchronized void goForward() { - if (mWebView != null) + if (mWebView != null) { mWebView.goForward(); + } } public boolean canGoBack() { @@ -550,13 +549,15 @@ public class LightningView { } public synchronized void loadUrl(String url) { - if (mWebView != null) + if (mWebView != null) { mWebView.loadUrl(url); + } } public synchronized void invalidate() { - if (mWebView != null) + if (mWebView != null) { mWebView.invalidate(); + } } public String getTitle() { @@ -564,10 +565,11 @@ public class LightningView { } public String getUrl() { - if (mWebView != null) + if (mWebView != null) { return mWebView.getUrl(); - else + } else { return ""; + } } public class LightningWebClient extends WebViewClient { @@ -593,11 +595,13 @@ public class LightningView { PreferenceConstants.USE_PROXY, false); boolean mDoLeakHardening = false; - if (!useProxy) + if (!useProxy) { return null; + } - if (!mDoLeakHardening) + if (!mDoLeakHardening) { return null; + } // now we are going to proxy! try { @@ -636,13 +640,15 @@ public class LightningView { if (cEnc == null && ctArray.length > 1) { cEnc = ctArray[1]; - if (cEnc.indexOf('=') != -1) + if (cEnc.indexOf('=') != -1) { cEnc = cEnc.split("=")[1].trim(); + } } } - if (connLen <= 0) + if (connLen <= 0) { connLen = 2048; + } if (cType != null && cType.startsWith("text")) { InputStream fStream = null; @@ -683,9 +689,9 @@ public class LightningView { }/** * else if (mDoLeakHardening) { WebResourceResponse response = * new WebResourceResponse( cType, cEnc, conn.getInputStream()); - * + * * return response; - * + * * } */ else { @@ -880,7 +886,7 @@ public class LightningView { return true; } } - return mIntentUtils.startActivityForUrl(mWebView, url); + return mIntentUtils.startActivityForUrl(mWebView, url); } } @@ -1043,8 +1049,11 @@ public class LightningView { } public class Title { + private Bitmap mFavicon; + private String mTitle; + private Bitmap mDefaultIcon; public Title(Context context) { diff --git a/src/acr/browser/lightning/MainActivity.java b/src/acr/browser/lightning/MainActivity.java index ff8c61e..78e5472 100644 --- a/src/acr/browser/lightning/MainActivity.java +++ b/src/acr/browser/lightning/MainActivity.java @@ -10,6 +10,7 @@ import android.webkit.CookieSyncManager; public class MainActivity extends BrowserActivity { SharedPreferences mPreferences; + CookieManager mCookieManager; @Override @@ -72,7 +73,4 @@ public class MainActivity extends BrowserActivity { closeDrawers(); moveTaskToBack(true); } - - - } diff --git a/src/acr/browser/lightning/PreferenceConstants.java b/src/acr/browser/lightning/PreferenceConstants.java index 35675df..f375a9c 100644 --- a/src/acr/browser/lightning/PreferenceConstants.java +++ b/src/acr/browser/lightning/PreferenceConstants.java @@ -4,38 +4,70 @@ package acr.browser.lightning; public class PreferenceConstants { + public static final String ADOBE_FLASH_SUPPORT = "enableflash"; + public static final String BLOCK_ADS = "AdBlock"; + public static final String BLOCK_IMAGES = "blockimages"; + public static final String CLEAR_CACHE_EXIT = "cache"; + public static final String COOKIES = "cookies"; + public static final String DOWNLOAD_DIRECTORY = "download"; + public static final String FULL_SCREEN = "fullscreen"; + public static final String HIDE_STATUS_BAR = "hidestatus"; + public static final String HOMEPAGE = "home"; + public static final String INCOGNITO_COOKIES = "incognitocookies"; + public static final String JAVASCRIPT = "java"; + public static final String LOCATION = "location"; + public static final String OVERVIEW_MODE = "overviewmode"; + public static final String POPUPS = "newwindows"; + public static final String PREFERENCES = "settings"; + public static final String RESTORE_LOST_TABS = "restoreclosed"; + public static final String SAVE_PASSWORDS = "passwords"; + public static final String SEARCH = "search"; + public static final String SEARCH_URL = "searchurl"; + public static final String SYSTEM_BROWSER_PRESENT = "SystemBrowser"; + public static final String TEXT_REFLOW = "textreflow"; + public static final String TEXT_SIZE = "textsize"; + public static final String URL_MEMORY = "memory"; + public static final String USE_WIDE_VIEWPORT = "wideviewport"; + public static final String USER_AGENT = "agentchoose"; + public static final String USER_AGENT_STRING = "userAgentString"; + public static final String GOOGLE_SEARCH_SUGGESTIONS = "GoogleSearchSuggestions"; + public static final String CLEAR_HISTORY_EXIT = "clearHistoryExit"; + public static final String CLEAR_COOKIES_EXIT = "clearCookiesExit"; - + public static final String USE_PROXY = "useProxy"; + public static final String USE_PROXY_HOST = "useProxyHost"; + public static final String USE_PROXY_PORT = "useProxyPort"; + public static final String INITIAL_CHECK_FOR_TOR = "checkForTor"; } diff --git a/src/acr/browser/lightning/ReplacingInputStream.java b/src/acr/browser/lightning/ReplacingInputStream.java index 9d9db1c..dc7e8e5 100644 --- a/src/acr/browser/lightning/ReplacingInputStream.java +++ b/src/acr/browser/lightning/ReplacingInputStream.java @@ -8,84 +8,92 @@ import java.util.LinkedList; public class ReplacingInputStream extends FilterInputStream { - LinkedList inQueue = new LinkedList(); - LinkedList outQueue = new LinkedList(); - final byte[] search, replacement; - - protected ReplacingInputStream(InputStream in, byte[] search, - byte[] replacement) { - super(in); - this.search = search; - this.replacement = replacement; - } - - private boolean isMatchFound() { - Iterator inIter = inQueue.iterator(); - for (int i = 0; i < search.length; i++) - if (!inIter.hasNext() || search[i] != inIter.next()) - return false; - return true; - } - - private void readAhead() throws IOException { - // Work up some look-ahead. - while (inQueue.size() < search.length) { - int next = super.read(); - inQueue.offer(next); - if (next == -1) - break; - } - } - - - @Override - public int read() throws IOException { - - // Next byte already determined. - if (outQueue.isEmpty()) { - - readAhead(); - - if (isMatchFound()) { - for (int i = 0; i < search.length; i++) - inQueue.remove(); - - for (byte b : replacement) - outQueue.offer((int) b); - } else - outQueue.add(inQueue.remove()); - } - - return outQueue.remove(); - } - - /** - * Returns false. REFilterInputStream does not support mark() and - * reset() methods. - */ - public boolean markSupported() { - return false; - } - - /** Reads from the stream into the provided array. - * @throws IOException */ - public int read(byte[] b, int off, int len) throws IOException { - int i; - int ok = 0; - while (len-- > 0) { - i = read(); - if (i == -1) return (ok == 0) ? -1 : ok; - b[off++] = (byte) i; - ok++; - } - return ok; - } + LinkedList inQueue = new LinkedList(); + + LinkedList outQueue = new LinkedList(); + + final byte[] search, replacement; + + protected ReplacingInputStream(InputStream in, byte[] search, + byte[] replacement) { + super(in); + this.search = search; + this.replacement = replacement; + } + + private boolean isMatchFound() { + Iterator inIter = inQueue.iterator(); + for (int i = 0; i < search.length; i++) { + if (!inIter.hasNext() || search[i] != inIter.next()) { + return false; + } + } + return true; + } + + private void readAhead() throws IOException { + // Work up some look-ahead. + while (inQueue.size() < search.length) { + int next = super.read(); + inQueue.offer(next); + if (next == -1) { + break; + } + } + } + + + @Override + public int read() throws IOException { + + // Next byte already determined. + if (outQueue.isEmpty()) { + + readAhead(); + + if (isMatchFound()) { + for (int i = 0; i < search.length; i++) { + inQueue.remove(); + } + + for (byte b : replacement) { + outQueue.offer((int) b); + } + } else { + outQueue.add(inQueue.remove()); + } + } + + return outQueue.remove(); + } + + /** + * Returns false. REFilterInputStream does not support mark() and reset() methods. + */ + public boolean markSupported() { + return false; + } + + /** + * Reads from the stream into the provided array. + */ + public int read(byte[] b, int off, int len) throws IOException { + int i; + int ok = 0; + while (len-- > 0) { + i = read(); + if (i == -1) { + return (ok == 0) ? -1 : ok; + } + b[off++] = (byte) i; + ok++; + } + return ok; + } @Override public int read(byte[] buffer) throws IOException { return read(buffer, 0, buffer.length); } - - -} \ No newline at end of file +} diff --git a/src/acr/browser/lightning/SearchAdapter.java b/src/acr/browser/lightning/SearchAdapter.java index 9f159ec..0a5b562 100644 --- a/src/acr/browser/lightning/SearchAdapter.java +++ b/src/acr/browser/lightning/SearchAdapter.java @@ -1,19 +1,5 @@ package acr.browser.lightning; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlPullParserFactory; - import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; @@ -24,23 +10,41 @@ import android.os.AsyncTask; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.Filter; -import android.widget.Filterable; -import android.widget.ImageView; -import android.widget.TextView; +import android.widget.*; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlPullParserFactory; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; public class SearchAdapter extends BaseAdapter implements Filterable { private List mHistory; + private List mBookmarks; + private List mSuggestions; + private List mFilteredList; + private List mAllBookmarks; + private DatabaseHandler mDatabaseHandler; + private SharedPreferences mPreferences; + private boolean mUseGoogle = true; + private Context mContext; + private boolean mIncognito = false; public SearchAdapter(Context context, boolean incognito) { @@ -114,33 +118,33 @@ public class SearchAdapter extends BaseAdapter implements Filterable { int imageId = R.drawable.ic_bookmark; switch (web.getImageId()) { - case R.drawable.ic_bookmark: { - if (!mIncognito) { - imageId = R.drawable.ic_bookmark; - } else { - holder.mTitle.setTextColor(Color.WHITE); - imageId = R.drawable.ic_bookmark_dark; + case R.drawable.ic_bookmark: { + if (!mIncognito) { + imageId = R.drawable.ic_bookmark; + } else { + holder.mTitle.setTextColor(Color.WHITE); + imageId = R.drawable.ic_bookmark_dark; + } + break; } - break; - } - case R.drawable.ic_search: { - if (!mIncognito) { - imageId = R.drawable.ic_search; - } else { - holder.mTitle.setTextColor(Color.WHITE); - imageId = R.drawable.ic_search_dark; + case R.drawable.ic_search: { + if (!mIncognito) { + imageId = R.drawable.ic_search; + } else { + holder.mTitle.setTextColor(Color.WHITE); + imageId = R.drawable.ic_search_dark; + } + break; } - break; - } - case R.drawable.ic_history: { - if (!mIncognito) { - imageId = R.drawable.ic_history; - } else { - holder.mTitle.setTextColor(Color.WHITE); - imageId = R.drawable.ic_history_dark; + case R.drawable.ic_history: { + if (!mIncognito) { + imageId = R.drawable.ic_history; + } else { + holder.mTitle.setTextColor(Color.WHITE); + imageId = R.drawable.ic_history_dark; + } + break; } - break; - } } holder.mImage.setImageDrawable(mContext.getResources().getDrawable( @@ -235,8 +239,11 @@ public class SearchAdapter extends BaseAdapter implements Filterable { } private class SuggestionHolder { + ImageView mImage; + TextView mTitle; + TextView mUrl; } @@ -389,5 +396,4 @@ public class SearchAdapter extends BaseAdapter implements Filterable { return filteredList; } - } diff --git a/src/acr/browser/lightning/SettingsActivity.java b/src/acr/browser/lightning/SettingsActivity.java index 941409c..c2bc201 100644 --- a/src/acr/browser/lightning/SettingsActivity.java +++ b/src/acr/browser/lightning/SettingsActivity.java @@ -3,10 +3,6 @@ */ package acr.browser.lightning; -import info.guardianproject.onionkit.ui.OrbotHelper; -import android.net.Uri; -import android.os.Bundle; -import android.os.Environment; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; @@ -20,36 +16,47 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.graphics.Color; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; import android.util.Log; import android.util.TypedValue; import android.view.MenuItem; import android.view.View; -import android.view.WindowManager; import android.view.View.OnClickListener; -import android.widget.CheckBox; -import android.widget.CompoundButton; +import android.view.WindowManager; +import android.widget.*; import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.EditText; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; -import android.widget.Switch; -import android.widget.TextView; +import info.guardianproject.onionkit.ui.OrbotHelper; public class SettingsActivity extends Activity { private static int API = android.os.Build.VERSION.SDK_INT; + private static SharedPreferences.Editor mEditPrefs; + private static int mAgentChoice; + private static String mHomepage; + private static TextView mAgentTextView; + private static TextView mDownloadTextView; + private static int mEasterEggCounter = 0; + private static String mSearchUrl; + private static String mDownloadLocation; + private static TextView mHomepageText; + private static SharedPreferences mPreferences; + private static TextView mSearchText; + private Context mContext; + private Activity mActivity; @Override @@ -90,38 +97,38 @@ public class SettingsActivity extends Activity { mSearchText = (TextView) findViewById(R.id.searchText); switch (mPreferences.getInt(PreferenceConstants.SEARCH, 1)) { - case 0: - mSearchText.setText(getResources().getString(R.string.custom_url)); - break; - case 1: - mSearchText.setText("Google"); - break; - case 2: - mSearchText.setText("Android Search"); - break; - case 3: - mSearchText.setText("Bing"); - break; - case 4: - mSearchText.setText("Yahoo"); - break; - case 5: - mSearchText.setText("StartPage"); - break; - case 6: - mSearchText.setText("StartPage (Mobile)"); - break; - case 7: - mSearchText.setText("DuckDuckGo"); - break; - case 8: - mSearchText.setText("DuckDuckGo Lite"); - break; - case 9: - mSearchText.setText("Baidu"); - break; - case 10: - mSearchText.setText("Yandex"); + case 0: + mSearchText.setText(getResources().getString(R.string.custom_url)); + break; + case 1: + mSearchText.setText("Google"); + break; + case 2: + mSearchText.setText("Android Search"); + break; + case 3: + mSearchText.setText("Bing"); + break; + case 4: + mSearchText.setText("Yahoo"); + break; + case 5: + mSearchText.setText("StartPage"); + break; + case 6: + mSearchText.setText("StartPage (Mobile)"); + break; + case 7: + mSearchText.setText("DuckDuckGo"); + break; + case 8: + mSearchText.setText("DuckDuckGo Lite"); + break; + case 9: + mSearchText.setText("Baidu"); + break; + case 10: + mSearchText.setText("Yandex"); } mAgentTextView = (TextView) findViewById(R.id.agentText); @@ -175,21 +182,21 @@ public class SettingsActivity extends Activity { } switch (mAgentChoice) { - case 1: - mAgentTextView.setText(getResources().getString( - R.string.agent_default)); - break; - case 2: - mAgentTextView.setText(getResources().getString( - R.string.agent_desktop)); - break; - case 3: - mAgentTextView.setText(getResources().getString( - R.string.agent_mobile)); - break; - case 4: - mAgentTextView.setText(getResources().getString( - R.string.agent_custom)); + case 1: + mAgentTextView.setText(getResources().getString( + R.string.agent_default)); + break; + case 2: + mAgentTextView.setText(getResources().getString( + R.string.agent_desktop)); + break; + case 3: + mAgentTextView.setText(getResources().getString( + R.string.agent_mobile)); + break; + case 4: + mAgentTextView.setText(getResources().getString( + R.string.agent_custom)); } RelativeLayout r1, r2, r3, r4, r5, licenses; r1 = (RelativeLayout) findViewById(R.id.setR1); @@ -268,7 +275,7 @@ public class SettingsActivity extends Activity { "Google", "Android Search", "Bing", "Yahoo", "StartPage", "StartPage (Mobile)", "DuckDuckGo (Privacy)", "DuckDuckGo Lite (Privacy)", - "Baidu (Chinese)", "Yandex (Russian)" }; + "Baidu (Chinese)", "Yandex (Russian)"}; int n = mPreferences.getInt(PreferenceConstants.SEARCH, 1); @@ -282,38 +289,38 @@ public class SettingsActivity extends Activity { which); mEditPrefs.commit(); switch (which) { - case 0: - searchUrlPicker(); - break; - case 1: - mSearchText.setText("Google"); - break; - case 2: - mSearchText.setText("Android Search"); - break; - case 3: - mSearchText.setText("Bing"); - break; - case 4: - mSearchText.setText("Yahoo"); - break; - case 5: - mSearchText.setText("StartPage"); - break; - case 6: - mSearchText.setText("StartPage (Mobile)"); - break; - case 7: - mSearchText.setText("DuckDuckGo"); - break; - case 8: - mSearchText.setText("DuckDuckGo Lite"); - break; - case 9: - mSearchText.setText("Baidu"); - break; - case 10: - mSearchText.setText("Yandex"); + case 0: + searchUrlPicker(); + break; + case 1: + mSearchText.setText("Google"); + break; + case 2: + mSearchText.setText("Android Search"); + break; + case 3: + mSearchText.setText("Bing"); + break; + case 4: + mSearchText.setText("Yahoo"); + break; + case 5: + mSearchText.setText("StartPage"); + break; + case 6: + mSearchText.setText("StartPage (Mobile)"); + break; + case 7: + mSearchText.setText("DuckDuckGo"); + break; + case 8: + mSearchText.setText("DuckDuckGo Lite"); + break; + case 9: + mSearchText.setText("Baidu"); + break; + case 10: + mSearchText.setText("Yandex"); } } }); @@ -345,7 +352,7 @@ public class SettingsActivity extends Activity { getSearchUrl.setText(mSearchUrl); urlPicker.setView(getSearchUrl); urlPicker.setPositiveButton(getResources() - .getString(R.string.action_ok), + .getString(R.string.action_ok), new DialogInterface.OnClickListener() { @Override @@ -483,8 +490,9 @@ public class SettingsActivity extends Activity { PackageManager pm = getPackageManager(); ApplicationInfo ai = pm.getApplicationInfo( "com.adobe.flashplayer", 0); - if (ai != null) + if (ai != null) { flashInstalled = true; + } } catch (NameNotFoundException e) { flashInstalled = false; } @@ -570,14 +578,14 @@ public class SettingsActivity extends Activity { } }).setOnCancelListener(new OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - mEditPrefs.putInt( - PreferenceConstants.ADOBE_FLASH_SUPPORT, 0); - mEditPrefs.commit(); - } + @Override + public void onCancel(DialogInterface dialog) { + mEditPrefs.putInt( + PreferenceConstants.ADOBE_FLASH_SUPPORT, 0); + mEditPrefs.commit(); + } - }); + }); AlertDialog alert = builder.create(); alert.show(); } @@ -611,8 +619,9 @@ public class SettingsActivity extends Activity { PackageManager pm = getPackageManager(); ApplicationInfo ai = pm.getApplicationInfo( "com.adobe.flashplayer", 0); - if (ai != null) + if (ai != null) { flashInstalled = true; + } } catch (NameNotFoundException e) { flashInstalled = false; } @@ -674,23 +683,23 @@ public class SettingsActivity extends Activity { which + 1); mEditPrefs.commit(); switch (which + 1) { - case 1: - mAgentTextView.setText(getResources() - .getString(R.string.agent_default)); - break; - case 2: - mAgentTextView.setText(getResources() - .getString(R.string.agent_desktop)); - break; - case 3: - mAgentTextView.setText(getResources() - .getString(R.string.agent_mobile)); - break; - case 4: - mAgentTextView.setText(getResources() - .getString(R.string.agent_custom)); - agentPicker(); - break; + case 1: + mAgentTextView.setText(getResources() + .getString(R.string.agent_default)); + break; + case 2: + mAgentTextView.setText(getResources() + .getString(R.string.agent_desktop)); + break; + case 3: + mAgentTextView.setText(getResources() + .getString(R.string.agent_mobile)); + break; + case 4: + mAgentTextView.setText(getResources() + .getString(R.string.agent_custom)); + agentPicker(); + break; } } }); @@ -774,21 +783,21 @@ public class SettingsActivity extends Activity { int which) { switch (which + 1) { - case 1: - mEditPrefs - .putString( - PreferenceConstants.DOWNLOAD_DIRECTORY, - Environment.DIRECTORY_DOWNLOADS); - mEditPrefs.commit(); - mDownloadTextView - .setText(Constants.EXTERNAL_STORAGE - + "/" - + Environment.DIRECTORY_DOWNLOADS); - break; - case 2: - downPicker(); - - break; + case 1: + mEditPrefs + .putString( + PreferenceConstants.DOWNLOAD_DIRECTORY, + Environment.DIRECTORY_DOWNLOADS); + mEditPrefs.commit(); + mDownloadTextView + .setText(Constants.EXTERNAL_STORAGE + + "/" + + Environment.DIRECTORY_DOWNLOADS); + break; + case 2: + downPicker(); + + break; } } }); @@ -921,37 +930,37 @@ public class SettingsActivity extends Activity { int which) { switch (which + 1) { - case 1: - mEditPrefs.putString( - PreferenceConstants.HOMEPAGE, - "about:home"); - mEditPrefs.commit(); - mHomepageText - .setText(getResources().getString( - R.string.action_homepage)); - break; - case 2: - mEditPrefs.putString( - PreferenceConstants.HOMEPAGE, - "about:blank"); - mEditPrefs.commit(); - mHomepageText.setText(getResources() - .getString(R.string.action_blank)); - break; - case 3: - mEditPrefs.putString( - PreferenceConstants.HOMEPAGE, - "about:bookmarks"); - mEditPrefs.commit(); - mHomepageText.setText(getResources() - .getString( - R.string.action_bookmarks)); - - break; - case 4: - homePicker(); - - break; + case 1: + mEditPrefs.putString( + PreferenceConstants.HOMEPAGE, + "about:home"); + mEditPrefs.commit(); + mHomepageText + .setText(getResources().getString( + R.string.action_homepage)); + break; + case 2: + mEditPrefs.putString( + PreferenceConstants.HOMEPAGE, + "about:blank"); + mEditPrefs.commit(); + mHomepageText.setText(getResources() + .getString(R.string.action_blank)); + break; + case 3: + mEditPrefs.putString( + PreferenceConstants.HOMEPAGE, + "about:bookmarks"); + mEditPrefs.commit(); + mHomepageText.setText(getResources() + .getString( + R.string.action_bookmarks)); + + break; + case 4: + homePicker(); + + break; } } }); diff --git a/src/acr/browser/lightning/SettingsController.java b/src/acr/browser/lightning/SettingsController.java index e450596..783aac3 100644 --- a/src/acr/browser/lightning/SettingsController.java +++ b/src/acr/browser/lightning/SettingsController.java @@ -4,14 +4,12 @@ package acr.browser.lightning; public class SettingsController { + static boolean clearHistory = false; /** - * The purpose of this class is so that - * I can clear the dropdown history in the main - * activities if the user selects to clear the - * history from the disk in advanced settings - * @param choice + * The purpose of this class is so that I can clear the dropdown history in the main activities if the user selects + * to clear the history from the disk in advanced settings */ static void setClearHistory(boolean choice) { clearHistory = choice; @@ -19,7 +17,6 @@ public class SettingsController { /** * return the choice - * @return */ static boolean getClearHistory() { if (clearHistory) { diff --git a/src/acr/browser/lightning/SpaceTokenizer.java b/src/acr/browser/lightning/SpaceTokenizer.java index f44264f..a6cfa56 100644 --- a/src/acr/browser/lightning/SpaceTokenizer.java +++ b/src/acr/browser/lightning/SpaceTokenizer.java @@ -40,7 +40,7 @@ public class SpaceTokenizer implements Tokenizer { @Override public CharSequence terminateToken(CharSequence text) { //int i = text.length(); - if(text.charAt(text.length()-1) != ' '){ + if (text.charAt(text.length() - 1) != ' ') { text = text + " "; } return text; diff --git a/src/acr/browser/lightning/Utils.java b/src/acr/browser/lightning/Utils.java index 60f75dc..8a2b642 100644 --- a/src/acr/browser/lightning/Utils.java +++ b/src/acr/browser/lightning/Utils.java @@ -3,18 +3,6 @@ */ package acr.browser.lightning; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.List; - import android.app.Activity; import android.app.AlertDialog; import android.content.Context; @@ -24,19 +12,26 @@ import android.util.Log; import android.webkit.URLUtil; import android.widget.Toast; +import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; + public class Utils { - - public static void downloadFile(final Activity activity, final String url, final String userAgent, final String contentDisposition, final boolean privateBrowsing){ + + public static void downloadFile(final Activity activity, final String url, final String userAgent, + final String contentDisposition, final boolean privateBrowsing) { String fileName = URLUtil.guessFileName(url, null, null); DownloadHandler.onDownloadStart(activity, url, userAgent, contentDisposition, null, privateBrowsing); Log.i(Constants.TAG, "Downloading" + fileName); } - + public static synchronized void addBookmark(Context context, String title, String url) { File book = new File(context.getFilesDir(), "bookmarks"); File bookUrl = new File(context.getFilesDir(), "bookurl"); - if((title.equals("Bookmarks")||title.equals("History"))&& url.startsWith("file://")){ + if ((title.equals("Bookmarks") || title.equals("History")) && url.startsWith("file://")) { return; } try { @@ -71,48 +66,46 @@ public class Utils { } catch (NullPointerException ignored) { } } - + public static Intent newEmailIntent(Context context, String address, String subject, String body, String cc) { Intent intent = new Intent(Intent.ACTION_SEND); - intent.putExtra(Intent.EXTRA_EMAIL, new String[] { address }); + intent.putExtra(Intent.EXTRA_EMAIL, new String[]{address}); intent.putExtra(Intent.EXTRA_TEXT, body); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_CC, cc); intent.setType("message/rfc822"); return intent; } - + public static void createInformativeDialog(Context context, String title, String message) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(title); builder.setMessage(message).setCancelable(true) - .setPositiveButton(context.getResources().getString(R.string.action_ok), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - } - }); + .setPositiveButton(context.getResources().getString(R.string.action_ok), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + } + }); AlertDialog alert = builder.create(); alert.show(); } - + public static void showToast(Context context, String message) { Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } - + /** * Returns the number of pixels corresponding to the passed density pixels - * @param context - * @param densityPixels - * @return */ public static int convertToDensityPixels(Context context, int densityPixels) { float scale = context.getResources().getDisplayMetrics().density; int pixels = (int) (densityPixels * scale + 0.5f); return pixels; } - + public static String getDomainName(String url) { URI uri; try { @@ -126,7 +119,7 @@ public class Utils { } return domain.startsWith("www.") ? domain.substring(4) : domain; } - + public static List getBookmarks(Context context) { List bookmarks = new ArrayList(); File bookUrl = new File(context.getFilesDir(), @@ -148,11 +141,11 @@ public class Utils { } return bookmarks; } - + public static String[] getArray(String input) { return input.split("\\|\\$\\|SEPARATOR\\|\\$\\|"); } - + public static void trimCache(Context context) { try { File dir = context.getCacheDir(); @@ -164,7 +157,7 @@ public class Utils { } } - + public static boolean deleteDir(File dir) { if (dir != null && dir.isDirectory()) { String[] children = dir.list(); diff --git a/src/acr/browser/lightning/WebAddress.java b/src/acr/browser/lightning/WebAddress.java index 2a8613b..8d87862 100644 --- a/src/acr/browser/lightning/WebAddress.java +++ b/src/acr/browser/lightning/WebAddress.java @@ -3,167 +3,179 @@ */ package acr.browser.lightning; - - -import static android.util.Patterns.GOOD_IRI_CHAR; - import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static android.util.Patterns.GOOD_IRI_CHAR; /** * {@hide} * * Web Address Parser * - * This is called WebAddress, rather than URL or URI, because it - * attempts to parse the stuff that a user will actually type into a - * browser address widget. + * This is called WebAddress, rather than URL or URI, because it attempts to parse the stuff that a user will actually + * type into a browser address widget. * - * Unlike java.net.uri, this parser will not choke on URIs missing - * schemes. It will only throw a ParseException if the input is - * really hosed. + * Unlike java.net.uri, this parser will not choke on URIs missing schemes. It will only throw a ParseException if the + * input is really hosed. * * If given an https scheme but no port, fills in port - * */ public class WebAddress { - private String mScheme; - private String mHost; - private int mPort; - private String mPath; - private String mAuthInfo; + private String mScheme; + + private String mHost; + + private int mPort; + + private String mPath; + + private String mAuthInfo; + + static final int MATCH_GROUP_SCHEME = 1; + + static final int MATCH_GROUP_AUTHORITY = 2; + + static final int MATCH_GROUP_HOST = 3; + + static final int MATCH_GROUP_PORT = 4; - static final int MATCH_GROUP_SCHEME = 1; - static final int MATCH_GROUP_AUTHORITY = 2; - static final int MATCH_GROUP_HOST = 3; - static final int MATCH_GROUP_PORT = 4; - static final int MATCH_GROUP_PATH = 5; + static final int MATCH_GROUP_PATH = 5; - static Pattern sAddressPattern = Pattern.compile( - /* scheme */ "(?:(http|https|file)\\:\\/\\/)?" + + static Pattern sAddressPattern = Pattern.compile( + /* scheme */ "(?:(http|https|file)\\:\\/\\/)?" + /* authority */ "(?:([-A-Za-z0-9$_.+!*'(),;?&=]+(?:\\:[-A-Za-z0-9$_.+!*'(),;?&=]+)?)@)?" + /* host */ "([" + GOOD_IRI_CHAR + "%_-][" + GOOD_IRI_CHAR + "%_\\.-]*|\\[[0-9a-fA-F:\\.]+\\])?" + /* port */ "(?:\\:([0-9]*))?" + /* path */ "(\\/?[^#]*)?" + /* anchor */ ".*", Pattern.CASE_INSENSITIVE); - /** parses given uriString. - * @throws Exception */ - public WebAddress(String address) throws Exception { - if (address == null) { - throw new NullPointerException(); - } - - // android.util.Log.d(LOGTAG, "WebAddress: " + address); - - mScheme = ""; - mHost = ""; - mPort = -1; - mPath = "/"; - mAuthInfo = ""; - - Matcher m = sAddressPattern.matcher(address); - String t; - if (m.matches()) { - t = m.group(MATCH_GROUP_SCHEME); - if (t != null) mScheme = t.toLowerCase(Locale.ROOT); - t = m.group(MATCH_GROUP_AUTHORITY); - if (t != null) mAuthInfo = t; - t = m.group(MATCH_GROUP_HOST); - if (t != null) mHost = t; - t = m.group(MATCH_GROUP_PORT); - if (t != null && t.length() > 0) { - // The ':' character is not returned by the regex. - try { - mPort = Integer.parseInt(t); - } catch (NumberFormatException ex) { - throw new Exception(); - } - } - t = m.group(MATCH_GROUP_PATH); - if (t != null && t.length() > 0) { + /** + * parses given uriString. + */ + public WebAddress(String address) throws Exception { + if (address == null) { + throw new NullPointerException(); + } + + // android.util.Log.d(LOGTAG, "WebAddress: " + address); + + mScheme = ""; + mHost = ""; + mPort = -1; + mPath = "/"; + mAuthInfo = ""; + + Matcher m = sAddressPattern.matcher(address); + String t; + if (m.matches()) { + t = m.group(MATCH_GROUP_SCHEME); + if (t != null) { + mScheme = t.toLowerCase(Locale.ROOT); + } + t = m.group(MATCH_GROUP_AUTHORITY); + if (t != null) { + mAuthInfo = t; + } + t = m.group(MATCH_GROUP_HOST); + if (t != null) { + mHost = t; + } + t = m.group(MATCH_GROUP_PORT); + if (t != null && t.length() > 0) { + // The ':' character is not returned by the regex. + try { + mPort = Integer.parseInt(t); + } catch (NumberFormatException ex) { + throw new Exception(); + } + } + t = m.group(MATCH_GROUP_PATH); + if (t != null && t.length() > 0) { /* handle busted myspace frontpage redirect with missing initial "/" */ - if (t.charAt(0) == '/') { - mPath = t; - } else { - mPath = "/" + t; - } - } - - } else { - // nothing found... outa here - throw new Exception(); - } + if (t.charAt(0) == '/') { + mPath = t; + } else { + mPath = "/" + t; + } + } + + } else { + // nothing found... outa here + throw new Exception(); + } /* Get port from scheme or scheme from port, if necessary and possible */ - if (mPort == 443 && mScheme.equals("")) { - mScheme = "https"; - } else if (mPort == -1) { - if (mScheme.equals("https")) - mPort = 443; - else - mPort = 80; // default - } - if (mScheme.equals("")) mScheme = "http"; - } - - @Override - public String toString() { - String port = ""; - if ((mPort != 443 && mScheme.equals("https")) || - (mPort != 80 && mScheme.equals("http"))) { - port = ":" + Integer.toString(mPort); - } - String authInfo = ""; - if (mAuthInfo.length() > 0) { - authInfo = mAuthInfo + "@"; - } - - return mScheme + "://" + authInfo + mHost + port + mPath; - } - - public void setScheme(String scheme) { - mScheme = scheme; - } - - public String getScheme() { - return mScheme; - } - - public void setHost(String host) { - mHost = host; - } - - public String getHost() { - return mHost; - } - - public void setPort(int port) { - mPort = port; - } - - public int getPort() { - return mPort; - } - - public void setPath(String path) { - mPath = path; - } - - public String getPath() { - return mPath; - } - - public void setAuthInfo(String authInfo) { - mAuthInfo = authInfo; - } - - public String getAuthInfo() { - return mAuthInfo; - } -} \ No newline at end of file + if (mPort == 443 && mScheme.equals("")) { + mScheme = "https"; + } else if (mPort == -1) { + if (mScheme.equals("https")) { + mPort = 443; + } else { + mPort = 80; // default + } + } + if (mScheme.equals("")) { + mScheme = "http"; + } + } + + @Override + public String toString() { + String port = ""; + if ((mPort != 443 && mScheme.equals("https")) || + (mPort != 80 && mScheme.equals("http"))) { + port = ":" + Integer.toString(mPort); + } + String authInfo = ""; + if (mAuthInfo.length() > 0) { + authInfo = mAuthInfo + "@"; + } + + return mScheme + "://" + authInfo + mHost + port + mPath; + } + + public void setScheme(String scheme) { + mScheme = scheme; + } + + public String getScheme() { + return mScheme; + } + + public void setHost(String host) { + mHost = host; + } + + public String getHost() { + return mHost; + } + + public void setPort(int port) { + mPort = port; + } + + public int getPort() { + return mPort; + } + + public void setPath(String path) { + mPath = path; + } + + public String getPath() { + return mPath; + } + + public void setAuthInfo(String authInfo) { + mAuthInfo = authInfo; + } + + public String getAuthInfo() { + return mAuthInfo; + } +} From de031977ce334c620610121333c9200280e49748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Sieradzki?= Date: Sat, 19 Jul 2014 17:32:26 +0200 Subject: [PATCH 3/9] Fix file name not matching class name --- .../lightning/{FetchMimeUrlType.java => FetchUrlMimeType.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/acr/browser/lightning/{FetchMimeUrlType.java => FetchUrlMimeType.java} (98%) diff --git a/src/acr/browser/lightning/FetchMimeUrlType.java b/src/acr/browser/lightning/FetchUrlMimeType.java similarity index 98% rename from src/acr/browser/lightning/FetchMimeUrlType.java rename to src/acr/browser/lightning/FetchUrlMimeType.java index 4d4e303..6155d2b 100644 --- a/src/acr/browser/lightning/FetchMimeUrlType.java +++ b/src/acr/browser/lightning/FetchUrlMimeType.java @@ -21,7 +21,7 @@ import java.io.IOException; * on a link or image and we don't know the mimetype. If the user just clicks on the link, we will do the same steps of * correcting the mimetype down in android.os.webkit.LoadListener rather than handling it here. */ -class FetchUrlMimeType extends Thread { +public class FetchUrlMimeType extends Thread { private Context mContext; From dafd6840966235a138906f1601a4e6d3d1d7ecb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Sieradzki?= Date: Sat, 19 Jul 2014 17:39:51 +0200 Subject: [PATCH 4/9] Clean up AdBlock class * use interface instead of concrete class * inline initialization of static variable * remove redundant field and variable initialization * replace single-character string with char --- src/acr/browser/lightning/AdBlock.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/acr/browser/lightning/AdBlock.java b/src/acr/browser/lightning/AdBlock.java index e5a679b..fd930ea 100644 --- a/src/acr/browser/lightning/AdBlock.java +++ b/src/acr/browser/lightning/AdBlock.java @@ -10,21 +10,19 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; +import java.util.SortedMap; import java.util.TreeMap; public class AdBlock { - private static TreeMap mAdBlockMap = null; + private static SortedMap mAdBlockMap = + new TreeMap(String.CASE_INSENSITIVE_ORDER); private SharedPreferences mPreferences; - private boolean mBlockAds = false; + private boolean mBlockAds; public AdBlock(Context context) { - if (mAdBlockMap == null) { - mAdBlockMap = new TreeMap( - String.CASE_INSENSITIVE_ORDER); - } if (mAdBlockMap.isEmpty()) { fillSearchTree(context); } @@ -68,7 +66,7 @@ public class AdBlock { if (!mBlockAds) { return false; } - String domain = ""; + String domain; try { domain = getDomainName(url); } catch (URISyntaxException e) { @@ -79,7 +77,7 @@ public class AdBlock { } private static String getDomainName(String url) throws URISyntaxException { - int index = url.indexOf("/", 8); + int index = url.indexOf('/', 8); if (index != -1) { url = url.substring(0, index); } From 0cf218018cbee17cff6b03f0d1caae6cdcbafab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Sieradzki?= Date: Sat, 19 Jul 2014 18:22:33 +0200 Subject: [PATCH 5/9] Clean up SettingsActivity and AdvancedSettingsActivity * field that are overwritten from every class instance SHOULD NOT be "static" * some field could and was converted to local variables * add missing "private" qualifier here and there * action bar may be null, added checking for this * remove wrapping all method body in try-catch, moved it to method call * removed redundant field and local variable initializations * single-char string replaced with char * redundant qualifiers ("SettingsActivity.this" etc.) was removed --- .../lightning/AdvancedSettingsActivity.java | 177 +++++++++--------- .../browser/lightning/SettingsActivity.java | 58 +++--- 2 files changed, 120 insertions(+), 115 deletions(-) diff --git a/src/acr/browser/lightning/AdvancedSettingsActivity.java b/src/acr/browser/lightning/AdvancedSettingsActivity.java index be7e3bd..0a16f67 100644 --- a/src/acr/browser/lightning/AdvancedSettingsActivity.java +++ b/src/acr/browser/lightning/AdvancedSettingsActivity.java @@ -3,6 +3,7 @@ */ package acr.browser.lightning; +import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; @@ -29,18 +30,14 @@ public class AdvancedSettingsActivity extends Activity { // mPreferences variables private static final int API = android.os.Build.VERSION.SDK_INT; - private static SharedPreferences mPreferences; + private SharedPreferences mPreferences; - private static SharedPreferences.Editor mEditPrefs; + private SharedPreferences.Editor mEditPrefs; - private static RelativeLayout r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, - r12, r13, r14, r15, rIncognitoCookies, rClearCache, - rSearchSuggestions, rClearHistoryExit, rClearCookiesExit; - - private static CheckBox cb1, cb2, cb3, cb4, cb5, cb6, cb7, cb8, cb9, cb10, + private CheckBox cb1, cb2, cb3, cb4, cb5, cb6, cb7, cb8, cb9, cb10, cb11, cbIncognitoCookies, cbSearchSuggestions, cbClearHistoryExit, cbClearCookiesExit; - private static Context mContext; + private Context mContext; private boolean mSystemBrowser; @@ -50,19 +47,26 @@ public class AdvancedSettingsActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.advanced_settings); - getActionBar().setHomeButtonEnabled(true); - getActionBar().setDisplayHomeAsUpEnabled(true); + + ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setHomeButtonEnabled(true); + actionBar.setDisplayHomeAsUpEnabled(true); + } + mPreferences = getSharedPreferences(PreferenceConstants.PREFERENCES, 0); if (mPreferences.getBoolean(PreferenceConstants.HIDE_STATUS_BAR, false)) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } + + // TODO WARNING: SharedPreferences.edit() without a corresponding commit() or apply() call mEditPrefs = mPreferences.edit(); + mSystemBrowser = mPreferences.getBoolean( PreferenceConstants.SYSTEM_BROWSER_PRESENT, false); mContext = this; initialize(); - } @Override @@ -71,7 +75,11 @@ public class AdvancedSettingsActivity extends Activity { return true; } - void initialize() { + private void initialize() { + + RelativeLayout r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, + r12, r13, r14, r15, rIncognitoCookies, rClearCache, + rSearchSuggestions, rClearHistoryExit, rClearCookiesExit; r1 = (RelativeLayout) findViewById(R.id.r1); r2 = (RelativeLayout) findViewById(R.id.r2); @@ -195,7 +203,7 @@ public class AdvancedSettingsActivity extends Activity { messageHandler = new MessageHandler(); } - static class MessageHandler extends Handler { + private class MessageHandler extends Handler { @Override public void handleMessage(Message msg) { @@ -215,10 +223,9 @@ public class AdvancedSettingsActivity extends Activity { } super.handleMessage(msg); } - } - static void cb1(CheckBox view) { + private void cb1(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -232,7 +239,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cb2(CheckBox view) { + private void cb2(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -246,7 +253,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cbClearHistoryExit(CheckBox view) { + private void cbClearHistoryExit(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -260,7 +267,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cbClearCookiesExit(CheckBox view) { + private void cbClearCookiesExit(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -274,7 +281,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cb3(CheckBox view) { + private void cb3(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -288,7 +295,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cb4(CheckBox view) { + private void cb4(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -301,7 +308,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cb5(CheckBox view) { + private void cb5(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -315,7 +322,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cb6(CheckBox view) { + private void cb6(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -328,7 +335,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cb7(CheckBox view) { + private void cb7(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -341,7 +348,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cb8(CheckBox view) { + private void cb8(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -355,7 +362,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cb9(CheckBox view) { + private void cb9(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -369,7 +376,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cb10(CheckBox view) { + private void cb10(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -383,7 +390,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cb11(CheckBox view) { + private void cb11(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -397,7 +404,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cbIncognitoCookies(CheckBox view) { + private void cbIncognitoCookies(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -411,7 +418,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void cbSearchSuggestions(CheckBox view) { + private void cbSearchSuggestions(CheckBox view) { view.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -424,7 +431,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r1(RelativeLayout view) { + private void r1(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -436,7 +443,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r2(RelativeLayout view) { + private void r2(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -448,7 +455,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void rClearHistoryExit(RelativeLayout view) { + private void rClearHistoryExit(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -460,7 +467,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void rClearCookiesExit(RelativeLayout view) { + private void rClearCookiesExit(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -472,7 +479,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r3(RelativeLayout view) { + private void r3(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -484,7 +491,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r4(RelativeLayout view) { + private void r4(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -502,7 +509,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r5(RelativeLayout view) { + private void r5(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -514,7 +521,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r6(RelativeLayout view) { + private void r6(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -526,7 +533,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r7(RelativeLayout view) { + private void r7(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -538,7 +545,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r8(RelativeLayout view) { + private void r8(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -586,7 +593,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r11(RelativeLayout view) { + private void r11(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -599,7 +606,7 @@ public class AdvancedSettingsActivity extends Activity { } - void r12(RelativeLayout view) { + private void r12(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -611,7 +618,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r13(RelativeLayout view) { + private void r13(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -622,7 +629,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r14(RelativeLayout view) { + private void r14(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -633,7 +640,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void r15(RelativeLayout view) { + private void r15(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -680,7 +687,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void rIncognitoCookies(RelativeLayout view) { + private void rIncognitoCookies(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -693,7 +700,7 @@ public class AdvancedSettingsActivity extends Activity { } - void rSearchSuggestions(RelativeLayout view) { + private void rSearchSuggestions(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -704,7 +711,7 @@ public class AdvancedSettingsActivity extends Activity { }); } - void rClearCache(RelativeLayout view) { + private void rClearCache(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -725,11 +732,10 @@ public class AdvancedSettingsActivity extends Activity { getResources().getString(R.string.message_cache_cleared)); } + @SuppressWarnings("deprecation") public void clearHistory() { - AdvancedSettingsActivity.this - .deleteDatabase(DatabaseHandler.DATABASE_NAME); - WebViewDatabase m = WebViewDatabase - .getInstance(AdvancedSettingsActivity.this); + deleteDatabase(DatabaseHandler.DATABASE_NAME); + WebViewDatabase m = WebViewDatabase.getInstance(this); m.clearFormData(); m.clearHttpAuthUsernamePassword(); if (API < 18) { @@ -739,11 +745,11 @@ public class AdvancedSettingsActivity extends Activity { if (mSystemBrowser) { try { Browser.clearHistory(getContentResolver()); - } catch (NullPointerException ignored) { + } catch (Exception ignored) { } } SettingsController.setClearHistory(true); - Utils.trimCache(AdvancedSettingsActivity.this); + Utils.trimCache(this); messageHandler.sendEmptyMessage(1); } @@ -754,21 +760,23 @@ public class AdvancedSettingsActivity extends Activity { messageHandler.sendEmptyMessage(2); } - void r9(RelativeLayout view) { + private void r9(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - - importFromStockBrowser(); - + try { + importFromStockBrowser(); + } catch (Exception e) { + // ignored exception + // TODO add logging + } } - }); } - void r10(RelativeLayout view) { + private void r10(RelativeLayout view) { view.setOnClickListener(new OnClickListener() { @Override @@ -811,41 +819,36 @@ public class AdvancedSettingsActivity extends Activity { public void importFromStockBrowser() { if (mSystemBrowser) { - try { - String[] proj = new String[]{Browser.BookmarkColumns.TITLE, - Browser.BookmarkColumns.URL}; - // use 0 for history, 1 for bookmarks - String sel = Browser.BookmarkColumns.BOOKMARK + " = 1"; - Cursor mCur; - mCur = getContentResolver().query(Browser.BOOKMARKS_URI, proj, - sel, null, null); - - String title = ""; - String url = ""; - int number = 0; - if (mCur.moveToFirst() && mCur.getCount() > 0) { - while (mCur.isAfterLast() == false) { - number++; - title = mCur.getString(mCur - .getColumnIndex(Browser.BookmarkColumns.TITLE)); - url = mCur.getString(mCur - .getColumnIndex(Browser.BookmarkColumns.URL)); - if (title.length() < 1) { - title = Utils.getDomainName(url); - } - Utils.addBookmark(mContext, title, url); - mCur.moveToNext(); + String[] proj = new String[]{Browser.BookmarkColumns.TITLE, + Browser.BookmarkColumns.URL}; + // use 0 for history, 1 for bookmarks + String sel = Browser.BookmarkColumns.BOOKMARK + " = 1"; + Cursor mCur; + mCur = getContentResolver().query(Browser.BOOKMARKS_URI, proj, + sel, null, null); + + String title, url; + int number = 0; + if (mCur.moveToFirst() && mCur.getCount() > 0) { + while (!mCur.isAfterLast()) { + number++; + title = mCur.getString(mCur + .getColumnIndex(Browser.BookmarkColumns.TITLE)); + url = mCur.getString(mCur + .getColumnIndex(Browser.BookmarkColumns.URL)); + if (title.length() < 1) { + title = Utils.getDomainName(url); } + Utils.addBookmark(mContext, title, url); + mCur.moveToNext(); } - Utils.showToast(mContext, number + " " - + getResources().getString(R.string.message_import)); - } catch (NullPointerException ignored) { } + Utils.showToast(mContext, number + " " + + getResources().getString(R.string.message_import)); } else { Utils.createInformativeDialog(mContext, getResources().getString(R.string.title_error), getResources().getString(R.string.dialog_import_error)); } } - } diff --git a/src/acr/browser/lightning/SettingsActivity.java b/src/acr/browser/lightning/SettingsActivity.java index c2bc201..efe51a1 100644 --- a/src/acr/browser/lightning/SettingsActivity.java +++ b/src/acr/browser/lightning/SettingsActivity.java @@ -4,6 +4,7 @@ package acr.browser.lightning; import android.annotation.SuppressLint; +import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; @@ -33,27 +34,25 @@ public class SettingsActivity extends Activity { private static int API = android.os.Build.VERSION.SDK_INT; - private static SharedPreferences.Editor mEditPrefs; + private SharedPreferences.Editor mEditPrefs; - private static int mAgentChoice; + private int mAgentChoice; - private static String mHomepage; + private String mHomepage; - private static TextView mAgentTextView; + private TextView mAgentTextView; - private static TextView mDownloadTextView; + private TextView mDownloadTextView; - private static int mEasterEggCounter = 0; + private int mEasterEggCounter; - private static String mSearchUrl; + private String mDownloadLocation; - private static String mDownloadLocation; + private TextView mHomepageText; - private static TextView mHomepageText; + private SharedPreferences mPreferences; - private static SharedPreferences mPreferences; - - private static TextView mSearchText; + private TextView mSearchText; private Context mContext; @@ -77,8 +76,12 @@ public class SettingsActivity extends Activity { @SuppressLint("NewApi") public void init() { // mPreferences storage - getActionBar().setHomeButtonEnabled(true); - getActionBar().setDisplayHomeAsUpEnabled(true); + ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setHomeButtonEnabled(true); + actionBar.setDisplayHomeAsUpEnabled(true); + } + mPreferences = getSharedPreferences(PreferenceConstants.PREFERENCES, 0); if (mPreferences.getBoolean(PreferenceConstants.HIDE_STATUS_BAR, false)) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, @@ -151,7 +154,7 @@ public class SettingsActivity extends Activity { PreferenceConstants.DOWNLOAD_DIRECTORY, Environment.DIRECTORY_DOWNLOADS); - mDownloadTextView.setText(Constants.EXTERNAL_STORAGE + "/" + mDownloadTextView.setText(Constants.EXTERNAL_STORAGE + '/' + mDownloadLocation); String code = "HOLO"; @@ -161,7 +164,7 @@ public class SettingsActivity extends Activity { getPackageName(), 0); code = p.versionName; } catch (NameNotFoundException e) { - // TODO Auto-generated catch block + // TODO add logging e.printStackTrace(); } @@ -341,13 +344,12 @@ public class SettingsActivity extends Activity { } public void searchUrlPicker() { - final AlertDialog.Builder urlPicker = new AlertDialog.Builder( - SettingsActivity.this); + final AlertDialog.Builder urlPicker = new AlertDialog.Builder(this); urlPicker.setTitle(getResources().getString(R.string.custom_url)); - final EditText getSearchUrl = new EditText(SettingsActivity.this); + final EditText getSearchUrl = new EditText(this); - mSearchUrl = mPreferences.getString(PreferenceConstants.SEARCH_URL, + String mSearchUrl = mPreferences.getString(PreferenceConstants.SEARCH_URL, Constants.GOOGLE_SEARCH); getSearchUrl.setText(mSearchUrl); urlPicker.setView(getSearchUrl); @@ -737,7 +739,7 @@ public class SettingsActivity extends Activity { agentStringPicker.setTitle(getResources().getString( R.string.title_user_agent)); - final EditText getAgent = new EditText(SettingsActivity.this); + final EditText getAgent = new EditText(this); agentStringPicker.setView(getAgent); agentStringPicker.setPositiveButton( getResources().getString(R.string.action_ok), @@ -768,7 +770,7 @@ public class SettingsActivity extends Activity { mDownloadLocation = mPreferences.getString( PreferenceConstants.DOWNLOAD_DIRECTORY, Environment.DIRECTORY_DOWNLOADS); - int n = -1; + int n; if (mDownloadLocation.contains(Environment.DIRECTORY_DOWNLOADS)) { n = 1; } else { @@ -791,7 +793,7 @@ public class SettingsActivity extends Activity { mEditPrefs.commit(); mDownloadTextView .setText(Constants.EXTERNAL_STORAGE - + "/" + + '/' + Environment.DIRECTORY_DOWNLOADS); break; case 2: @@ -822,7 +824,7 @@ public class SettingsActivity extends Activity { mActivity); homePicker.setTitle(getResources().getString( R.string.title_custom_homepage)); - final EditText getHome = new EditText(SettingsActivity.this); + final EditText getHome = new EditText(this); mHomepage = mPreferences.getString(PreferenceConstants.HOMEPAGE, Constants.HOMEPAGE); if (!mHomepage.startsWith("about:")) { @@ -854,7 +856,7 @@ public class SettingsActivity extends Activity { LinearLayout layout = new LinearLayout(this); downLocationPicker.setTitle(getResources().getString( R.string.title_download_location)); - final EditText getDownload = new EditText(SettingsActivity.this); + final EditText getDownload = new EditText(this); getDownload.setBackgroundResource(0); mDownloadLocation = mPreferences.getString( PreferenceConstants.DOWNLOAD_DIRECTORY, @@ -873,7 +875,7 @@ public class SettingsActivity extends Activity { TextView v = new TextView(this); v.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); v.setTextColor(Color.DKGRAY); - v.setText(Constants.EXTERNAL_STORAGE + "/"); + v.setText(Constants.EXTERNAL_STORAGE + '/'); v.setPadding(padding, padding, 0, padding); layout.addView(v); layout.addView(getDownload); @@ -896,7 +898,7 @@ public class SettingsActivity extends Activity { PreferenceConstants.DOWNLOAD_DIRECTORY, text); mEditPrefs.commit(); mDownloadTextView.setText(Constants.EXTERNAL_STORAGE - + "/" + text); + + '/' + text); } }); downLocationPicker.show(); @@ -911,7 +913,7 @@ public class SettingsActivity extends Activity { picker.setTitle(getResources().getString(R.string.home)); mHomepage = mPreferences.getString( PreferenceConstants.HOMEPAGE, Constants.HOMEPAGE); - int n = -1; + int n; if (mHomepage.contains("about:home")) { n = 1; } else if (mHomepage.contains("about:blank")) { From a3080175f33bda6afc1e3f37e79597905572e1c5 Mon Sep 17 00:00:00 2001 From: Anthony Restaino Date: Sun, 20 Jul 2014 19:23:35 -0400 Subject: [PATCH 6/9] removed useless layout params --- res/layout/advanced_settings.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/res/layout/advanced_settings.xml b/res/layout/advanced_settings.xml index f86e352..e040133 100644 --- a/res/layout/advanced_settings.xml +++ b/res/layout/advanced_settings.xml @@ -625,8 +625,6 @@ Date: Sun, 20 Jul 2014 19:58:19 -0400 Subject: [PATCH 7/9] Note on intent utils --- src/acr/browser/lightning/IntentUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/acr/browser/lightning/IntentUtils.java b/src/acr/browser/lightning/IntentUtils.java index b1072dc..a08e29d 100644 --- a/src/acr/browser/lightning/IntentUtils.java +++ b/src/acr/browser/lightning/IntentUtils.java @@ -90,6 +90,10 @@ public class IntentUtils { // Error on the side of staying in the browser, ignore continue; } + // NOTICE: Use of && instead of || will cause the browser + // to launch a new intent for every URL, using OR only + // launches a new one if there is a non-browser app that + // can handle it. if (filter.countDataAuthorities() == 0 || filter.countDataPaths() == 0) { // Generic handler, skip From fbd74df4229ce661b156dfe59b9ebd29d7eb87b7 Mon Sep 17 00:00:00 2001 From: Anthony Restaino Date: Sun, 20 Jul 2014 20:08:12 -0400 Subject: [PATCH 8/9] Improved comment readability in IDE editor --- src/acr/browser/lightning/WebAddress.java | 46 ++++++++++++----------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/acr/browser/lightning/WebAddress.java b/src/acr/browser/lightning/WebAddress.java index 8d87862..2823d60 100644 --- a/src/acr/browser/lightning/WebAddress.java +++ b/src/acr/browser/lightning/WebAddress.java @@ -11,15 +11,15 @@ import static android.util.Patterns.GOOD_IRI_CHAR; /** * {@hide} - * + * * Web Address Parser - * - * This is called WebAddress, rather than URL or URI, because it attempts to parse the stuff that a user will actually - * type into a browser address widget. - * - * Unlike java.net.uri, this parser will not choke on URIs missing schemes. It will only throw a ParseException if the - * input is really hosed. - * + * + * This is called WebAddress, rather than URL or URI, because it attempts to + * parse the stuff that a user will actually type into a browser address widget. + * + * Unlike java.net.uri, this parser will not choke on URIs missing schemes. It + * will only throw a ParseException if the input is really hosed. + * * If given an https scheme but no port, fills in port */ public class WebAddress { @@ -44,13 +44,14 @@ public class WebAddress { static final int MATCH_GROUP_PATH = 5; - static Pattern sAddressPattern = Pattern.compile( - /* scheme */ "(?:(http|https|file)\\:\\/\\/)?" + - /* authority */ "(?:([-A-Za-z0-9$_.+!*'(),;?&=]+(?:\\:[-A-Za-z0-9$_.+!*'(),;?&=]+)?)@)?" + - /* host */ "([" + GOOD_IRI_CHAR + "%_-][" + GOOD_IRI_CHAR + "%_\\.-]*|\\[[0-9a-fA-F:\\.]+\\])?" + - /* port */ "(?:\\:([0-9]*))?" + - /* path */ "(\\/?[^#]*)?" + - /* anchor */ ".*", Pattern.CASE_INSENSITIVE); + static Pattern sAddressPattern = Pattern + .compile( + /* scheme */"(?:(http|https|file)\\:\\/\\/)?" + + /* authority */"(?:([-A-Za-z0-9$_.+!*'(),;?&=]+(?:\\:[-A-Za-z0-9$_.+!*'(),;?&=]+)?)@)?" + + /* host */"([" + GOOD_IRI_CHAR + "%_-][" + GOOD_IRI_CHAR + "%_\\.-]*|\\[[0-9a-fA-F:\\.]+\\])?" + + /* port */"(?:\\:([0-9]*))?" + + /* path */"(\\/?[^#]*)?" + + /* anchor */".*", Pattern.CASE_INSENSITIVE); /** * parses given uriString. @@ -94,8 +95,10 @@ public class WebAddress { } t = m.group(MATCH_GROUP_PATH); if (t != null && t.length() > 0) { - /* handle busted myspace frontpage redirect with - missing initial "/" */ + /* + * handle busted myspace frontpage redirect with missing initial + * "/" + */ if (t.charAt(0) == '/') { mPath = t; } else { @@ -108,8 +111,9 @@ public class WebAddress { throw new Exception(); } - /* Get port from scheme or scheme from port, if necessary and - possible */ + /* + * Get port from scheme or scheme from port, if necessary and possible + */ if (mPort == 443 && mScheme.equals("")) { mScheme = "https"; } else if (mPort == -1) { @@ -127,8 +131,8 @@ public class WebAddress { @Override public String toString() { String port = ""; - if ((mPort != 443 && mScheme.equals("https")) || - (mPort != 80 && mScheme.equals("http"))) { + if ((mPort != 443 && mScheme.equals("https")) + || (mPort != 80 && mScheme.equals("http"))) { port = ":" + Integer.toString(mPort); } String authInfo = ""; From 93860a3efa709f53e025d7c8d8c984063f513e8d Mon Sep 17 00:00:00 2001 From: DF1E Date: Mon, 21 Jul 2014 08:38:37 +0200 Subject: [PATCH 9/9] fix spelling in german string --- res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 2849c20..8d6f1a4 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -160,7 +160,7 @@ Der Werbeblocker ist nur in Lightning Browser+ verfügbar und kann im Google Play Store gekauft werden! Orbot aktivieren Orbot ist installiert. Soll Tor verwendet werden? - Um Tor verwenden zu können, muß Orbot installiert sein! + Um Tor verwenden zu können, muss Orbot installiert sein! Ja Nein Cookies beim Beenden löschen